jvm异常捕获

S E*_*S E 3 java debugging jvm exception-handling

所以我最近编写了一个扩展异常的java类,并使用此类的实例来检查案例并在发生错误时抛出自身.我发现当main的调用者捕获到这个异常时,它所引发异常的行是从创建异常的行开始,而不是从抛出它的位置开始.我只是想知道为什么会这样,以及它是否是jvm的预期行为,因为这不是抛出异常的常用方法.如果它是预期的行为,那么这是什么理由,因为看起来抛出异常的行号会更有用(并且可能更容易跟踪堆栈).示例案例遵循预期的行为和意外情况.


普通例外投掷:

1  public class Test
2  {
3   public static void main(String ... args) throws Throwable
4   {
5       switch(5)
6       {
7           case 1: throw new Exception("Exception");
8           case 2: throw new Exception("Exception");
9           case 3: throw new Exception("Exception");
10          case 4: throw new Exception("Exception");
11          case 5: throw new Exception("Exception");
12      }
13  }
14 }
Run Code Online (Sandbox Code Playgroud)

输出:

Exception in thread "main" java.lang.Exception: Exception
    at Test.main(Test.java:11)
Run Code Online (Sandbox Code Playgroud)

我的方法(简化):

1  public class Test
2  {
3   public static void main(String ... args) throws Throwable
4   {
5       Exception e = new Exception("Exception");
6       switch(5)
7       {
8           case 1: throw e;
9           case 2: throw e;
10          case 3: throw e;
11          case 4: throw e;
12          case 5: throw e;
13      }
14  }
15 }
Run Code Online (Sandbox Code Playgroud)

输出:

Exception in thread "main" java.lang.Exception: Exception
    at Test.main(Test.java:5)
Run Code Online (Sandbox Code Playgroud)

use*_*421 7

它所引发的异常行是从创建异常的行开始,而不是抛出它的位置.我只是想知道为什么会这样,以及它是否是jvm的预期行为

是.它不仅是有意的,而且是有记录的.请参阅Javadoc java.lang.Throwable:'throwable包含其创建时线程执行堆栈的快照.如果您不想这样,您可以选择fillInStackTrace()在投掷之前调用它.