簡體   English   中英

在java中拋出異常重構

[英]throws Exception refactoring in java

我正在更改我的代碼

Implementation 1 : 
public User getUser(String userid) {
    User user;
    try {
        // some code to get User

    }catch(InterruptedException e) {
        throw new CustomException();
    }

    return user;
}

Implementation 2 : 
public User getUser(String userid) {
    User user;

    try {
        // some code to get User

    }catch(InterruptedException e) {
        SomeHandlerInProject.throwCustomErr();
    }

    return user;
}


class SomeHandlerInProject {
    public static void throwCustomErr() {
        throw new CustomException();
    }
}

實現 2 給出了用戶可能未初始化的編譯錯誤,有人可以幫助我在這里缺少什么,對我來說似乎很奇怪。

編譯器並不知道SomeHandlerInProject.throwCustomErr()總是拋出異常,所以就編譯器代碼分析而言,該方法可能會正常返回。

如果是這樣, user的價值是什么? 它沒有值,所以編譯器會抱怨它,因為它應該。 請記住,類SomeHandlerInProject可以更改為不拋出異常,而不必使用getUser()方法重新編譯該類,因此編譯器抱怨它是正確的。

即使知道該方法總是會拋出異常,您仍然必須編寫代碼,就好像它不會一樣,因此您必須為user賦值,或者通過初始化它,或者通過在catch塊中為其賦值。

如果目標是共享構建異常所需的邏輯,您應該讓輔助方法return異常,而不是拋出異常,並讓調用者執行throw 這樣編譯器就不會抱怨:

public User getUser(String userid) {
    User user;
    try {
        // some code to get User
    } catch (InterruptedException e) {
        throw SomeHandlerInProject.buildCustomErr();
    }
    return user;
}

class SomeHandlerInProject {
    public static CustomException buildCustomErr() {
        return new CustomException();
    }
}

堆棧跟蹤保持不變,因為它是為調用堆棧快照的構造函數位置。

暫無
暫無

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

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