簡體   English   中英

如何拋出並捕獲IllegalArgumentException?

[英]How do I throw and catch an IllegalArgumentException?

所以基本上我有一個GridWorld項目,我現在正在AP Comp Sci課上做。 我在做Pacman。 這是我的act方法的代碼(對於那些不熟悉GridWorld的人來說,每當一個actor被要求做出新動作時都會調用act方法):

public void act()
{
    Location loc = getLocation();

    if(direction==null) {
    }

    else if(direction.equals("NORTH")) {
        Location next = loc.getAdjacentLocation(loc.NORTH);
        if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) {
            if(getGrid().get(next) instanceof Food)
                addFood();
            moveTo(next);
            direction = "NORTH";
        }
    }

    else if(direction.equals("SOUTH")) {
        Location next = loc.getAdjacentLocation(loc.SOUTH);
        if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) {
            if(getGrid().get(next) instanceof Food)
                addFood();
            moveTo(getLocation().getAdjacentLocation(getLocation().SOUTH));
            direction = "SOUTH";
        }
    }

    else if(direction.equals("EAST")) {
        Location next = loc.getAdjacentLocation(loc.EAST);
        if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) {
            if(getGrid().get(next) instanceof Food)
                addFood();
            moveTo(getLocation().getAdjacentLocation(getLocation().EAST));
            direction = "EAST";
        }

        else if(getLocation().getCol()==20 && getLocation().getRow()==9) {
            moveTo(new Location(9,0));
            direction = "EAST";
        }
    }

    else if(direction.equals("WEST")) {
        Location next = loc.getAdjacentLocation(loc.WEST);
        if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) {
            moveTo(getLocation().getAdjacentLocation(getLocation().WEST));
            direction = "WEST";
        }

        else if(getLocation().getCol()==0 && getLocation().getRow()==9) {
            moveTo(new Location(9,20));
            direction = "WEST";
        }
    }
}

在最后兩個if語句中出現奇怪措辭的原因是bc我希望Pacman能夠在真實游戲中傳送。 現在,當我運行游戲時,大約90%的時間它可以工作但是在另外10%中我得到了IllegalArgumentException bc它說我試圖移動到一個不在板上的地方(例如。(9,-1) )和(9,21))。 我想知道如何抓住或拋出或我需要做些什么來阻止這種情況發生。 我從來沒有使用過捕獲或拋出,所以請嘗試解釋你的推理謝謝!

要拋出異常,請使用關鍵字throw 要捕獲,請使用try / catch構造。 有關詳細信息,請參閱此

對於你的情況,你會做這樣的事情 - 這是一個測試用例:

try {
    throw new IllegalArgumentException("Threw an IllegalArgumentException");
} catch(IllegalArgumentException e) {
    System.out.println("Caught an IllegalArgumentException..." + e.getMessage());
}

但是,您應該查看代碼以了解為什么拋出IllegalArgumentException並修復該部分。 使用異常和try / catch是針對意外事件 ,而不是您期望發生的事件以及您可以更好地處理的事件。

例如,無法找到文件時拋出FileNotFoundException 您通常會嘗試/捕獲它,以便在找不到文件時執行某些操作。 但是,如果在合理數量的情況下預計文件可能不存在,那么首先檢查文件是否存在然后確實是否確實存在。

您可以捕獲IllegalArgumentException,就像捕獲正常異常一樣。 通常,IAE來自使程序無效的狀態,因此如果收到負索引,則需要將其轉換為等效的有效值。 就您的程序的運行方式而言,通常負面的索引引用並不是一件好事。

看起來你希望能夠抓住你的異常以保持你的游戲運行,並且你對參數錯誤感到滿意。 因此,您有效地將異常用於程序的邏輯,從而破壞了它們的目的。

IllegalArgumentException是運行時異常,您不應該捕獲它們,程序應該以某種方式失敗。 只需確保傳遞的參數正確無誤。

您可以使用Google上的眾多教程中的一個輕松學習捕獲和拋出異常。

但是,IllegalArgumentException意味着您發送給第三方API的某些參數是錯誤的。 您應該調試應用程序並查看導致問題的代碼,檢查API文檔以查看您正在破壞的參數的要求/約束​​並進行修復。

當然,你只能添加一個catch(IllegalArgunentException e)並且不做任何事情。 您的程序可能會運行,但可能會在以后崩潰。

暫無
暫無

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

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