StackTrace的一部分是在异常中错过,而在WatchService中为非现有文件注册路径



以下代码是注册(非现有)路径以观看create文件系统事件。

我看到堆栈跟踪中缺少一些细节。

public final class Test
{
  public static void main(String[] args) throws Throwable
  {
    Path path = Paths.get("NonExistentFile.txt");
    WatchService watchService = path.getFileSystem().newWatchService();
    try
    {
      register(true, path, watchService);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    System.err.println();
    try
    {
      WatchKey watchKey = register(false, path, watchService);
      watchKey.cancel();
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }
  static WatchKey register(boolean exception, Path path, WatchService watchService) throws IOException
  {
    if (exception)
      throw new RuntimeException("Test Runtime Exception");
    return path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
  }
}

例外堆栈跟踪:

java.lang.RuntimeException: Test Runtime Exception
  at test.Test.register(Test.java:44)
  at test.Test.main(Test.java:20)
java.nio.file.NoSuchFileException: NonExistentFile.txt
  at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
  at sun.nio.fs.UnixException.asIOException(UnixException.java:111)
  at sun.nio.fs.LinuxWatchService$Poller.implRegister(LinuxWatchService.java:246)
  at sun.nio.fs.AbstractPoller.processRequests(AbstractPoller.java:260)
  at sun.nio.fs.LinuxWatchService$Poller.run(LinuxWatchService.java:329)
  at java.lang.Thread.run(Thread.java:745)

问题:为什么在第二个堆栈跟踪中缺少test.Test.register/main

为什么在第二个堆栈跟踪中缺少test.test.test.register/main?

基本上,程序中有两个线程,一个是main线程,另一个用于nio文件处理。JVM stackTrace是每个线程的个体,该线程取决于该线程所涉及的方法(堆栈)。因此,您正在获得每个线程的异常堆栈。

您可以在这里查找有关理解StackTrace的更多详细信息。

您可以在下面的一个简单示例中复制相同的东西:

public static void main(String[] args) {
         new Thread(() -> {
                 throw new RuntimeException("My Exception 
        Message from child Thread **");
         }).start();
         throw new RuntimeException("My Exception  Message 
             from main Thread ** ");
     }

输出:

Exception in thread "main" Exception in thread "Thread-0" java.lang.RuntimeException: 
   My Exception  Message from child Thread **
    at com.Testing.lambda$0(Testing.java:13)
    at java.lang.Thread.run(Thread.java:745)
java.lang.RuntimeException: My Exception  Message from main Thread **
    at com.myproject.samples.Testing.main(Testing.java:16)

在您的示例中,例外不是杀死主线程,但就我而言,它确实是吗?

我的主线程不依赖于子线的结果,而您的主线则是。

如果应用程序崩溃并且没有(正确的)堆栈跟踪,应该如何调试问题(换句话说是这样 不是错误)?

JVM stacktrace是每个线程的个体,该线程取决于该线程所涉及的方法(堆栈)。任何多线程应用程序都是同一问题。您可以在此处查看详细信息以调试多线程代码。

相关内容

  • 没有找到相关文章

最新更新