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

是否有嵌套的try / catch块的首选项?

卢英叡
2023-03-14
问题内容

关于在Java中使用Readers和Streams总是困扰我的一件事是该close()方法可能引发异常。由于将close方法放在finally块中是个好主意,因此这需要一些尴尬的情况。我通常使用这种构造:

FileReader fr = new FileReader("SomeFile.txt");
try {
    try {
        fr.read();
    } finally {
        fr.close();
    }
} catch(Exception e) {
    // Do exception handling
}

但是我也看到了这种构造:

FileReader fr = new FileReader("SomeFile.txt");
try {
    fr.read() 
} catch (Exception e) {
    // Do exception handling
} finally {
    try {
        fr.close();
    } catch (Exception e) {
        // Do exception handling
    }
}

我更喜欢第一种结构,因为只有一个捕获块,而且看起来更优雅。是否有理由真正喜欢第二种或另一种结构?

更新:将有所作为,如果我指出,无论readclose只引发IOException?因此,在我看来,如果读取失败,则出于相同的原因关闭也会失败。


问题答案:

我总是会去第一个例子。

如果close抛出异常(实际上,FileReader永远不会发生),那么处理该调用者的异常异常的标准处理方式不是吗?几乎可以肯定,异常例外比使用资源时遇到的任何问题都要重要。如果您对异常处理的想法是调用System.err.println,则第二种方法可能更合适。

存在一个将异常抛出多远的问题。ThreadDeath应该总是被重新抛出,但是在它内部的任何异常都会阻止它。同样,Error应该比RuntimeException和RuntimeException比检查的异常更远。如果您真的想要,可以编写代码来遵循这些规则,然后使用“环顾四周”成语对它进行抽象。



 类似资料:
  • 问题内容: 我读到try-with-resources 中的块是可选的。我试图在try-with- resources块中创建一个对象,没有后续块,只是从eclipse中获取编译器错误:“ 自动调用引发了未处理的异常类型。” 由于可以在try-with- resources中使用的每个资源都实现了,因此在调用该方法时可能会引发异常,因此我不明白该子句是可选的,因为它不允许我跳过从中捕获异常的过程。

  • 问题内容: 我正在审查一些新代码。该程序仅具有try和finally块。由于不包含catch块,如果try块遇到异常或任何可抛出的异常,它将如何工作?它是否直接进入了finally块? 问题答案: 如果try块中的任何代码都可以引发已检查的异常,则它必须出现在方法签名的throws子句中。如果引发了未经检查的异常,则该异常会冒泡退出方法。 无论是否引发异常,都始终执行finally块。

  • 我正在编写外壳脚本,需要检查是否安装了终端应用程序。除非有更整洁的方法,否则我想使用TRY/CATCH命令来执行此操作。

  • 问题内容: 我最初从大学开始编程,然后学习了vb.net。现在,我决定转向Java并进行一些查询。在vb中,try catch语句的布局如下 但是在Java网站(https://docs.oracle.com/javase/tutorial/essential/exceptions/putItTogether.html)中,我发现在Java中,您使用了两个陷阱,如下所示: 我希望有人能够解释为什么

  • 我真的不明白使用嵌套的try-catch块的意义。它们很难阅读,有时也不太直白。例如: 上面的代码可读性更强,我可以理解它的功能——如果发生异常,可以由其中一个catch块处理。但如果我使用嵌套表单: 上面的代码乱七八糟!但它实现了与第一个代码完全相同的功能。还是没有?帮我弄清楚:(