11603


javaの例外処理について理解できないのですが、例外処理について書く理由、役割といったのがいまいちわかりません。

[code]

    class ThreadX extends Thread{
    　　　public void run(){
        　　　try{
            　　　while(true){
                　　Thread.sleep(2000);
                　　System.out.println("hello");
            　　　}
        　　　}
        　　　catch(InterruptedException ex){
            　　　ex.printStackTrace();
        　　　}
    　　　}
    }
    class ThreadDemo1{
        public static void main(String args[]){
            ThreadX tx = new ThreadX();
            tx.start();
        }
    }
    
[/code]

といったコードを実行したところ2000ミリ秒まってからhelloというのがでますが、

[code]

      class ThreadX extends Thread{
    　　　　public void run(){
            　　　while(true){
                　　　Thread.sleep(2000);
                　　　System.out.println("hello");
            　　　}
        　　　}
    　　　}
    　　　class ThreadDemo1{
        　　　public static void main(String args[]){
            　　ThreadX tx = new ThreadX();
            　　　tx.start();
        　　}
    　　　}
    
[/code]

として実行しようとしましたが例外処理コード（try/catch)を書かないとできませんといわれました。  
実際に例外処理を行っているのかと考えてみて正しいかわかりませんが

[code]

    class ThreadX extends Thread{
        public void run(){
            try{
                while(true){
                    Thread.sleep(2000);
                    System.out.println("hello");
                }
            }
            catch(InterruptedException ex){
                System.out.println("Bye");
                ex.printStackTrace();
            }
        }
    }
    class ThreadDemo1{
        public static void main(String args[]){
            ThreadX tx = new ThreadX();
            tx.start();
        }
    }
    
[/code]

と System.out.println("Bye");を記述してみて例外処理が行われるならBYEが表示されると考えやってみたのですが表示されません。  
これは例外処理が行われてないため表示されなかったのでしょうか。それともやり方が間違っていたのでしょうか。また例外処理が行われていなかったのにどうして必要となのか。  
また

[code]

    class sample1{
        public static void main(String args[]){
            int i = 0;
            int s = 0;
            System.out.println("S / i = " + i / s);
        }
    }
    
[/code]

こちらは実行できるのにエラーがでます。0÷0
といったものができないためでるのはわかりますが明らかなエラープログラムにもかかわらず例外処理プログラム？を書けといわれませんでした。  
また書かれているコードなどをみると例外処理はIf関数のようなもののようにみえたのですがそれと似たものととらえてもいいのでしょうか。  
よろしくお願い致します。


CC BY-SA 3.0
2015-06-22T05:34:26.777
11599
2015-06-23T01:13:36.800
2015-06-22T12:43:21.910
10197
10197
question
java
javaの例外処理について理解できません。


言語仕様に関してのごく簡単なご質問が続いていると思われますが、例えばこちらのサイトなど参考にされてはいかがでしょうか。

<http://www.javaroad.jp/java_exception2.htm>

ちなみに、InterruptedExceptionについては、どういった時に発生するのかを調べていただくとお、例外への理解が深まると思います。


CC BY-SA 3.0
2015-06-22T05:56:10.663
11600
2015-06-22T05:56:10.663
5778
11599
answer


> 例外処理が行われてないため表示されなかったのでしょうか

そうです。このケースでは `InterruptedException` は発生していません。なので該当コードは実行されなかったのです。

> 0÷0 といったものができないためでるのはわかりますが明らかなエラープログラムにもかかわらず例外処理プログラム？を書けといわれませんでした

非常に大雑把に説明すると、Javaには2種類の例外が存在します。

1つは
[`Exception`](http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html)
から派生した **通常の例外** で、`throws` に記述されており、かならず `try`/`catch` する必要があります。例えば
[`Thread#sleep`](http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#sleep-
long-) の説明を見ると、以下のように書かれているために、最初のコードのように `InterruptedException` を `catch`
する必要が生じます。

[code]

    public static void sleep(long millis)
                      throws InterruptedException
    
[/code]

Javaのもう1種類の例外は
[`RuntimeException`](http://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html)
といいます。この `RuntimeException`と、それから派生した例外クラスについては `throws` に書く必要はなく、また明示的に
`try`/`catch` する必要もありません。 `n ÷ 0` を実行した際に発生する
[`ArithmeticException`](http://docs.oracle.com/javase/8/docs/api/java/lang/ArithmeticException.html)
は、この `RuntimeException` の派生クラスであるため、明示的に `catch` を書かなくても、文句は言われません。


CC BY-SA 3.0
2015-06-22T07:50:39.600
11603
2015-06-22T07:50:39.600
208
11599
answer


例外処理はどうして必要か？という質問に見えましたので  
その観点から回答させて頂きます。

例えばファイルを開く処理があります。

[code]

    import java.io.*;
    
    public class FileOpenClass {
      public static void main(String args[]) {
        try{
          File fl = new File("test.txt");
          fl.createNewFile();     
        }catch(IOException e){
          // 例外をユーザーに通知
          System.out.println(e + "例外が発生しました");
        }
      }
    }
    
[/code]

ファイルを開く処理は、そのファイルが存在しない、権限がない、ロックされている  
など様々な理由で失敗することがあります。  
そのエラー理由をユーザーに通知して改善を促すためにあると便利です。

そして、その後の処理がファイルを開けたことありきのコードであった場合、  
そこまでコードが走るとエラーとなってしまうため、それを止めるためにも  
例外処理は便利に使えます。

初心者のうちは例外処理はIFとGOTOの組み合わせたようなものと捉えてもらって構わないと思います。


CC BY-SA 3.0
2015-06-23T01:13:36.800
11624
2015-06-23T01:13:36.800
8239
11599
answer