Java 禁止抛掷条款
这个程序是正确的,并编译和运行。但是为什么方法“a”没有抛出声明呢Java 禁止抛掷条款,java,exception,Java,Exception,这个程序是正确的,并编译和运行。但是为什么方法“a”没有抛出声明呢 class Exception1 { public void a() { int array[] = new int[5]; try { System.out.println("Try"); array[10]=1; }
class Exception1 {
public void a()
{
int array[] = new int[5];
try
{
System.out.println("Try");
array[10]=1;
}
catch (Exception e)
{
System.out.println("Exception");
throw e;
}
finally
{
System.out.println("Finally");
return;
}
}
public static void main(String[] args)
{
Exception1 e1 = new Exception1();
try {
e1.a();
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("Catch");
}
System.out.println("End of main");
}
}
ArrayIndexOutOfBoundsException是未经检查的异常,这意味着它既不需要声明,也不需要显式捕获 简单地说。在java中,您已经检查和取消检查了异常(和错误,让我们暂且不谈)。选中一个扩展
异常
,如果抛出则必须声明,如果代码可能抛出则必须处理
另一方面,未经检查的异常扩展了RuntimeException,不需要声明它们,也不需要处理它们<例如,代码>NullPointerException。如果您需要处理它们,您将需要大量的try-catch,因为NPE几乎可以发生在任何代码行上。问题在于
finally
块中的返回
:
由于finally
将始终执行,并且它将始终突然完成(无论是带有未检查的异常还是带有返回
),因此无法在catch
块中抛出e
(或try
块中的任何未检查异常)可能会在调用堆栈上向下传播
如果删除
返回
,那么您会注意到编译器将不接受该代码,并声明异常
不会被声明为在方法a()
上抛出。请注意,在最后
块中使用返回
是一个非常糟糕的主意。它隐藏了try
和catch
块中的所有异常!真的,约阿希姆说得有道理。运行:尝试{return 5;}catch(Exception ex){return 6;}最后{return 7;}来获得一些乐趣:)我认为是一个询问问题,因为即使是有经验的人也看不到真正的原因。这不是问题所在:catch
块中有一个抛出e
,而e
被声明为异常
。这意味着a()
必须声明为throws expetion
。阅读我的答案,了解为什么不是这样。伙计(如果你读过的话)约阿希姆说得对。投了他的票,不知道还能做什么:)