javaの例外処理について理解できません。


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関数のようなもののようにみえたのですがそれと似たものととらえてもいいのでしょうか。  
よろしくお願い致します。




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

そうです。このケースでは `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` を書かなくても、文句は言われません。




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

そうです。このケースでは `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` を書かなくても、文句は言われません。

