【问题标题】:Java Exceptions: exception myException is never thrown in body of corresponding try statementJava 异常:在相应的 try 语句的主体中永远不会抛出异常 myException
【发布时间】:2011-05-18 02:06:27
【问题描述】:

我理解这个错误的想法。但我想我不明白这在调用堆栈中是如何工作的。

文件 Main.java:

public static void main(String[] args) {
    try {
         Function1();
      } catch (myException e) {
      System.out.println(e.getMessage());
    }
}
public static void Function1() {
    Function2();
}

Function2 存在于另一个文件中:

文件2.java

public void Function2() throws myException {
     ....
}

所以通过几次调用(在调用堆栈中),我得到了 Function2,它指定了“抛出 myException”的要求。为什么 main 函数(错误指向的地方)没有识别出我抛出了 myException?

任何关于我的“异常知识”中的“漏洞”所在的指导将不胜感激。

艾蒂,

【问题讨论】:

  • 如果 myException 是运行时异常?如果你需要 Function2 抛出 myException,Function1 也应该抛出它。
  • Main 和 File2 类之间的关系是什么? (哪个继承自哪个?)
  • 这与您的问题没有直接关系,但我强烈建议遵守命名约定:Function1Function2 等方法应以小写字母开头,myException 等类应该以大写开头。约定让您和其他程序员更好地理解彼此的代码。
  • @Carl Smotricz,我的错。我不熟悉java约定。从现在开始,我会牢记这一点。您知道更多 java 命名约定或一般 java 约定的参考吗?
  • 见这里,特别是第 9 节:oracle.com/technetwork/java/codeconvtoc-136057.html

标签: java exception try-catch throws


【解决方案1】:

您的问题是 Function1() 没有声明它 throws myException - 这意味着应该有 2 个编译错误:一个关于未捕获或声明的异常,一个关于捕获未声明的异常。

【讨论】:

  • 我猜缺少throws 没有错误,因为myExceptionRuntimeException
  • 如果它是一个 RuntimeException 那么第一个错误不应该发生。
【解决方案2】:

漏洞在于Function2 声明它抛出异常,但Function1 没有。 Java 不会挖掘可能的调用层次结构,而是直接通过您在 throws 语句中声明的内容。

Function1 侥幸逃脱,可能因为myExceptionRuntimeException

【讨论】:

  • 所以你说我需要一直声明一个 throws myException 链?
  • 嗯,解决了它...非常感谢。那么从处理程序到 throw 的路径(沿着调用堆栈)必须要求沿途的每个函数都可以一直“抛出”(或将 throw 传递)到处理程序?
猜你喜欢
  • 2015-05-29
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多