【问题标题】:Is it possible to use "throws" on a method in an external JAR是否可以在外部 JAR 中的方法上使用“抛出”
【发布时间】:2012-09-05 19:39:57
【问题描述】:

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

上面的代码sn-p一直返回如下编译错误:

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

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

【问题讨论】:

  • 您在 try 块中引用的类,是 java.lang.Class 还是某个类的占位符?
  • 是占位符,示例已更新。
  • 唯一的可能是代码中的 jar 中存在 DemoClass 一个,并且其中任何一个都有不会引发异常的 methodName()。
  • “编译错误”是指“执行 javac 时”还是“我的 IDE 这么说”?
  • Kai:使用 maven 构建

标签: java exception jar


【解决方案1】:

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

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

另外,请确保您从同一个 jar 中导入“MyClass”和“CustomException”,并且您的 sn-p 和“MyClass”从同一个包中导入“CustomException”。

【讨论】:

  • MyClass 和 customException 没有从同一个 JAR 导入,这是问题吗?
  • 不一定,如果两个 jar 都在类路径中,你应该没有任何问题。事实上,import 子句中的错误更有可能发生。检查 DemoClass 是否从与您的 sn-p 相同的包中导入 CustomException。
【解决方案2】:

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

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

【讨论】:

  • 这个项目是非常模块化的,所以不幸的是绝对不是这种情况。
  • 我认为是时候让我们了解具体的名称了。请在我的更新中查看编辑。
  • MyClass 和 CustomException 被打包在不同的 JAR 中(下面指出),这是一个问题吗?
  • 即使这根本不应该是一个问题!
【解决方案3】:

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

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


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

不是本身

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

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多