簡體   English   中英

異常處理切換方法

[英]Exception Handling a switch method

我正在嘗試獲取一個程序,要求某人輸入1到13之間的數字,以便他們進行選擇。 我正在嘗試弄清楚如果他們想相反地輸入一個無效數字或字符或字符串,該如何處理。 到目前為止,這就是我所擁有的...

try {
        attackingUnit = selectUnit(input.nextInt());
        attackerUnitName = attackingUnit.getUnitName();
    } catch (NullPointerException e) {
        System.out.println("Invalid option, please pick a valid option\n");
        showUnitSelection();
        attackingUnit = selectUnit(input.nextInt());
        attackerUnitName = attackingUnit.getUnitName();
}

這是我用於進行選擇本身的方法:

private static Unit selectUnit(int selection) {

    switch (selection) {
        case 1:
            return Unit.GreatSwords;
        case 2:
            return Unit.BlackOrcs;
        case 3:
            return Unit.Bestigor;
        case 4:
            return Unit.ChaosChosen;
        case 5:
            return Unit.MenAtArms;
        case 6:
            return Unit.Executioners;
        case 7:
            return Unit.GraveGuard;
        case 8:
            return Unit.Retributors;
        case 9:
            return Unit.StormVermin;
        case 10:
            return Unit.SwordMasters;
        case 11:
            return Unit.TombGuard;
        case 12:
            return Unit.WildWoodRangers;
        case 13:
            return Unit.Hammerers;
    }

    return null;
}

如果您不介意,我很想確定我的建議不正確。

我認為如果您采用這種方式,代碼看起來會更漂亮:

public enum Unit{

        GreatSwords(1),
        BlackOrcs(2),
        Bestigor(3),
        ChaosChosen(4),
        MenAtArms(5),
        Executioners(6),
        GraveGuard(7),
        Retributors(8),
        StormVermin(9),
        SwordMasters(10),
        TombGuard(11),
        WildWoodRangers(12),
        Hammerers(13)

        private int index;

        public int getIndex() {
            return this.index;
        }

        public static getUnitByIndex(int index) throws IllegalArgumentException {
            return Stream.of(values())
            .filter(unit -> unit.getIndex() == index)
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException("Invalid value");
        }

}

這里的想法是避免空值,因此最好的選擇是使默認情況下,如果switch語句不匹配任何內容,則返回Unit.Unknown 然后,您可以檢查輸入是否等於Unit.Unknown以及是否確實告訴用戶該輸入無效。

為此,首先將一個“未知”成員添加到Unit枚舉中。

然后在默認情況下將以下內容添加到您的switch語句中:

     default:
        return Unit.Unknown;

然后在原始代碼中將其更改為:

       attackingUnit = selectUnit(input.nextInt());
    attackerUnitName = attackingUnit.getUnitName();
    //check if its valid
    if(attackerUnitName==Unit.Unknown){
    //unit is unknown ,tell the user the input was invalid
    } else {
    //input was valid, do what you want to do
    }

您的切換代碼將與默認情況下一樣-

    private static Unit selectUnit(int selection) {

        switch (selection) {
            case 1:
                return Unit.GreatSwords;
            case 2:
                return Unit.BlackOrcs;
            case 3:
                return Unit.Bestigor;
            case 4:
                return Unit.ChaosChosen;
            case 5:
                return Unit.MenAtArms;
            case 6:
                return Unit.Executioners;
            case 7:
                return Unit.GraveGuard;
            case 8:
                return Unit.Retributors;
            case 9:
                return Unit.StormVermin;
            case 10:
                return Unit.SwordMasters;
            case 11:
                return Unit.TombGuard;
            case 12:
                return Unit.WildWoodRangers;
            case 13:
                return Unit.Hammerers;
 default:throw new IllegalArgumentException(""Invalid option, please pick a valid option\n");
        }

    }

您的處理代碼將是-

try {
        attackingUnit = selectUnit(input.nextInt());
        attackerUnitName = attackingUnit.getUnitName();
    } catch (IllegalArgumentException e) {
        System.out.println(e.getMessage);
        showUnitSelection();
        attackingUnit = selectUnit(input.nextInt());
        attackerUnitName = attackingUnit.getUnitName();
}

嘗試這個。 使用異常處理進行簡單驗證是一項昂貴的操作,盡管它可以很好地工作。

attackingUnit = null;
while(attackingUnit == null){
   System.out.println("Invalid option, please pick a valid option\n");
   showUnitSelection();
   attackingUnit = selectUnit(input.nextInt());   
}

attackerUnitName = attackingUnit.getUnitName();

更新:修改您的方法以包括默認大小寫(根據@SteelToe建議)

private static Unit selectUnit(int selection) {

switch (selection) {
    case 1:
        return Unit.GreatSwords;
    case 2:
        return Unit.BlackOrcs;
    case 3:
        return Unit.Bestigor;
    case 4:
        return Unit.ChaosChosen;
    case 5:
        return Unit.MenAtArms;
    case 6:
        return Unit.Executioners;
    case 7:
        return Unit.GraveGuard;
    case 8:
        return Unit.Retributors;
    case 9:
        return Unit.StormVermin;
    case 10:
        return Unit.SwordMasters;
    case 11:
        return Unit.TombGuard;
    case 12:
        return Unit.WildWoodRangers;
    case 13:
        return Unit.Hammerers;
    default:
        return Unit.Unknown;

  }


}

並執行以下操作:

attackingUnit = Unit.Unknown;
while(attackingUnit == Unit.Unknown){
   System.out.println("Invalid option, please pick a valid option\n");
   showUnitSelection();
   attackingUnit = selectUnit(input.nextInt());   
}

attackerUnitName = attackingUnit.getUnitName();

暫無
暫無

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

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