Javaの例外は、チェック例外とチェックなし例外の2種類に分けられます。別名は例外とエラーです。
簡単に言えば、チェックされた例外は実行中に回復できますが、チェックされていない例外は処理できないエラーです。
チェック例外:
は無効であり、プログラム内で予測できないことを意味します。たとえば、無効なユーザー入力、ファイルが存在しない、ネットワークまたはデータベースのリンク エラーなどです。これらはすべて外部的な理由であり、プログラム内で制御することはできません。
コードで明示的に処理する必要があります。たとえば、try-catch ブロック処理、または呼び出しスタックの上位層に例外をスローするメソッドに throws 記述を追加します。
java.lang.Exception から継承します (java.lang.RuntimeException を除く)。
未チェック例外:
はプログラム内のエラー、論理エラーを示します。 IllegalArgumentException、NullPointerException、IllegalStateException などの RuntimeException のサブクラスです。
未チェックの例外を処理するためにコード内で明示的にキャッチする必要はありません。
java.lang.RuntimeException から継承します (および java.lang.RuntimeException は java.lang.Exception から継承します)。
Java のチェックされた例外は、コード内で try-catch によって明示的にキャッチされるか、再スローされる必要があります。この種の例外には、いくつかの欠点があります。しかし、多くの人は空の catch ブロックをコード内に直接記述することに慣れています。これにより、コードが冗長で「醜い」ものになるだけでなく、デバッグに問題が生じ、コードのメンテナンスが困難になります。そのため、チェックを行うとコードが冗長になり、空の catch ブロックは無意味になるため、チェック例外を Java 標準から削除する必要があると言う人もいます。たとえば、C# にはチェック例外の概念がなく、C# は明示的なキャッチを強制しません。例外。
Java 例外がこれら 2 つのタイプに分類される理由は、次の考慮事項によるものです。
チェック例外は、どのメソッドが例外をスローする可能性があるかを Java の API ですでに説明されているため、開発者が例外を引き起こす可能性があることを認識するのに役立ちます。 。処理されない場合、コンパイルは成功しません。このアプローチにより、プログラム内のエラーをある程度回避できます。
2 つの簡単な例
チェック例外
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; public class Main { public static void main(String[] args) { File f = new File("C:\test.txt"); FileReader r = new FileReader(f); //A BufferedReader br = new BufferedReader(r); br.readLine(); //B br.close(); //C } }
行 A、B、C が IOException をスローするため、このコードはコンパイルできません。このコードは try-catch ブロックに入れるか、 throws IOException をコンパイルするメインメソッド。
2. 未チェック例外
public class Main { public static void main(String[] args) { int a = 0; int b = 100; int c = b/a; } }
はコンパイル可能ですが、実行中にエラーが報告されます
Exception in thread “main” java.lang.ArithmeticException: / by zero at Main.main(Main.java:13)
ArithmeticException は未チェック例外です。
カスタム例外
1. チェックされた例外
カスタム例外クラス InvalidUrlException
public class InvalidUrlException extends Exception { public InvalidUrlException(String s){ super(s); } }
public class Main { public static void getRemoteData(String url) throws InvalidUrlException{ if(isValidUrl(url)){ //获取远程数据 } else throw new InvalidUrlException("Invalid URL: " + url); } public static boolean isValidUrl(String url){ .... //验证URL是否有效 } public static void main(String[] args) { getRemoteData(args[0]); } }
main メソッドで getRemoteData を呼び出す場合、2 つの方法があります。1 つは try-catch で、もう 1 つはメインの throws InvalidUrlException に直接追加する方法です。 。
2. 未チェック例外
InvalidUrlException を変更して RuntimeException
public class InvalidUrlException extends Exception { public InvalidUrlException(String s){ super(s); } }
を拡張する場合、main は throw や try-catch を追加する必要はありません。
チェックされた例外またはチェックされていない例外を選択しますか?
一部の Java 書籍では、すべての回復可能な例外にはチェック例外ハンドラーを使用し、回復不可能なエラーには非チェック例外ハンドラーを使用することを推奨しています。ただし、実際には、RuntimeException から継承された Java 例外のほとんどは、プログラム内で回復することもできます。たとえば、NullPointerException、IllegalArgumentExceptions、0 による除算例外などは、プログラムの実行を継続できるようにキャプチャおよび処理できます。プログラムの実行が中断されるのは、起動時の構成ファイルの読み取りなどの特殊な状況のみです。構成ファイルが存在しない場合や重大なエラーが発生した場合は、プログラムを終了する必要があります。
以下は、チェック例外に対する賛否のいくつかの議論です:
開発者が常に例外を処理することを忘れないように、コンパイラは非チェック例外を強制的にキャッチまたはスローします。
チェックされた例外をスローするメソッドは、throws をメソッドまたはインターフェイスの一部として宣言する必要があるため、メソッド例外を追加または変更するときに後続のバージョンに不便が生じます。
チェックされていない例外は明示的に処理する必要はありませんが、例外処理が困難になります。
チェック例外メソッドを呼び出すときは、このメソッドの例外を処理する必要があるため、上位の呼び出し側コードがわかりにくくなります。
チェックを入れるかチェックを外すかを決めるのはあなた次第ですが、どちらが確実に正しいか、またその逆を判断するのは困難です。現在人気のある言語の中で、チェック例外をサポートしているのは Java だけのようで、他の言語は非チェック例外しかサポートしていません。
上記は Java のチェック済み例外とチェックなし例外の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。