この記事では、Java の例外に関して最もよく寄せられる 10 の質問について説明します。
1. 検証可能と検証不能
つまり、チェック例外はメソッド本体で明示的にキャッチするか、メソッドの throws セクションで宣言する必要があります。未チェック例外は、0 による除算や null ポインタなど、解決できない問題によって発生します。API を使用する他の開発者が例外の処理方法を知っていることが期待されるため、チェック例外は特に重要です。たとえば、IOException は一般的に使用されるチェック例外ですが、RuntimeException は非チェック例外です。さらに読む前に、
「Java の階層例外図」を確認してください。
2. 例外に対処する最良の方法
例外が正しく処理できる場合はキャッチする必要があり、そうでない場合は転送する必要があります。
3. try で定義された変数を catch またはfinallyで使用できないのはなぜですか?
次のコードでは、try ブロックで宣言された行 s を catch ブロックで使用できません。このコードはコンパイルされません。
try {
File file = new File("path");
FileInputStream fis = new FileInputStream(file);
String s = "inside";
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println(s);
}
その理由は、try ブロックの正確などこで例外がスローされたかが不明であるためです。オブジェクトが宣言される前に例外がスローされた可能性があります。そしてこれはこの例にも当てはまります。
4. Double.parseDouble(null) と Integer.parseInt(null) が異なる例外をスローするのはなぜですか?
そうです、さまざまな例外が発生します。これは JDK の問題です。単に別の人がデザインしただけなので、あまり心配する必要はありません。
Integer.parseInt(null);
Double.parseDouble(null);
5. Java の基本的なランタイム例外
そのうちのいくつかを次に示します。
IllegalArgumentException
ArrayIndexOutOfBoundsException
これらは、次のように、条件が満たされない場合に if ステートメントで使用できます。
if (obj == null) {
throw new IllegalArgumentException("obj не может быть равно null");
6. 1 つの catch ブロックで複数の例外をキャッチすることは可能ですか?
答えは「はい」です。これらの例外のクラスがクラス継承階層をたどって同じスーパークラスに達する限り、そのスーパークラスのみを使用できます。
7. コンストラクターは例外をスローできますか?
答えは「はい」です。コンストラクターは特別な種類のメソッドにすぎません。
コード例を次に示します。
8. 最終ブロックで例外をスローする
原則として、これは非常に合法的に行うことができます。
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
FileInputStream fis = new FileInputStream(file2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
ただし、コードの可読性を維持するには、ネストされたブロックを
try-catch
新しいメソッドとして宣言し、このメソッドの呼び出しをブロックに挿入する必要があります
finally
。
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
methodThrowException();
}
}
9.finally ブロックで return を使用することはできますか?
はい、できます。
10. 開発者が例外を静かに処理するのはなぜですか?
たとえば、このようなコードがよく登場します。適切な例外処理がそれほど重要であるなら、なぜ開発者はこのように記述し続けるのでしょうか?
try {
...
} catch(Exception e) {
e.printStackTrace();
}
無視するのが一番簡単です。しかし、たとえこれが頻繁に行われるとしても、それが正しいというわけではありません。リンク:
- Java の未チェック例外
- Java の階層例外ツリーのルート
- stackoverflow の例外に関する質問
原著
GO TO FULL VERSION