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

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

ただいまの
回答率

88.92%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,333

nuiri1343

score 54

前提・実現したいこと

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

該当のソースコード

import java.awt.*;
import java.applet.*;

public class Main extends Applet implements Runnable{
 Thread thread = null; 
 public void init(){
  this.thread = new Thread(this);
  this.thread.start();
 }

 public void run(){
  while(true){
   String s = new java.util.Scanner(System.in).nextLine();
   if(s.equals("exit")) break;
  }
 }
}

質問

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

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

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

以下編集しました。

編集後のソースコード

import java.awt.*;
import java.applet.*;

public class Main extends Applet implements Runnable{
    Thread thread = null; 
    public void init(){
    this.thread = new Thread(this);
    this.thread.start();
    }

    public void run(){
    while(true){
        String s = new java.util.Scanner(System.in).nextLine();
        if(s.equals("exit")) break;
    }
    System.exit(0); //exitと入力され、runメソッドが終わると言うときに、プログラムを終了したいです。プログラムの終了方法について、ウィンドウの×ボタンを押した時と同じ動作になればいいと思っています。
    }

    public void stop(){
    }
    public void destroy(){
    }

}

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

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)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • masaya_ohashi

    2017/04/21 15:58

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

    キャンセル

  • nuiri1343

    2017/04/21 16:03

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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


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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/21 12:08

    このプログラムはappletviewerによる実行のためのものを考えているので標準入力にしただけです。
    今回聞きたいのはプログラムの終了方法です。

    そのSystem.exit(0)をどこにかけばいいのでしょうか?
    runメソッドの最後に書くとエラーが出てしまいます。
    これもなぜだかわかりませんが

    キャンセル

  • 2017/04/21 12:23

    appletviewerは単にアプレットのデバッグ目的でブラウザーをエミュレーターするためのものなので、結局同じことなんですよ?アプレットで標準入力を使うことはどうやって動かしたとしても適切とはいえないと思います。

    それはともかく、System.exit(0)は「プログラムを終了させたいとき」にやればとりあえず大丈夫です。たとえば

    if(s.equals("exit")) {
    System.exit(0);
    }

    > これもなぜだかわかりませんが

    まずはエラーメッセージの中身を理解する努力をしましょう…なのですが、最初は難しいと思います。しかし、どうコーディングし、どこでどんなメッセージが出たか具体的に書かないと閲覧者に伝わらないことを覚えておいてくださいね。

    キャンセル

  • 2017/04/21 15:22

    ごめんなさい言い方が悪かったです。
    今回聞きたいのは、プログラムの終了の仕方で、
    その質問がしやすいように、上記のコードを書いたので
    実際に使用する時は標準入力から受け取るわけではないです。

    runメソッドのwhileループの外側にSystem.exit(0)を書いた場合、
    exitが入力されるとエラーが出てしまい、
    エラーコードは、

    Exception in thread "Thread-3" java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "exitVM.0")

    こんなのでした。
    理解できるよう努力してみましたがお手上げです
    英語自体も苦手なので・・・><

    これはなぜ出るのでしょうか?
    また、これを出さないためにはどうすればいいのでしょうか?

    キャンセル

  • 2017/04/21 17:48

    > 実際に使用する時は標準入力から受け取るわけではない
    あ、そうでしたか。察しが悪くてスミマセン

    エラーはセキュリティー例外なのですが、これは自分の回答が間違っていました!回答を修正します。申し訳ないです。

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る