是否可以对外部JAR中的方法使用“throws”

时间:2012-09-05 10:07:45

标签: java exception jar

我有一个单独的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
}

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

  

从不在相应的try语句

的主体中抛出CustomException

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

3 个答案:

答案 0 :(得分:2)

你应该避免使用“class”,因为它是一个保留的关键字。

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”。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

问题是CustomException是一个经过检查的异常,但是编译器看到DemoClass.methodName()的版本没有声明作为抛出该异常。编译器然后推断出,因为方法的签名不允许抛出异常,所以不能抛出。

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


  

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

本身不是

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