我对java中的异常处理很新,因此这个问题可能看起来很愚蠢,但请让它回答。假设我有一个方法A ,其中某些部分代码可以抛出异常B 那么在方法中捕获异常或将方法声明写为以下内容之间有什么区别: -
void A() throws B{
----//----
}
答案 0 :(得分:9)
区别在于你调用方法的方式。
如果您的方法签名显示为throws Exception
,则调用您的方法的代码必须通过[通过Exception
子句]捕获它来处理catch
或将其丢回[via throws
clause]。
如果您catch
Exception
,您基本上是在尝试自己处理Exception
,并且调用您的方法的代码不必处理{{1} }}
我的建议如下:
如果您认为自己可以处理Exception
并从Exception
恢复,那么您应该catch
并做必要的事情。
如果您无法正确处理Exception
不catch
它,则必须将其丢回。
注意:对于catch
和Exception
来说,这是一种糟糕的编程风格,并将其重新抛回[尽管你可以这样做]。如果你用另一个包裹Exception
,那就没关系。但在这种情况下,用另一个包装Exception必须有意义。
更新:这个想法是,无论你的应用程序有多少层,有人都来处理那个throws Exception
子句。你不能让StackTrace在他的应用程序活动中出现给用户。需要考虑的是“你能从错误中恢复并恢复处理吗?”如果是,则处理异常,否则将其抛回到至少可以向用户显示有关发生的事情的有意义消息的层。
答案 1 :(得分:2)
如果您在A()
中发现异常,则必须对方法A()
中的错误做出反应,例如再次尝试违规代码,记录错误等。
如果您(重新)抛出异常,您希望/ forcce调用A()
的方法来处理异常,或者它处于未处理状态。
答案 2 :(得分:2)
不同之处在于,如果在方法体中捕获B,则表示您正在处理异常。您可以抛出另一个异常,但除非您这样做,否则就Java而言,问题被认为已解决。通过在方法签名上使用throws
声明,您将指示您的方法可以抛出B类异常,并且使用它的其他代码段将被强制处理它,或者进一步抛出它。
答案 3 :(得分:2)
您所写的只是一个例外规范,它告诉每个人您可能抛出的异常。这并不意味着你最终会抛出任何例外。
另一方面,try
/ catch
是关于异常处理:您在try块中包含代码,这可能会抛出异常,然后处理异常,因为它们进来。
从类A
内部,您只能抛出异常规范中列出的异常;如果A
派生自另一个类或接口,A
的规范必须至少与基础规范一样具有限制性。
答案 4 :(得分:1)
当您抛出异常时,您将其“抛出”回该方法的调用者。
另一方面,使用try-catch块“捕获”它可以让你在方法中处理它。
try {
//Do your stuff here
}
catch (Exception ex) {
System.out.println("I just caught exception = " + ex);
}
答案 5 :(得分:1)
答案 6 :(得分:1)
如果你在方法中捕获异常,你基本上是处理它(即使你什么都不做),并且调用者可能(必然)不知道;否则你告诉调用者该方法可能出错的地方,以及他们应该处理什么错误,如果他们不处理它,那么他们的应用程序肯定会让他们知道异常何时发生。
答案 7 :(得分:1)
当您捕获异常时,这意味着您将在捕获部分中以某种方式处理异常。但是当你声明A()抛出B时,你只是告诉A() - 函数可能抛出B异常。因此,当某人使用A() - 函数时,他知道他必须处理B异常或将其抛弃。
答案 8 :(得分:1)
捕获异常是:您提供占位符来处理异常情况。 因此,如果try块中的任何代码部分抛出此异常,它将进入catch块并且将执行该段代码。
投掷异常是:您没有处理异常。因此,如果方法中的代码在头中抛出异常,则会创建提到的异常,它将被抛出到方法堆栈中。 所以,如果代码如下:
method1() { x.method2(); } method2() { method3(); } method3() throws SomeException { ..... ...... }
然后,如果method3中的代码抛出SomeException,那么它将传播到method2,如果method2也不处理异常,那么同样在方法堆栈中处理方法1。