В проекте веб-сервера, написанном несколько лет назад, я иногда получаю очень странное и - на мой взгляд - невозможное NullPointerException
.Это происходит в служебном методе регистрации выходных данных на консоли.
Это ошибочная выдержка из метода:
try {
Encoder encoder = Base64.getEncoder();
if(logWriter != null) {
logWriter.write(String.valueOf(System.currentTimeMillis()));
logWriter.write(" ");
logWriter.write(String.valueOf(level));
logWriter.write(" ");
logWriter.write(encoder.encodeToString(Thread.currentThread().getName().getBytes()).replaceAll("(?:\\r\\n|\\n\\r|\\n|\\r)", ""));
logWriter.write(" ");
logWriter.write(encoder.encodeToString(log.getBytes()).replaceAll("(?:\\r\\n|\\n\\r|\\n|\\r)", ""));
logWriter.write("\r\n");
logWriter.flush();
}
lastWriterActivity = System.currentTimeMillis();
} catch (IOException e) {
println("Failed to write log to file: " + e, Color.RED);
try {
logWriter.close();
} catch (IOException e1) {
println("### Possible resource leak; unable to close log writer", Color.RED);
}
logWriter = null;
}
, где logWriter
- это BufferedWriter
.NPE выбрасывается в первый блок catch
, вызывающий logWriter.close()
.
Но: как можно добавить IOException
в мой блок try
, в то время как мой logWriter равен != null
?Base64.getEncoder()
не может выдать IOException
, и нет другого кода для выполнения.
Это моя трассировка стека:
Exception in thread "connection_0:0:0:0:0:0:0:1@1544725509" java.lang.NullPointerException
at org.jpuzzle.main.Logger.write(Logger.java:347)
at org.jpuzzle.main.Logger.verbose(Logger.java:187)
at org.jpuzzle.protocol.http.HttpRequest.onRequest(HttpRequest.java:1090)
at org.jpuzzle.network.ConnectionListener$Connection.proceed(ConnectionListener.java:438)
at org.jpuzzle.network.ConnectionListener$Connection.run(ConnectionListener.java:408)
Мой метод - synchronized
, поэтому взаимное исключение должноне усложняйте, и у меня нет идей, почему это может произойти.