在幾年前寫(xiě)的一個(gè)網(wǎng)絡(luò)服務(wù)器項(xiàng)目中,我偶爾會(huì)得到一個(gè)非常奇怪的 - 在我看來(lái) - 不可能的NullPointerException. 它發(fā)生在用于在控制臺(tái)上記錄輸出的實(shí)用方法中。這是該方法的錯(cuò)誤摘錄: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 在第一個(gè)catch塊調(diào)用中拋出logWriter.close()。但是:當(dāng)我的 logWriter 是 時(shí)IOException,我的try塊中怎么會(huì)被拋出!= null?Base64.getEncoder()不能拋出 anIOException并且沒(méi)有其他代碼要執(zhí)行。這是我的堆棧跟蹤:Exception in thread "connection_0:0:0:0:0:0:0:1@1544725509" java.lang.NullPointerExceptionat 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,所以互斥應(yīng)該沒(méi)有困難,我不知道為什么會(huì)發(fā)生這種情況。
拋出不可能的 NullPointerException
ibeautiful
2021-10-13 17:37:58