当前位置: 首页 > 面试题库 >

尝试/多发vs单发

乐正镜
2023-03-14
问题内容

在Eclipse中添加try / catch块时,它为我提供了“使用try / 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块并产生SAME
CATCH,而第二个示例将在启用单独的catch块的同时基于异常抛出catch。

我还有其他应该知道的吗?我以前从未使用过它们,也不知道它们是否值得使用。


问题答案:

tl; dr Mutlicatch单手处理事情,多个catch块更灵活,操作更方便。可以将两种技术结合起来。

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

例如,如果使用套接字,则可能仅通过重新连接和/或错误消息而捕获到SocketException(就像无意中断开电缆那样简单)

如果捕获到一个空指针异常(尽管未检查),则您将要写入日志并在此处紧急着陆,清理您可以执行的操作,并可能在代码上进行一些回溯。

此外,这可以进一步细分,其中不同类型的“常见”异常可能会导致采取不同的操作(例如,连接丢失与名称未解析会在首次连接尝试中对最终用户产生不同的影响),并且不同的“重”异常也以不同的方式处理。

虽然你可以有一个(多个异常类型)catch块,它要么一手承担(基于电缆被拔出以同样的方式呈现一个空指针异常给用户作为条件)的所有异常类似的行动或要求if e instanceof FooException块是会降低可读性。

您也可以将两者结合在一起,将所有“常见”异常多捕获为重试和优美的消息,并将所有严重异常多捕获为强制清除和关闭

您不需要跳线的堆栈跟踪,也不需要清除丢失的对象



 类似资料:
  • 问题内容: 我一直在看代码,并且看到了尝试资源的机会。我以前使用过标准的try-catch语句,看起来它们在做同样的事情。所以我的问题是“ 尝试使用资源”与“尝试捕获 ”之间的区别是什么,哪个更好。 这是尝试使用资源: 问题答案: 尝试使用资源的重点是确保可靠地关闭资源。 当你不使用try-with-resources时,存在一个潜在的陷阱,称为异常屏蔽。当try块中的代码引发异常,而finall

  • 我的项目中有一个复杂的模型结构<有时我必须从中获得深层次的价值。如下所示: 问题是,这些方法中的每一个都可能返回null,如果返回,我将得到null点异常。 我想知道的是如果我喜欢的话我应该写长一点吗 或者可以使用try... catch,如下所示: 我知道NPE是一件需要避免的事情,但在我的情况下,避免它不是一件开销吗?

  • 问题内容: 我正在尝试使用Python和请求库登录网站以进行某些抓取,但我正在尝试以下操作(无效): 但是,nada,重定向到登录页面。我需要打开一个会话吗?我执行了错误的POST请求,是否需要加载cookie?还是会话会自动执行?我在这里迷路了,需要一些帮助和解释。 我要登录的网站是php,我是否需要“捕获set- cookie并设置cookie标头”?如果是这样,我不知道该怎么做。该网页是具有

  • keytool-list-alias androidreleasekey-keystore C:\users\name.android\debug.keystore-storepass android-keypass android 但不幸的是,它以 *实际上我的结果可能是我发布的密钥商店,因为我已经建立了它作为发布的应用程序...不过我也不完全确定。

  • 第一种情况下的错误: java.net.ConnectException:连接超时:连接在java.net.DualStackPlainSockeTimpl.Connect0(本机方法)在java.net.DualStackPlainSockeTimpl.SocketConnect(未知源)在java.net.AbstractPlainSockeTimpl.SocketConnect(未知源)在j

  • 我正在使用Context.SendorderedBroadcast方法发送广播,并在到达ResultReceiver之前检查是否有人收到了广播。 下面是一段代码: 到目前为止,我只在搭载Android 2.1版本的摩托罗拉Defy手机上遇到过这种情况,但它也可能发生在其他手机上。 我在网上找不到任何关于它的参考资料,有人知道为什么会这样吗?谢谢!