簡體   English   中英

當我將SocketException扔回IOException時,為什么Java會抱怨?

[英]Why does java complain when I rethrow SocketException to be caught by IOException?

一般的例外規則是,在捕獲一般異常之前,您要捕獲更具體的異常。 我有一種情況,關閉服務器時會拋出SocketException: socket closed是由IOException捕獲的來自我的偵聽器的,但是我不想在用戶關閉服務器時向用戶顯示該消息。 其他所有內容都可能是實際錯誤,因此應該向他們顯示,因此我捕獲了SocketException ,檢查其消息,如果未socket closed ,則應重新IOExceptionIOException ,以作為IOException進行捕獲和處理。 Java / NetBeans 7.0.1似乎不喜歡這樣。 這是我的代碼:

public void run() {
        while (runner == Thread.currentThread()) {
            System.out.println("waiting for connection...");
            try {
                Socket s = server.accept(); //throws SocketException/IOException
                if (session == null) {
                    session = new ReceiveSession(s, parent);
                } else {
                    s.close();
                }
            } catch (SocketException e) {
                if (!e.getMessage().equals("socket closed")) {
                    throw e; //error line, "unreported exception SocketException"
                }
            } catch (IOException e) {
                e.printStackTrace();
                parent.showError("Someone tried to connect but the connection failed: " + e);
                session = null;
            }
        }

    }

嘗試清潔和構建時,我得到:

error: unreported exception SocketException; must be caught or declared to be thrown
                throw e;
1 error

由於SocketException擴展了IOException ,因此應該由更通用的IOException捕獲。 為什么會出現此錯誤? (順便說一下,在NetBeans中運行項目的效果很好,順便說一句,當服務器關閉時,它不會向用戶顯示異常。)

您的throwtry之外 ,因此,下面的catch不會處理引發的異常。

第二個catch不會捕獲該重新拋出,因為第二個catch並沒有將其拋出在try塊中。 您需要重組代碼。


例如,最直接的重組是這樣的:

public void run() {
    while (runner == Thread.currentThread()) {
        System.out.println("waiting for connection...");
        try {
            try {
                Socket s = server.accept(); //throws SocketException/IOException
                if (session == null) {
                    session = new ReceiveSession(s, parent);
                } else {
                    s.close();
                }
            } catch (SocketException e) {
                if (!e.getMessage().equals("socket closed")) {
                    throw e; //error line, "unreported exception SocketException"
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            parent.showError("Someone tried to connect but the connection failed: " + e);
            session = null;
        }
    }
}

嵌套的嘗試使我哭了一下,但是可以完成工作(老實說,我的頭頂上,我想不出一個更好的方法,不會走得太遠)。

Catch語句從其各自的try塊捕獲異常,而不從列表中的其他catch塊捕獲異常。 您從嘗試之外拋出了異常,因此后續捕獲塊不會捕獲該異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM