亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何捕獲空數組 [0](異常)

如何捕獲空數組 [0](異常)

元芳怎么了 2023-03-23 16:12:14
我目前正在準備考試并正在執行以下任務:我想捕獲“ArrayIndexOutOfBoundsException”。我有以下課程:class Util {    // get the smallest number of the given array    @SuppressWarnings("unused")    public static int minimum(int[] values) {        try {            int min = values[0];            if (values == null) {                throw new NullPointerException();            }            if (values.length > 0) {                for (int i = 1; i < values.length; i++) {                    if (values[i] < min) {                        min = values[i];                    }                }                return min;            } else {                throw new ArrayIsEmptyException();            }        } catch (NullPointerException e) {            System.out.println("Das ist kein Array");        } catch (ArrayIsEmptyException e) {            System.out.println("Das Array ist leer.");        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return 0;    }從主要:public class UtilTest {    // Testprogramm    public static void main(String[] args) {        System.out.println("Die kleinste Zahl ist: " + Util.minimum(new int[] { 1, 6, 4, 7, -3, 2 }));        System.out.println("Die kleinste Zahl ist: " + Util.minimum(new int[0]));        System.out.println(Util.minimum(null));    }}我怎樣才能捕捉到這個輸出的異常:System.out.println("Die kleinste Zahl ist: " + Util.minimum(new int[0]));感謝您的幫助!
查看完整描述

1 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

當發生錯誤時,代碼立即跳出。


在您的代碼中,您正在做的事情在某些情況下會導致錯誤(例如,如果數組變量沒有指向任何內容(為空),或者它是否為空數組),然后您檢查這些條件,毫無意義。


這就像先過馬路,然后檢查是否有汽車駛來。您要么在檢查交通情況之前就已經遇到路障,要么如果您已經安全地過馬路,檢查現在就沒有意義了。


所以,換個角度吧。


具體來說,這段代碼:int min = values[0];


將拋出NullPointerExceptionif valuesis null,并將拋出ArrayIndexOutOfBoundsExceptionif valuesis an empty array。


更一般地說,這個:


catch (Exception e) {

    e.printStackTrace();

}

是非常糟糕的代碼。對于初學者來說,這意味著代碼會在錯誤發生后繼續運行,因此通常您的日志中會充滿大量錯誤消息,即使有一件事情出錯了,更重要的是,異常包含 5 個有用的信息:它的類型、它的消息、它的堆棧跟蹤、它的因果鏈和附加到它的一批被抑制的異常。


最后一個通常不是特別有趣,但其他 4 個非常有用。你扔掉了 4 個有用的東西中的 3 個,只打印堆棧跟蹤。除此之外,你還在到處重復這種風格的代碼。


所以不要。


永遠不要編寫捕獲異常的代碼只是為了記錄或打印它。只是.. 不要抓住它,讓頂級異常處理程序(它打印所有有用的信息然后關閉線程,這是一個很好的默認設置)處理它。如果是已檢查異常,則添加throws X到方法簽名中,其中 X 是已檢查異常。例如:


好的代碼:


public void deleteFile(String fileName) throws IOException {

    Files.delete(Paths.get(fileName));

}

錯誤代碼:


public void deleteFile(String fileName) {

    try {

        Files.delete(Paths.get(fileName));

    } catch (IOException e) {

        System.err.println("Something went wrong deleting file!");

        e.printStackTrace();

    }

}

第二段代碼:

  1. 打印無用信息(“出了點問題”,是的,我知道,我正在查看異常)

  2. 使用糟糕的風格;感嘆號在錯誤消息中沒有用。

  3. 代碼靜默繼續,因此任何調用此方法的代碼都無法判斷刪除是否失敗。也可能會出現更多錯誤

  4. 丟棄大量信息;IOException 可能有一條消息,例如“文件被標記為只讀”,您現在已經將其丟棄。

  5. 更長

這只是它出了什么問題的一個例子。


查看完整回答
反對 回復 2023-03-23
  • 1 回答
  • 0 關注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號