報告されていない例外をキャッチするか、スローするように宣言する必要がある
Java は、オブジェクト指向で厳密に型指定され、コンパイルされた言語であり、継承やポリモーフィズムなど、プログラミングのさまざまな側面を活用するためのクラスの概念があります。 また、高度にネストされた関数による例外処理の優れたサポートでもあります。
この記事では、Java での報告されていない例外をキャッチするか、スローするように宣言する必要がありますというコンパイル時エラーについて説明します。
Java エラー 未報告の例外をキャッチするか、スローするように宣言する必要があります
次のコード サンプルを検討してください。
public class MyApp {
  public static void main(String[] args) {
    System.out.println("Hello World");
    System.out.println(divide(3, 0));
  }
  public static int divide(int a, int b) throws Exception {
    int c = a / b;
    return c;
  }
}
上記サンプルコードをjavac MyApp.javaでコンパイルすると以下のエラーが発生します。
MyApp.java:7: error: unreported exception Exception; must be caught or declared to be thrown
        System.out.println(divide(3,0));
                                 ^
1 error
では、ここで何が起こっているのでしょうか?
関数 divide(int a, int b) は、main(String[] args) である呼び出し関数のどこにもキャッチまたは処理されない Exception をスローします。 例外を処理するか、呼び出し元の関数に同じ例外をスローさせることで解決できます。
Java の呼び出し関数で例外を処理する
したがって、前のセクションでは、これはエラーを解決するためのアプローチの 1つです。 上記のコードサンプルを考慮した例で理解してみましょう。
public class MyApp {
  public static void main(String[] args) {
    System.out.println("Hello World");
    try {
      System.out.println(divide(3, 0));
    } catch (Exception e) {
      System.out.println("Division by zero !!!");
    }
  }
  public static int divide(int a, int b) throws Exception {
    int c = a / b;
    return c;
  }
}
コードをコンパイルしようとすると、正常にコンパイルされ、コードの実行時に次の出力が取得されます。
Hello World
Division by zero !!!
したがって、例外は main メソッドで処理され、catch ブロックの print ステートメントが実行されます。
呼び出し関数が Java で同じ例外をスローするようにする
したがって、他のアプローチは、呼び出し元の関数にも同じ例外をスローさせることです。 それを実現する方法の例を見てみましょう。
public class MyApp {
  public static void main(String[] args) throws Exception {
    System.out.println("Hello World");
    try {
      performOperation();
    } catch (Exception e) {
      System.out.println("Division by zero!!");
    }
  }
  public static void performOperation() throws Exception {
    divide(3, 0);
  }
  public static int divide(int a, int b) throws Exception {
    int c = a / b;
    return c;
  }
}
そのため、前の例に追加の関数 performOperation() を間に追加しました。 performOperation() 関数も divide(int a, int b); と同じ Exception をスローするようにしました。 したがって、正常にコンパイルされ、同じ出力が得られます。
