Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 尝试/多捕获vs单捕获_Java_Try Catch - Fatal编程技术网

Java 尝试/多捕获vs单捕获

Java 尝试/多捕获vs单捕获,java,try-catch,Java,Try Catch,在Eclipse中添加try/catch块时,它给了我“try/multi-catch环绕”或“try/catch环绕”的选项 这是try/multi-catch: try { save.load(new FileInputStream(file.getAbsolutePath())); } catch (FileNotFoundException | IOException e) { // TODO Auto-generated catch block e.printS

在Eclipse中添加try/catch块时,它给了我“try/multi-catch环绕”或“try/catch环绕”的选项

这是try/multi-catch:

try {
    save.load(new FileInputStream(file.getAbsolutePath()));
}
catch (FileNotFoundException | IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
这是一个try/catch:

try {
    save.load(new FileInputStream(file.getAbsolutePath()));
}
catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
使用其中一种有什么好处/影响?如果我是正确的,第一个示例将在抛出任何一个异常时执行catch块并生成相同的catch,而第二个示例将在启用单独的catch块时基于该异常抛出catch

关于这件事还有什么我应该知道的吗?我以前从未使用过它们,也不知道它们是否值得使用;Mutlicach博士单独处理事情,多个捕捉块更灵活,操作更方便。这两种技术可以结合使用

如果您有一个try语句可以抛出许多不同的异常类型,那么您将需要多个catch块。它的代码多一点,但提供了更大的灵活性

例如,如果使用套接字,可能只会通过重新连接和/或错误消息捕获SocketException(原因很简单,如意外断开的电缆)

如果捕获到空指针异常(尽管未选中),您将希望写入日志并在此处进行紧急登录,尽可能地进行清理,并可能以代码方式进行回溯

此外,这还可以进一步细分,其中不同类型的“常见”异常可能导致采取不同的操作(例如,连接丢失与未解决的名称,在第一次连接尝试时对最终用户有不同的影响)以及以不同的方式处理不同的“严重”异常

虽然您可以有一个(多个异常类型)catch块,但它可以单独对所有异常采取类似的操作(以与基于拔掉电缆的条件相同的方式向用户呈现空指针异常),或者需要
if e instanceof footexception
块来降低可读性

您还可以将这两种情况结合起来,将所有“常见”异常分为“重试”和“良好”消息,将所有严重异常分为“强制清理”和“关闭”


您不希望绊倒的电缆出现堆叠痕迹,也不希望刷掉丢失的物体。

这是一种选择。您需要平衡可读性、可移植性、可维护性以及以不同方式处理不同的异常

所以平衡使用。。。如果所有捕获都使用相同的处理块,那么使用第一种形式,因为这只是一个代码块,您不会一次又一次地重复自己。编译器可以为您进行一些优化

另一方面,如果处理每个异常的方式不同,请使用第二种形式


这是一个宽泛的问题,答案取决于你的目标

我相信,只有当您的JDK是Java JDK 7时,您的第一个代码片段才适用。而第二个代码段仍将在JDK 7及以下版本中运行

如果您有一行代码可以抛出不同类型的异常,并且希望以类似的方式处理它们,那么Multicatch将适合您,因为它可以保存多行代码

但是,如果您有一行代码将抛出多个异常,并且您希望单独处理这些异常,那么单个catch异常将更适合您。

瞧,try-catch结构的实际用途是您可以对特定异常应用特定的错误处理函数。在您的情况下,除了要打印的堆栈跟踪之外,似乎不希望发生任何事情。例如,如果我想在抛出FileIOException时关闭窗口,并且我只想在发生任何其他异常时显示一条错误消息,那么在第二个代码块中编写多个try-catch块会很有用。不过,在本应用程序中,您可能只想获得如下捕获:

try {
    save.load(new FileInputStream(file.getAbsolutePath()));
} catch (Exception e) {
    e.printStackTrace();
}

这将打印所有异常的strack跟踪。:)

如果要对所有异常执行相同的操作,try multi-catch和try-catch是相同的,只是前者较短。所有的程序员都很懒

当您想针对不同的异常执行不同的操作时:

} catch(AException e) {
    System.err.println("AException occured");
} catch(BException e) {
    System.err.println("BException occured");
}
尝试多捕不是正确的选择



请注意,
e
的类型是
AException
BException
增加或减少可读性的最常见超类型!如果你在两种情况下做的是相同的事情,那么就使用multi-catch。注意,
FileNotFoundException
是一个
IOException
@PaulBellora,我让Eclipse自动完成了这个例子。它在我的真实代码中被更正了。@Aaron我支持你,别担心。相信我,我已经看到Eclipse生成了许多更愚蠢的东西。在提供详细解释时接受:)从您的答案中学到了很多!堆栈跟踪语句由Eclipse自动生成;他可能想做一些事情,而不是打印堆栈跟踪。
} catch(AException | BException e) {
    System.err.println("A or B Exception occured");
}