5

我有一个单独的 JAR 库,其中包含一组引发自定义异常的方法,例如:

public String methodName() throws CustomException {
    // code here
}

然后,我将 JAR 添加到类路径并在源代码的 try 语句中引用库方法:

try {
    DemoClass demoClass = new DemoClass ();
    demoClass.methodName() // this should throw a CustomException if something occurs
} catch (CustomException e) {
    // something here
}

上面的代码片段不断返回以下编译错误:

CustomException 永远不会在相应的 try 语句的主体中抛出

如果该方法在本地上下文中(未打包在 JAR 中),则代码可以工作。所以我的问题是,是否可以从 JAR 库中“抛出”自定义异常?

4

3 回答 3

2

您应该避免使用“类”,因为它是保留关键字。

try {
    MyClass myClass = new MyClass();
    myClass.methodName() // this should throw a CustomException if something occurs
} catch (CustomException e) {
    // something here
}

此外,请确保您从同一个 jar 中导入“MyClass”和“CustomException”,并且您的代码片段和“MyClass”从同一个包中导入“CustomException”。

于 2012-09-05T10:14:42.777 回答
1

你的类是在 jar 中还是在本地上下文中并不重要,它总是可以抛出异常。您应该检查您是否正在使用该类并调用您打算使用的方法,而不是其他类和其他具有相同名称的方法。

我的预感是ParseException两者都java.text.ParseException存在org.apache.commons.cli.ParseException,当demoClass.methodName()实际抛出前者时,你会在你的代码中导入后者并试图捕捉它,这就是编译器所抱怨的。您可能想要检查存在 CustomException 的所有位置,并且您正试图抓住正确的位置。

于 2012-09-05T10:14:22.810 回答
0

问题是这CustomException是一个已检查的异常,但编译器看到的版本DemoClass.methodName()声明为抛出该异常。然后编译器推断,由于方法的签名不允许抛出异常,所以它不能被抛出。

如果您希望能够在那里捕获该检查的异常,那么异常(或超类)必须包含在throws您编译的类的方法声明的子句中。


MyClass 和 customException 不是从同一个 JAR 导入的,这是问题吗?

不是本身

但是,我怀疑您实际上在两个 JAR 中有两个不同(不兼容)版本的相关类或接口。那将是一个错误。即使您设法编译它,由于签名冲突,您很可能会遇到类加载器问题。

于 2012-09-05T10:59:12.993 回答