2011-04-29 20 views
2
public class simple { 
    public static void main(String[] args) { 
     try { 
      System.out.print("hello "); 
      throwit(); 
     } catch (Exception re) { 
      System.out.print("caught "); 
     } 
    } 

    public static void throwit(){ // line number 11 
     throw new Exception(); // line number 12 
    } 
    } 

为什么它给我一个编号错误行号12。 如果我使用抛出异常行号11然后它工作正常。 如果我抛出异常的子类(在行号12),那么它工作正常...为什么这样?...为什么我不能在try catch语句中调用的方法中抛出Exception(checked)?

我想知道实际发生了什么后面(如何编译器显示此错误)?

+0

如果throwit抛出检查异常,需要声明的是,不管是什么代码调用throwit。 – MatrixFrog 2011-04-29 06:06:00

回答

10

你有一个方法在抛出一个检查的异常,但它的方法签名没有指定它能够做到这一点。所有检查的异常都必须在方法签名中声明,并通过try/catch块或重新抛出显式处理;这就是检查异常的定义。 :)

这条线:

public static void throwit() 

应该

public static void throwit() throws Exception 
+6

我们也应该注意到,抛出'Exception'并声明一个方法抛出'Exception'几乎肯定是一个坏主意。这使得调用者很难做任何有意义的事情......除了记录异常和纾困之外。你应该总是抛出/声明更具体的异常,以便调用者可以区分预期的异常和意外的异常。 – 2011-04-29 06:19:40

+0

正好......如果我抛出特定的异常(例如“NullPointerException”),那么编译器就不会给出错误(方法签名也不需要“抛出异常”)。这个代码只是站在了异常处理的概念后面......为什么我不能抛出异常?......我想知道编译器是如何在这里工作的?.. – 2011-04-29 07:27:12

+0

如果你抛出一个'unchecked'异常,编译器不会因为未经检查而出现错误。 RuntimeException和Error的所有子类均未选中,其余都将被检查。 – 2011-04-29 08:25:10

相关问题