在尝试重构一些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
  } 
}
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top