关于在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
}
}
我更喜欢第一种结构,因为只有一个捕获块,而且看起来更优雅。是否有理由真正喜欢第二种或另一种结构?
更新:将有所作为,如果我指出,无论read
与close
只引发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块处理。但如果我使用嵌套表单: 上面的代码乱七八糟!但它实现了与第一个代码完全相同的功能。还是没有?帮我弄清楚:(