Java 禁止抛掷条款

Java 禁止抛掷条款,java,exception,Java,Exception,这个程序是正确的,并编译和运行。但是为什么方法“a”没有抛出声明呢 class Exception1 { public void a() { int array[] = new int[5]; try { System.out.println("Try"); array[10]=1; }

这个程序是正确的,并编译和运行。但是为什么方法“a”没有抛出声明呢

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
。阅读我的答案,了解为什么不是这样。伙计(如果你读过的话)约阿希姆说得对。投了他的票,不知道还能做什么:)