Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展异常处理_Java_Exception_Error Handling - Fatal编程技术网

Java 扩展异常处理

Java 扩展异常处理,java,exception,error-handling,Java,Exception,Error Handling,我有几个自定义的异常类。(不同的错误代码/错误消息) 其中一些会导致终止。这就是为什么我让它们传播到主流。 打印错误代码+消息 如果我捕获了超类,有没有一种方法不需要一个很长的If-else列表来检查我有哪些子类可以访问被重写的方法 有几个catch语句是否更具可读性 我是否应该在较低的级别将它们强制转换为较高的异常并仅捕获此异常?如果需要以特定方式处理子类异常,请使用捕获子类异常 当异常处理基本上就是这样做的时候,使用instanceof检查链是没有意义的 try { } catch (Sub

我有几个自定义的异常类。(不同的错误代码/错误消息) 其中一些会导致终止。这就是为什么我让它们传播到主流。 打印错误代码+消息


如果我捕获了超类,有没有一种方法不需要一个很长的If-else列表来检查我有哪些子类可以访问被重写的方法

有几个catch语句是否更具可读性


我是否应该在较低的级别将它们强制转换为较高的异常并仅捕获此异常?

如果需要以特定方式处理
子类异常
,请使用
捕获子类异常

当异常处理基本上就是这样做的时候,使用
instanceof
检查链是没有意义的

try {
} catch (SubclassOfException e) {
  // Do something specific to SubclassOfException
} catch (Exception e) {
  // Do something for other types.
}
基本上与:

try {
} catch (Exception e) {
  if (e instanceof SubclassOfException) {
    // Do something specific to SubclassOfException.
    // Note that you have to cast explicitly if you want to use
    // subclass-specific properties of SubclassOfException.
  } else {
    // Do something for other types.
  }
}
我认为很明显,第一个更具可读性,执行效率也更高,因为JVM希望编写异常处理代码

用第一种方式写作的另一个优点是你不能写:

try {
  // ...
} catch (SubclassOfException e) {
} catch (SubclassOfSubclassOfException e) {
}
因为第一个捕获将捕获第二个捕获匹配的所有异常,使得第二个捕获是多余的。因此,这是一个编译时错误,如中所述:

如果catch子句可以捕获异常类E1,而紧随其后的try语句的前面catch子句可以捕获E1或E1的超类,则这是编译时错误

您需要首先捕获最特定的类型,然后捕获最不特定的类型

另一方面,

if (e instanceof SubclassOfException) {
} else if (e instanceof SubclassOfSubclassOfException) {
}

不是编译时错误,即使第二个分支也无法执行;您只需看到所有的
子类异常
被处理,就好像它们只是
子类异常
s一样。

如果您需要以特定的方式处理
子类异常
,请使用
捕获子类异常

当异常处理基本上就是这样做的时候,使用
instanceof
检查链是没有意义的

try {
} catch (SubclassOfException e) {
  // Do something specific to SubclassOfException
} catch (Exception e) {
  // Do something for other types.
}
基本上与:

try {
} catch (Exception e) {
  if (e instanceof SubclassOfException) {
    // Do something specific to SubclassOfException.
    // Note that you have to cast explicitly if you want to use
    // subclass-specific properties of SubclassOfException.
  } else {
    // Do something for other types.
  }
}
我认为很明显,第一个更具可读性,执行效率也更高,因为JVM希望编写异常处理代码

用第一种方式写作的另一个优点是你不能写:

try {
  // ...
} catch (SubclassOfException e) {
} catch (SubclassOfSubclassOfException e) {
}
因为第一个捕获将捕获第二个捕获匹配的所有异常,使得第二个捕获是多余的。因此,这是一个编译时错误,如中所述:

如果catch子句可以捕获异常类E1,而紧随其后的try语句的前面catch子句可以捕获E1或E1的超类,则这是编译时错误

您需要首先捕获最特定的类型,然后捕获最不特定的类型

另一方面,

if (e instanceof SubclassOfException) {
} else if (e instanceof SubclassOfSubclassOfException) {
}

不是编译时错误,即使第二个分支也无法执行;您只需看到所有的
子类SubclassOfException
被处理,就好像它们只是
子类exception
s.

“没有一个长的if-else列表来检查哪个子类“您可以使用访问者(可能)”,而没有一个长的if-else列表来检查哪个子类“您可以使用访问者(可能)”所以我需要先对继承性最低的catch块进行排序,或者有没有办法说查看此实例的基本级别?@gismo我想我在您发表评论时所做的编辑解决了这个问题?所以我需要先对继承性最低的catch块进行排序,或者有没有办法说查看此实例的基本级别实例?@gismo我想你发表评论时我所做的编辑解决了这个问题?