如果我们不编写 try catch 块或 try finally 块或将异常传递给它正在调用检查异常的函数,Java 会给出编译时错误。这很好。但是,我的问题是为什么那么 catch 块是可选的,即我们可以写尝试块然后最终阻止所以,这不是一件肮脏的事情。如果我在某处错了,请纠正我。
5 回答
- 调用方法也可以处理异常
finally
允许阻止,因为即使抛出异常,也可能存在一些应该运行的代码。即使抛出异常,您也可能希望关闭某些数据库连接或资源。
catch
如果您尝试块中的方法抛出未经检查的异常,您可以省略一个块。
未经检查的异常在 Java 中有特殊处理:
- 如果你抛出一个,你不必声明你的方法
throws
它; - 如果您调用一个抛出一个的方法,无论它是在 try 块中还是其他地方,您都不会被迫使用
catch
它(也不会强迫throws
它,见上文)。
Java中所谓的“未经检查的异常”是明确定义的。所有异常最终都是Throwable
s,未经检查的异常要么继承Error
要么RuntimeException
。
Try-finally 通常用于处理要执行的关键代码。诸如释放资源或锁定对象之类的事情。这里的目的不是处理异常,而是确保即使发生一些意外异常,资源也被安全释放。这是确保的,因为finally 块在所有场景中都被执行。唯一的例外是 JVM 不应该关闭。
如果您在方法的签名中声明异常(已检查或未检查),则不必为 try 块设置 catch 子句。在未经检查的异常的情况下,您甚至不需要声明它。
然而,您经常需要释放或释放资源,这与是否发生异常无关。所以你可以这样写:
public void someMethod() throws IOException {
Object resource = getSomeResource();
try {
// Imagine, all following calls could throw an IOException
workWithResource(resource);
continueWorkWithResource(resource);
stillDoSomeWorkOnResource(resource);
} finally {
releaseResource(resource);
}
}
即使其中一种方法引发 IOException,资源也会在将异常传播给方法的调用者之前释放。在没有例外的情况下,资源也被释放。
finally 块总是被执行。
好吧,这不是一种真正干净/不错的编码方式,但是您是在告诉编译器您知道可能会出错。这并不意味着它是好的做法,但最终它是你的代码。编译器让您对“尝试”产生错误的原因是您是否以某种方式监督了它。这对于未经检查的异常是特殊的。在 Oracle http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html阅读有关它的更多信息