簡體   English   中英

嘗試... catch vs if ... else for exceptions - Java

[英]Try…catch vs if…else for exceptions - Java

如果我想從args[0]數組中獲取用戶輸入怎么辦,但是如果我(用戶)忘了定義​​它,我想要提示 - 是否更好地使用if塊來確定是否數組項是否為空,或者是否捕獲異常? 那就是這個

public class Stuff {
    static Scanner input = new Scanner(System.in);
    public static void main(String[] args) {
        String foo;
        if(args.length > 0) {
            foo = args[0];
        }
        else {
            foo = getString("Input? ");
        }
    }
    public static String getString(String prompt) {
        System.out.print(prompt + " ");
        String answer = input.nextLine();
        return answer;
    }   
}

好或壞比

public class Stuff {
    static Scanner input = new Scanner(System.in);
    public static void main(String[] args) {
        String foo;
        try {
            foo = args[0];
        }
        catch(ArrayIndexOutOfBoundsException e) {
            foo = getString("Input? ");
        }
    }
    public static String getString(String prompt) {
        System.out.print(prompt + " ");
        String answer = input.nextLine();
        return answer;
    }   
}

您的第一個示例仍將拋出異常,因為在if語句中您仍在訪問不存在的索引。

如果要使用if語句,則應檢查數組的長度是否大於您嘗試訪問的索引,例如:

if(args.length > 0)
    foo = args[0];

IMO,if-else在這種情況下更好/更快。

當你在一個方法中並且你想告訴調用者出錯的時候會使用拋出異常,並且你不能用返回值來做。

但正如喬恩泰勒所說,你的if語句不會那樣。

你需要測試args.length而不是讀取args[0]

但除了該錯誤之外,最好使用if/else ,原因如下:

  • 它使代碼更清晰
  • 它具有更好的性能(雖然在這種情況下不相關)
  • 沒有異常情況(預計args數組在某些情況下可能為空,例如“用戶錯誤”,因此代碼應該能夠處理它)。 應該為不應發生的特殊情況保留例外投擲。

您真正需要的只是一行代碼。

final String foo = args.length > 0? args[0] : getString("Input? ");

使用if塊來檢查數組是否為空是容易且快速的。

鑒於Jon Taylor所證明的更正,我更喜歡if的版本。

不僅僅是速度增益(在你的例子中我認為不會引人注意),而是因為帶有if的代碼解釋了它的意圖,簡化了代碼的未來維護。

暫無
暫無

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

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