是否已检查或运行时进行乘法异常?
-
03-10-2019 - |
题
我有一个例外链 method1
抛出一个例外 method2
这使例外 main
. 。由于某种原因,编译器迫使我处理错误 method2
如果我不这样做,则将其标记为错误,表明它是检查的异常。但是当一样 Exception
被扔下了直线 main
, ,编译器允许我忽略它,并且不显示任何错误。
原始例外 method1
是一个 ParseException
, ,已检查。但是该方法具有通用 throws Exception
标题中的子句,同一对象被抛向Method2,它具有相同的 throws Exception
条款。该例外何时以及如何失去被编译器检查 /捕获的状态?
编辑以澄清:
public void method1() throws Exception{
// code that may generate ParseException
}
public void method2() throws Exception{
method1(); //compiler error (if the throws clause is left out)
}
public static void main(String[] args){
method2(); //ignored by compiler, even though the exception isn't caught or thrown or handled at all
}
编辑:对不起,大家,这个问题是基于错误...主要方法实际上有一个 throws Exception
我缺少的条款。我已经删除了这一点,并且代码现在的行为如预期的。感谢您的帮助!
解决方案
是否检查过例外完全取决于哪种例外是:如果是 RuntimeException
或一个子类,未检查;否则,是。 (是的, RuntimeException
是 Exception
- Java库设计的失败之一,但不是最重要的。)
编译器检查是方法签名。因此,实际的例外是无关紧要的(为此目的)。如果方法说 throws Exception
那你必须抓住 Exception
在您的方法中或声明该方法 throws Exception
. 。方法应始终使用 最狭窄 throws
条款 - 例如, 不是 throws Exception
但 throws ParseException
.
(我说“无关(出于这个目的)”,因为当然是 其他 编译器将要做的事情是检查您没有丢弃检查的例外 throws
条款。)
编辑 您在编辑中添加的代码不会编译:1。它在没有实例的情况下调用实例方法和2。 main
需要声明它投掷 Exception
.
该代码解决了其他问题,并且(正确)证明了 main
需要 throws Exception
条款:
public class CheckTest
{
public static final void main(String[] params)
{
new CheckTest().method2();
}
public void method1() throws Exception{
throw new java.text.ParseException("foo", 2);
}
public void method2() throws Exception{
this.method1();
}
}
结果:
CheckTest.java:27: unreported exception java.lang.Exception; must be caught or declared to be thrown
new CheckTest().method2();
^
1 error
其他提示
检查的例外不停止被检查的异常。您可以将检查的异常变成未选中的方式是将其包裹在一种运行时exception中并重新插入它。
就您而 Exception
一直向下 呼叫堆栈的根。如果宣布抛出方法 Exception
(哪种方法很少会这样),调用方法要么必须说它抛出 Exception
也要抓住它并处理它。
编辑 至于编辑OP中的示例,不会编译。您可以声明 main
投掷 Exception
但是,如果您不想处理它。
您的编译器是否可能没有抱怨 main()
因为它遇到了问题 method2()
并停止在这一点上检查语法吗?两者都应该是一个错误。您是否修复了电话 method2()
并获得了干净的编译?