以下代码是注册(非现有)路径以观看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是每个线程的个体,该线程取决于该线程所涉及的方法(堆栈)。任何多线程应用程序都是同一问题。您可以在此处查看详细信息以调试多线程代码。