Java的异常处理?

首先

由于我之前对Java的异常并不了解,所以我将它们总结在一起。
这次我打算将这篇文章写作为自己的备忘录。

例外处理是什么?

由于例外的定义也有很多种,因此我引用了参考书籍1页码264的部分。

在Java中,程序执行中可能发生的故障分为两种类型。一种是表示程序无法处理的情况,如执行环境故障等,称为错误;另一种是程序可以处理的异常。

异常又分为检查异常和非检查异常。检查异常是指编译器会检查是否编写了异常处理代码的异常。而非检查异常是指编译器不会检查是否编写了异常处理代码的异常。

听说是这样的。总而言之,可以分为三个部分。
此外,根据每个例外情况,存在相应的例外类,并且它们的关系如下所示。

スライド1.PNG

我想在其中包含子类。

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版发行) ㈱翔泳社 发行

广告
将在 10 秒后关闭
bannerAds