質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

Q&A

解決済

1回答

747閲覧

javaアップレットで、exitと入力されたらプログラムを終了したい

nuiri1343

総合スコア54

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

0グッド

0クリップ

投稿2017/04/20 10:18

編集2017/04/21 07:10

###前提・実現したいこと
javaアップレットを実行中に、標準入力よりexitという入力があったらプログラムを終了するプログラムが書きたいです。

###該当のソースコード

java

1import java.awt.*; 2import java.applet.*; 3 4public class Main extends Applet implements Runnable{ 5 Thread thread = null; 6 public void init(){ 7 this.thread = new Thread(this); 8 this.thread.start(); 9 } 10 11 public void run(){ 12 while(true){ 13 String s = new java.util.Scanner(System.in).nextLine(); 14 if(s.equals("exit")) break; 15 } 16 } 17} 18

###質問
上記のプログラムで、もしexitと標準入力で打ち込んでも
プログラムは終了してくれません

どうしたら終了してくれるようになるでしょうか?

ネットで色々調べてみたのですが、
run()を抜ければ消滅するというように書いてあるサイトが多く、
自分のはどうしてプログラムが終了しないのかよく分かりません。
どうしたらいいでしょうか?

###以下編集しました。
###編集後のソースコード

java

1import java.awt.*; 2import java.applet.*; 3 4public class Main extends Applet implements Runnable{ 5 Thread thread = null; 6 public void init(){ 7 this.thread = new Thread(this); 8 this.thread.start(); 9 } 10 11 public void run(){ 12 while(true){ 13 String s = new java.util.Scanner(System.in).nextLine(); 14 if(s.equals("exit")) break; 15 } 16 System.exit(0); //exitと入力され、runメソッドが終わると言うときに、プログラムを終了したいです。プログラムの終了方法について、ウィンドウの×ボタンを押した時と同じ動作になればいいと思っています。 17 } 18 19 public void stop(){ 20 } 21 public void destroy(){ 22 } 23 24} 25

###発生している問題・エラーメッセージ

Exception in thread "Thread-3" java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "exitVM.0") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:372) at java.security.AccessController.checkPermission(AccessController.java:559) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.SecurityManager.checkExit(SecurityManager.java:761) at java.lang.Runtime.exit(Runtime.java:107) at java.lang.System.exit(System.java:962) at Main.run(Main.java:16) at java.lang.Thread.run(Thread.java:745)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaya_ohashi

2017/04/21 06:58

プログラムの終了とはどういう状況を指していますか?アプレット単独で動いている場合はウィンドウのクローズだと思いますが、ブラウザ埋め込みだとタブを閉じるということですか?
nuiri1343

2017/04/21 07:03

今回自分が作っているプログラムでは、appletviewerでの使用しか考えていないので、アップレット単独で動いていて、そのウィンドウをクローズするメソッドなどが存在しないのでしょうか?という感じです。
guest

回答1

0

ベストアンサー

訂正:最初の回答でSystem.exit(0)でアプリケーションを終えるというのは自分の間違いでした。大変失礼しました。

アプレットがブラウザー上で実行されるものであるため、いくつかの機能に制限が設けられていて、そうした機能を使うとセキュリティー例外が起きます。System.exit(0)もそういう制限機能の一つということなので、自分は「アプレットではやってはいけないこと」を回答してしまいました。

調べたみたところ、「アプリケーションを終了させる」ということ自体がアプレットにはできないと考えるのが正しそうです。アプレットはブラウザー画面の一部を構成する部品として使われるためのものなので、アプリケーションとしてのライフサイクルはあくまでユーザーの操作によって支配されということなのだと思います。つまり表示中のHTMLドキュメントやその上に表示されるアプレットが終了する(=消える)のは、別の画面へ遷移させたときかユーザが画面を閉じたときにブラウザーに「終了せよ」と指示させることにより自然に消えるということだと思います。


スレッドの実行の完了という意味ではThread#runメソッドの実行完了=スレッドの実行完了ですが、それはアプリケーションの終了と同義ではありません。アプリケーションは複数のスレッドで実行されているものですので。

アプリケーションを完了させるのはSystem.exit(0)などとすればよいのではないでしょうか。そうすればアプリケーションの実行にかかわる全てのスレッドが完了=アプリケーションの終了になると思います。

なお、アプレットはブラウザー上で実行する前提のもので、そこに「標準入力」という概念はないと思います。少なくともアプレットとしての普通の振る舞いを考えるなら「アプレット上に用意した何らかの画面コンポーネント上へのユーザーアクション」により振る舞いを決めるべきではないでしょうか?

投稿2017/04/20 10:49

編集2017/04/25 04:47
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nuiri1343

2017/04/21 03:08

このプログラムはappletviewerによる実行のためのものを考えているので標準入力にしただけです。 今回聞きたいのはプログラムの終了方法です。 そのSystem.exit(0)をどこにかけばいいのでしょうか? runメソッドの最後に書くとエラーが出てしまいます。 これもなぜだかわかりませんが
KSwordOfHaste

2017/04/21 03:23

appletviewerは単にアプレットのデバッグ目的でブラウザーをエミュレーターするためのものなので、結局同じことなんですよ?アプレットで標準入力を使うことはどうやって動かしたとしても適切とはいえないと思います。 それはともかく、System.exit(0)は「プログラムを終了させたいとき」にやればとりあえず大丈夫です。たとえば if(s.equals("exit")) { System.exit(0); } > これもなぜだかわかりませんが まずはエラーメッセージの中身を理解する努力をしましょう…なのですが、最初は難しいと思います。しかし、どうコーディングし、どこでどんなメッセージが出たか具体的に書かないと閲覧者に伝わらないことを覚えておいてくださいね。
nuiri1343

2017/04/21 06:22

ごめんなさい言い方が悪かったです。 今回聞きたいのは、プログラムの終了の仕方で、 その質問がしやすいように、上記のコードを書いたので 実際に使用する時は標準入力から受け取るわけではないです。 runメソッドのwhileループの外側にSystem.exit(0)を書いた場合、 exitが入力されるとエラーが出てしまい、 エラーコードは、 Exception in thread "Thread-3" java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "exitVM.0") こんなのでした。 理解できるよう努力してみましたがお手上げです 英語自体も苦手なので・・・>< これはなぜ出るのでしょうか? また、これを出さないためにはどうすればいいのでしょうか?
KSwordOfHaste

2017/04/21 08:48

> 実際に使用する時は標準入力から受け取るわけではない あ、そうでしたか。察しが悪くてスミマセン エラーはセキュリティー例外なのですが、これは自分の回答が間違っていました!回答を修正します。申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問