题
在尝试重构一些I代码时,我试图在catch子句中抛出异常,如下所示 -
try {
....
}
catch(Exception exception){
.....
throw exception
}
但是,当我试图在"throw exception"行上抛出异常时,编译器抱怨说我需要在一个新的try/catch中围绕我的throw子句 -
try
{
....
}
catch (Exception exception)
{
.....
try
{
throw exception
}
catch (Exception e2)
{
...
}
}
为什么编译器需要这个,它提供了什么用途?
谢谢
解决方案
以下示例工作
package test.example;
public class ExceptionTest {
public static void main(String[] args) throws Exception{
try {
int value = 1/0;
} catch (Exception e) {
System.out.println("woops the world is going to end");
throw e;
}
}
}
.
然而,此示例将给出错误。
package test.example;
public class ExceptionTest {
public static void main(String[] args) throws RuntimeException{
try {
int value = 1/0;
} catch (Exception e) {
System.out.println("woops the world is going to end");
throw e;
}
}
}
.
注意在第二个例子中,我只是捕捉异常而不是runtimeexception,它不会编译,因为我抛出异常,即使我正在dexched runtimeexception。
是异常是一个runtimeexception,但编译器不知道。
只是想到了第三个工作示例来告诉你。这也是有效的,因为你会在你宣布时抛出相同的类型。(注意唯一的变化是Catch块)
package test.example;
public class ExceptionTest {
public static void main(String[] args) throws RuntimeException{
try {
int value = 1/0;
} catch (RuntimeException e) {
System.out.println("woops the world is going to end");
throw e;
}
}
}
.
您需要了解所有三个答案之间的差异
其他提示
例外情况 java.lang.Exception
是检查异常。这意味着它必须在 throws
封闭方法的子句或与方法体一起捕获和处理。
但是,您在"固定"版本中所做的是捕获异常,重新抛出它,然后立即再次捕获它。这没有多大意义。
没有看到真正的代码,目前尚不清楚真正的解决方案应该是什么,但我预计问题出在原始 try { ... } catch
处理程序:
如果可能的话,你应该在这一点上捕获一个更具体的异常,这样当你重新抛出它时,它就会被方法的现有复盖
throws
名单。或者,您可以将异常包装在未经检查的异常中,然后抛出该异常。
作为最后的手段,您可以更改方法的签名以包括
Exception
在抛出列表中。但这是一个非常糟糕的主意,因为它只是将问题推向呼叫者。..并且使开发人员/读者处于不知道预期会发生什么异常的位置。
在Java中,检查和未选中的异常之间存在区别。基本上可以在代码中的任何位置抛出未经检查的异常,如果它没有捕获在某个地方,它将传播到应用程序的入口点,然后停止该过程(通常使用错误消息和堆栈跟踪)。一个被检查的异常是不同的:编译器不会让您允许它允许它传播,您需要围绕任何代码,可能会抛出试用块(“抛出异常”是最简单的情况,如果异常是最简单的情况检查异常类的实例),或者必须标记包含对代码调用的方法,该方法可能会带有“抛出”声明的被检查的异常。如果所需的行为是抛出未经检查的异常,那么您需要在runtimeexception中包装异常。如果所需的行为是保持异常检查,那么您需要向当前方法添加投掷声明。
在原始代码中,没有什么能捕获抛出的例外。我想象你要么指定你的函数抛出异常,或者是编译器捕获它的另一个尝试/ catch块。
而不是
public void yourFunction(){
try {
....
}
catch(Exception exception){
.....
throw exception
}
}
.
尝试
public void yourFunction() throws Exception{
try {
....
}
catch(Exception exception){
.....
throw exception
}
}
.