1

可能重复:
抛出或尝试捕获

我正在编写一个 API,我希望编写代码以便我可以在特定场景中引发异常。我创建了一个异常类,如下所示:-

public class InvalidSeverityException extends Exception {
    private static final long serialVersionUID = 1L;
    public InvalidSeverityException() {
        // TODO Auto-generated constructor stub
    }
}

在代码库中,我有以下调用代码:-

throw new InvalidSeverityException();

但是 Eclipse 建议我要么使用它,要么throws将它包含在一个try ... catch块中。我觉得我不应该发现这个错误,使用我的 API 的开发人员应该将代码包含在try...catch.

那有意义吗?难道我做错了什么?

4

4 回答 4

4

在 Java 中处理异常时,您必须了解已检查异常检查异常的概念。

在您的情况下,您当前正在定义一个已检查的异常,也许您想要一个未检查的异常。

以下是关于每种类型的简要说明:

检查异常

此异常必须是引发它们的方法签名的一部分(或调用一个这样做的方法),或者您必须用try catch块捕获它们并处理问题。当可以对错误采取一些措施时,以及当您希望开发人员意识到可能会发生此类错误并且必须处理时,通常会使用已检查的异常。

在 javajava.lang.Exception中是一个检查异常,它的所有子类也将被检查。

未经检查的异常

另一方面,这种异常不需要成为方法签名的一部分,也不需要包装在try catch块中抛出新的方法。只是期望调用堆栈中的某个地方会有一个try catch来处理它,否则如果它到达 JVM,它会很好地转储你一个堆栈跟踪。

在javajava.lang.RuntimeException中是一个未经检查的异常,它的所有子类也是如此。

我的意见

如果您正在定义 API,我的建议是使用检查异常,这主要是因为您明确告知使用您的 API 的开发人员可能会发生此类异常(因此他们可以随心所欲地处理它)。

于 2012-12-07T16:40:36.770 回答
1

throw new InvalidSeverityException();应该定义 throws的方法InvalidSeverityException

例子:

  void yourMethod() throws InvalidSeverityException
    {
    ........//Some code
    throw new InvalidSeverityException();

    }
于 2012-12-07T16:33:23.197 回答
1

你是对的,你不应该抓住它。正如 eclipse 所建议的那样,您应该使用throws以便开发人员知道您的方法可能会引发该异常,然后可以捕获它。

.... method() throws YourException{
于 2012-12-07T16:34:36.837 回答
1

那么你肯定会遵循 Eclipse 的第一个建议并设置你的方法来抛出异常。

public void myMethod() throws InvalidSeverityException {
    //throw it somewhere in here so that other 
    //developer can catch it while calling your method
}
于 2012-12-07T16:35:01.947 回答