Java的异常处理?
首先
由于我之前对Java的异常并不了解,所以我将它们总结在一起。
这次我打算将这篇文章写作为自己的备忘录。
例外处理是什么?
由于例外的定义也有很多种,因此我引用了参考书籍1页码264的部分。
在Java中,程序执行中可能发生的故障分为两种类型。一种是表示程序无法处理的情况,如执行环境故障等,称为错误;另一种是程序可以处理的异常。
异常又分为检查异常和非检查异常。检查异常是指编译器会检查是否编写了异常处理代码的异常。而非检查异常是指编译器不会检查是否编写了异常处理代码的异常。
听说是这样的。总而言之,可以分为三个部分。
此外,根据每个例外情况,存在相应的例外类,并且它们的关系如下所示。

我想在其中包含子类。
2. 各种特例的基本原则
测试例外
继承“异常”类的异常类被视为检查异常,在编程中必须进行try-catch或throws语句等操作。在这里所谓的检查就是指“捕获”或“抛出”的动作。如果没有对检查异常进行检查,将会导致编译错误。
非检测到的异常
如果一个Exception的子类继承自RuntimeException,那么它将被视为非检查异常,不需要进行try-catch等处理。
当然,也可以写上异常处理。
③错误
内存不足或文件读取失败等异常情况。与非检查异常一样,无需进行异常处理。
3. 异常处理的撰写方式有种种。
Another option:
3. 编写异常处理的方法有许多。
3.1 标准的写法
明示地抛出异常时,需要使用throw(仅适用于检查异常?进行验证)。
catch块的参数是Throwable,因此可以捕获所有的异常。
try { // 例外が発生するかもしれない処理をくくる
throw new Exception();
} catch (Exception e) {
... // try 中で例外が発生した時に処理される
} finally {
// 例外が発生してもしなくても実行される
}
在声明抛出异常的方法中使用throws。
private void hogehoge() throws Exception {
throw new Exception();
}
3.2 多重捕获
可以同时指定多个捕获异常的类。引用自参考2。
// Java6以前の場合
try {
. . .
} catch (IOException ex) {
logger.log(ex);
throw ex;
} catch (SQLException ex) {
logger.log(ex);
throw ex;
}
// Java7以降の場合
try {
. . .
} catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}
検査例外をスローする時は、必ずキャッチも記述してください。
如果一个方法声明了抛出检查例外,没有捕获或再次抛出该异常的话,将会导致编译错误。。。
public void method() throws Exception {}
// case1
try {
method();
} catch (Exception e) { // catchが無いとエラー
...
}
// case 2
public void method2() throws Exception { // 再スローしないとエラー
method();
}
4. 例外发生后的行为 (Lì de
如果在for循环中出现异常,之后的循环将不再执行。
参考1页349引用。
由于i = 1时发生StringIndexOutOfBounds异常,因此i > 1的循环处理不会被执行。
String[] array = {"abcde", "fgh", "ijk"};
String[] array2 = new String[3];
int i = 0;
try {
for (String s: array) {
array2[i] = s.substring(1, 4);
i++;
}
} catch (Exception e) {
System.out.println("Error");
}
for (String s: array2) {
System.out.println(s);
}
// 実行結果
// Error エラーをキャッチしたことによる出力
// bcd array2[0]
// null array2[1]
// null array2[2]
覆盖抛出异常的方法时需要注意的事项是4.2
当我们覆盖抛出异常的方法时,会在该方法上添加以下约束(参考3页299,部分表达引用已更改)。
①子类方法可以抛出与父类方法抛出的异常相同或其子类异常。
②无论父类方法抛出什么异常,子类方法都可以作为运行时异常或其子类异常抛出(可以转化为运行时异常)。
③实际上,并不一定要在子类方法中抛出异常,只是因为父类方法抛出了异常。
从参考文献3页300引用具体例。在这个例子中,不可行:将其视为编译错误。
class Super { void method() throws IOException {} }
class SubA { void method() } // OK 例外をスローしなくても良い
class SubB { void method() throws FileNotFoundException {} } // OK IOExceptionのサブクラスでスローしている
class SubC { void method() throws Exception {} } // NG IOExceptionのスーパークラスでスローしている
class SubD { void method() throws ClassNotFoundException {} } // NG IOExceptionと継承関係にない例外クラスでスローしている
class SubE { void method() throws RuntimeException {} } // OK 実行時例外に倒している
5. 查阅
1.志贺清人 (2019) “彻底攻略 Java SE 8 Silver 问题集 [1Z0-808] 对应” ㈱印刷发行
2.【公司内部学习会】Java异常处理 (2017/04/26)
3.山本道子 (2015) Java程序员 Silver SE 7 (第5版发行) ㈱翔泳社 发行