簡體   English   中英

調用方法時的異常處理

[英]Exception handling when calling a method

假設我有一個方法“ position”,該方法接受2個坐標並創建一個位置對象以將其保持在其中。為確保這些坐標不會超出范圍,將引發InvalidPositionException。

public Position(int x, int y) throws InvalidPositionException {
    try {
        if (x > 10 || x < 1 || y>10 || y<1) {   
            throw new InvalidPositionException("Position x = "+x+", y = "+y+" is out of bounds");
        } else {
            setX(x);
            setY(y);
        }
    } catch (InvalidPositionException e) {
        System.err.println(e);
    }
}

如果現在我想從另一個類創建一個新的位置對象,則會收到錯誤消息“未報告的異常InvalidPositionException;必須被捕獲或聲明為拋出”

如何在不創建新位置對象的方法的方法簽名中聲明“拋出”的情況下進行這項工作?

轉到InvalidPositionException類,並使其繼承自RuntimeException

RuntimeException是未經檢查的異常,這意味着編譯器不會強迫您處理它們。 當您超出數組范圍時,這就是一個很好的例子。 您不必每次訪問數組時都需要編寫處理此問題的代碼(例如我們處理IOException )。 一個類似的示例是NullPointerException 但是,在兩種情況下,您都可以編寫代碼來捕獲異常並對其進行處理。

如果您是經過檢查的異常純粹主義者並且不希望使用try-catch塊,則解決該問題的另一種方法是在輸入數據的任何屏幕中清理數據,並說該數據超出了該范圍。

摘自Joshua Bloch的Effective Java

項目72:贊成使用標准例外

將專家程序員與經驗不足的程序員區分開的一個屬性是,專家努力並且通常實現高度的代碼重用。 例外也不例外,代碼重用是一件好事。 Java庫提供了一組例外,這些例外涵蓋了大多數API的大多數拋出異常的需求。 ...

IllegalArgumentException的使用場合-非null參數值不合適

此代碼是創建IllegalArgumentException的經典示例。 它擴展了RuntimeException,因此您不需要捕獲它。

public Position(int x, int y) {
    if (x > 10 || x < 1 || y>10 || y<1) {   
        throw new IllegalArgumentException("Position x = "+x+", y = "+y+" is out of bounds");
    } 
    setX(x);
    setY(y);
}

PS,您可能只需將setX(x)替換為this.x = x並且對y替換相同(如果這些設置器中沒有多余的邏輯)。

您需要在創建Position對象的語句周圍包括try-catch塊。

Position myPosition = null;
try {
  myPosition = new Position(a, b);
}
catch (InvalidPositionException e) {
  // do something if the exception is caught
}

暫無
暫無

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

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