IDEA驚天bug:程式已結束,退出程式碼-1073741819 (0xC0000005)

沉默王二發表於2020-04-25

由於昨天要寫的文章沒有寫完,於是今天早上我四點半就“自然醒”了,心裡面有事,睡覺也不安穩。洗漱完畢後,我開啟電腦,正襟危坐,擺出一副要幹架的態勢,不能再拖了。

要寫的文章中涉及到一串程式碼,關於 Undertow 的一個入門示例,貼出來大家看一下。

public class UndertowTest {
    public static void main(final String[] args) {
        Undertow server = Undertow.builder()
                .addHttpListener(8080"localhost")
                .setHandler(new HttpHandler() {
                    @Override
                    public void handleRequest(final HttpServerExchange exchange) throws Exception {
                        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                        exchange.getResponseSender().send("Hello World");
                    }
                }).build();
        server.start();
    }
}

Undertow 是大名鼎鼎的 Red Hat(紅帽子)公司開發的一款基於 NIO 的高效能 Web 伺服器軟體,不需要單獨安裝軟體,只需要幾行程式碼就可以在 Java 應用程式中啟動一個 Web 服務,就像上面那段程式碼。

前提條件是你已經在 pom.xml 檔案中引入了 Undertow 的依賴。

<dependency>
    <groupId>io.undertow</groupId>
    <artifactId>undertow-core</artifactId>
    <version>2.0.28.Final</version>
</dependency>

沒想到,程式碼在 IDEA 中執行後,竟然非正常退出了!

沒有任何錯誤提示,真的是鬱悶。主機名 localhost 沒有問題,埠 8080 也沒有被佔用,但 main 方法在沒有任何外力的因素下直接結束了。在瀏覽器位址列中輸入 http://localhost:8080 自然也無法顯示“Hello World”。

回看 Run 皮膚中的輸出資訊,唯一讓我感到疑惑的就是下面這行:

程式已結束,退出程式碼-1073741819 (0xC0000005)

正常來說,程式執行的輸出結果如下所示:

程式已結束,退出程式碼0

退出程式碼是 0,表示程式正常結束;退出程式碼是 1073741819,它代表什麼意思呢?

肯定是非正常唄。我第一時間想到的原因是,會不會是我程式碼寫錯了?於是檢視了 Undertow 的官網,一個單詞一個單詞的檢查,甚至上了 beyond compare 進行比較,也沒有找到任何可疑之處。

折騰得夠嗆,於是不得不上了谷歌大法:

換了各種關鍵詞,查閱了各種文章,沒有找到可行的解決辦法。谷歌無果,我想那就試試某度吧,結果搜到了遊戲,天地良心啊。

搜尋引擎靠不住,那就只能靠自己了。於是我寫下了這段程式碼:

public class TestClose {
    public static void main(String[] args) {
        try {
            Thread.sleep(10000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

執行結果大吃一驚。我揉了好幾次眼睛,甚至上了倍清亮眼藥水,結果也是非正常退出,錯誤程式碼和之前的 Undertow 一致。

搞什麼嘛,這可是 Thread.sleep(10000000) 休眠大法啊,也能在一秒內結束,那一定不是 Undertow 的程式碼示例寫錯了,而是 IDEA 在作妖。

事到如今,我想起了被打入冷宮的 Eclipse。同樣的程式碼,程式沒有立即結束掉。

Undertow 的程式碼示例也沒有問題,程式沒有立即結束。

在瀏覽器中輸入 http://localhost:8080 也能正常訪問。

對比之後,問題就很確定了,出在 IDEA 身上,一定是它哪根神經錯亂了。於是換了一下谷歌搜尋的關鍵詞,結果如下所示。

果然也有同行遇到了類似的問題,但文章中提到的原因竟然是金山詞霸的劃詞翻譯,這有點太扯了吧?

雖然有點扯,但的確值得試一試,畢竟山窮水盡了啊,況且我的電腦上真的安裝了金山詞霸,並且是開啟狀態。

那就退出試試唄,結果。。。。。。。。。。真的有用啊。

這次,程式沒有主動結束,這是什麼神奇的操作啊?人生第一次開始懷疑科學了!

既然和金山詞霸有關係,那麼我就腦洞開啟了,是不是因為我裝了漢化外掛的關係?於是我把 IDEA 的漢化外掛禁用,並且在重啟之前開啟了金山詞霸。

結果證明沒關係,程式主動結束了。

於是只好再次退出金山詞霸。沒想到,當我點選 Run 的小圖示再次執行程式時,IDEA 竟然閃退了。看來它們之間的確有著不可告人的祕密,具體原因未知。

不管怎麼說,這個莫名其妙的 bug 是解決了,有必要總結一波經驗心得了,希望能夠給小夥伴們在開發中一些啟發。因為作為程式設計師,面對不會說話的計算機,有時候,真的會遇到一些難以名狀的錯誤,把我們折騰得夠嗆。

經驗一:保持冷靜,切勿暴躁,心態失衡時容易捶滑鼠,捶鍵盤,捶壞了,還得買新的。

經驗二:先從自身程式碼找原因,複製貼上有時候也會出現偏差,這時候,最好就和源頭對比一下。如果肉眼發現不了,上比較工具,靠譜。

經驗三:問谷歌,不要問某度。這年頭,經常聽到一些小夥伴們抱怨說,公司不允許上網,遇到問題時真的無從下手,我只能說這樣的公司真的是閉關鎖國啊。

經驗四:換個環境試一試。同樣的程式碼,環境不同,執行後的解決真有可能不同。IDEA 中出錯,放 Eclipse 中試試;Windows 下出錯,放 Linux 下試試;自己的環境有問題,放同事的環境下試試。

經驗五:搜尋的時候換一下關鍵詞,真的是“柳暗花明又一村”啊。

經驗六:重複以上。

鳴謝

好了,我親愛的讀者朋友,以上就是本文的全部內容了。看完之後,再遇到面試官問 Java 到底是值傳遞還是引用傳遞時,就不用擔心被刁難了。我是沉默王二,一枚有趣的程式設計師。原創不易,莫要白票,請你為本文點贊個吧,這將是我寫作更多優質文章的最強動力。

如果覺得文章對你有點幫助,請微信搜尋「 沉默王二 」第一時間閱讀,回覆【666】更有我為你精心準備的 500G 高清教學視訊(已分門別類)。本文 GitHub 已經收錄,有大廠面試完整考點,歡迎 Star。

相關文章