0

. Следующий код предназначен для регистрации (не существующего) Пути для просмотра события файловой системы create.Часть Stacktrace пропущена в Exception, регистрируя Path с WatchService для несуществующего файла.

Я вижу, что в трассировке стека отсутствуют некоторые детали.

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 не хватает во второй трассировки стека?

+0

Потому что второй стек из другого потока, созданного WatchService. – RLM

ответ

0

Почему во второй трассировке стека отсутствует тест.Test.register/main?

В принципе, есть две нити, работающие в программе, один является main нить, а другой для nio обработки файлов. JVM stacktrace является индивидуальным для каждого потока, который зависит от методов (стека), с которыми связан поток. Итак, вы получаете исключение stacktrace отдельно для каждого потока.

Вы можете посмотреть here для получения более подробной информации о понимании 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 индивидуально для каждой нити, которая зависит от методов (стека), с которыми связана нить. Это одна и та же проблема с любым многопоточным приложением. Вы можете посмотреть here на детали для отладки многопоточного кода.

+0

Два вопроса 1. В вашем примере исключение не убивает основной поток, но в моем случае это так. 2. Как следует отлаживать проблему, если приложение выходит из строя и нет (правильной) трассировки стека (другими словами, это не ошибка)? –

+0

(1) Моя основная тема не зависит от результата дочерней нити, тогда как ваша. (2) JVM stacktrace является индивидуальным для каждого потока, который зависит от методов (стека), с которыми связан поток. Это одна и та же проблема с любым многопоточным приложением. – developer

+0

Обновленный мой ответ, вы можете посмотреть – developer