2015-02-08 44 views
1

当我正在经历我碰到下面的规则传来JLS 8 11.2为什么会有调用没有try catch块静态无效的主要()

Java编程语言要求程序包含 处理程序检查可能由执行 方法或构造函数导致的异常(第8.4.6节,第8.8.5节)。此编译时检查 是否存在异常处理程序旨在减少未正确处理的异常数。对于每个检查异常 这是可能的结果,方法或构造函数的throws子句必须提及该异常的类别或该异常的类别的其中一个(第11.2.2.3)类别的其中一个 。

我不明白那条规则的要点。举例来说,据我所知,这两个程序

class Main 
{ 
    public static void main (String[] args) throws Exception 
    { 
     throw new Exception(); 
    } 
} 

DEMO

class Main 
{ 
    public static void main (String[] args) throws Exception 
    { 
     try{ 
      throw new Exception(); 
     } catch (Expection e){ } 
    } 
} 

DEMO

是良好的。

但是该规则要求程序包含任何检查的异常的处理程序,对于第一个不正确的异常。其实,看看处理程序的定义:

每个异常由类Throwable 或它的子类(§11.1)的一个实例表示。这样的对象可以用来从发生异常的点向携带 的信息携带 信息。 处理程序通过try 语句(§14.20)的catch子句建立。

强调我的。

所以,在第一个程序是没有任何处理,但

Java编程语言要求程序包含 处理程序检查的异常

你能不能澄清这个规则?

+0

抛出基本上是将异常传递给调用者。以便呼叫者可以以他自己的方式处理。而在第二个代码中,你并不需要抛出实际的! – Prashant 2015-02-08 07:06:48

+1

http://programmers.stackexchange.com/questions/257174/how-does-the-jvm-handle-an-exception-thrown-by-the-main-method – Adam 2015-02-08 07:07:12

+0

“对于可能导致的每个检查异常,方法或构造函数的throws子句必须提及该异常的类别或该异常类别的某个超类别之一。这里的奥秘是什么? – Raedwald 2015-02-08 12:04:16

回答

1

这由How does the JVM handle an exception thrown by the main method详细介绍。

本质上,这是由JVM的内部完成的 - 因此免除了任何JLS规则。如果您愿意,您可以覆盖此行为。

public static void main(String[] args) throws Exception { 
    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { 

     @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      System.out.println("I caught it !" + e); 
     } 
    }); 
    throw new Exception(); 
} 

对于JLS execution chapter,我找不到任何正式的规范,只包括main()的定义。它可能不存在,并不是所有的世界都有很好的记录。用于java runner的The c code使用JNI。这应该让你知道发生了什么,以及为什么JLS在这里无关紧要。

/* Build argument array */ 
mainArgs = NewPlatformStringArray(env, argv, argc); 
if (mainArgs == NULL) { 
    ReportExceptionDescription(env); 
    goto leave; 
} 

/* Invoke main method. */ 
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs); 

/* 
* The launcher's exit code (in the absence of calls to 
* System.exit) will be non-zero if main threw an exception. 
*/ 
ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1; 
+0

谢谢你的回应,但我正在寻找一个规范性参考。如果你提供一个会很好。 – 2015-02-08 07:19:40