即使条件不成立,Java 代码也会打印 Exception 中给出的消息

标签 java illegalargumentexception

我正在测试我的用户输入以查看它是否有效。如果无效,则应抛出 IllegalArgumentException。但是,无论我的输入是什么,gameLogic 函数前几行中的 IllegalArgumentException 都会被抛出。结果是程序打印“You're only allowed to Enter Rock,Pa,Scissors or -1 in this game.”无论我输入什么。

import java.util.Scanner;
import java.util.Random;
class RockPaperScissors
{
    private static double mUserWinCount = 0;
    private static double mCpuWinCount = 0;
    private static double mUserLossCount = 0;
    private static double mCpuLossCount = 0; 
    private static double mDrawCount = 0;
    private static double mGameCount = 0;
    private static String mCpuInput;
    private static String mUserInput;


    public static void main(String [] args)
    {

         try
         {
             gameLogic(cpuInput(),userInput());
         }
         catch(IllegalArgumentException iae)
         {
             System.out.println(iae.getMessage());
         }


    }

    static String cpuInput()
    {
        Random random = new Random (System.currentTimeMillis());
        int RandomNumber=random.nextInt(3);
        if (RandomNumber == 0)
        mCpuInput = "Rock";
        else if (RandomNumber == 1)
        mCpuInput = "Paper";
        else
        mCpuInput = "Scissors";

        return mCpuInput;
    }

    static String userInput()
    {
        System.out.println("Enter Rock, Paper or Scissors, enter -1 in order to exit:- ");
        mUserInput = new Scanner(System.in).next();

        return mUserInput;

    }

    static void gameLogic(String cpuInput, String userInput)
    {
      if(!userInput.equalsIgnoreCase("Rock") || !userInput.equalsIgnoreCase("Paper") || !userInput.equalsIgnoreCase("Scissors") || !userInput.equals("-1"))
      {
         throw new IllegalArgumentException("You're only permitted to enter Rock, Paper, Scissors or -1 in this game.\n");
      }    

      if(userInput.equals("-1"))
      {
          score();
          System.exit(0);
      }
      System.out.println("CPU entered "+cpuInput+", User entered "+userInput);  
      String [] args = new String[0];

      if(userInput.equalsIgnoreCase(cpuInput))
      {
          System.out.println("It's a draw!");
          mDrawCount++;
          mGameCount++;
      }
      if(userInput.equalsIgnoreCase("Rock") && cpuInput.equalsIgnoreCase("Scissors") || userInput.equalsIgnoreCase("Paper") && cpuInput.equalsIgnoreCase("Rock") || userInput.equalsIgnoreCase("Scissors") && cpuInput.equalsIgnoreCase("Paper"))
      {
         System.out.println("User wins!"); 
         mUserWinCount++; 
         mCpuLossCount++;
         mGameCount++;
      }  
      if(cpuInput.equalsIgnoreCase("Rock") && userInput.equalsIgnoreCase("Scissors") || cpuInput.equalsIgnoreCase("Paper") && userInput.equalsIgnoreCase("Rock") || cpuInput.equalsIgnoreCase("Scissors") && userInput.equalsIgnoreCase("Paper"))
      {
         System.out.println("CPU wins!"); 
         mCpuWinCount++; 
         mUserLossCount++;
         mGameCount++;
      }

      main(args);
    }



    static void score()
    { 
       if (mGameCount==0)
       {
          System.out.println("No games have been played..");
       }    
       else 
       {
           double userWinPercentage = (mUserWinCount / mGameCount) * 100;
           double userLossPercentage = (mUserLossCount / mGameCount) * 100;
           double cpuWinPercentage = (mCpuWinCount / mGameCount) * 100; 
           double cpuLossPercentage = (mCpuLossCount / mGameCount) * 100; 
           double drawPercentage = (mDrawCount/mGameCount) * 100;

           System.out.println("Number of Games Played- " + mGameCount);

           System.out.println("Number of Draws- "+ mDrawCount);
           System.out.println("Percentage of Draws "+ drawPercentage + "%");

           System.out.println("Number of Wins by User- " + mUserWinCount);
           System.out.println("User's Win Percentage- " + userWinPercentage + "%");
           System.out.println("Number of Losses by User- " + mCpuLossCount);
           System.out.println("User's Loss Percentage- " + userLossPercentage + "%");

           System.out.println("Number of Wins by CPU- " + mCpuWinCount);
           System.out.println("CPU's Win Percentage- " + cpuWinPercentage + "%");
           System.out.println("Number of Losses by CPU- " + mCpuLossCount);
           System.out.println("CPU's Loss Percentage- " + cpuLossPercentage + "%");
       } 
    }    

最佳答案

在这一行

if(!userInput.equalsIgnoreCase("Rock") || !userInput.equalsIgnoreCase("Paper") || !userInput.equalsIgnoreCase("Scissors") || !userInput.equals("-1"))

使用&&,而不是||

if(!userInput.equalsIgnoreCase("Rock") && !userInput.equalsIgnoreCase("Paper") && !userInput.equalsIgnoreCase("Scissors") && !userInput.equals("-1"))

您可以使用真值表的形式来理解原因:

| Input      | A | B | C | D | || Result | && Result |
|------------+---+---+---+---+-----------|-----------|
| "Rock"     | F | T | T | T | T         | F         | 
| "Paper"    | T | F | T | T | T         | F         |
| "Scissors" | T | T | F | T | T         | F         |
| "-1"       | T | T | T | F | T         | F         |
| "foo"      | T | T | T | T | T         | T         |

但是,从设计的角度来看,您可能希望重组代码以要求用户在输入不正确时重复输入,而不是仅仅终止游戏一个异常(exception)。

关于即使条件不成立,Java 代码也会打印 Exception 中给出的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31771599/

相关文章:

java - IllegalArgumentException Surface.nativeLockCanvas,编排器,BufferQueue

java - Eclipse 打开声明/实现悬停菜单为空

java - Thread.start() 不初始化 run()

Java Reflection - 获取数组对象的大小

android - 使用 WindowManager.LayoutParams.TYPE_KEYGUARD 时,最小目标必须小于 14

android - 来自 gluUnProject 的 IllegalArgumentException

java - 通过 ArrayList 正在更新 + Java

java - 如何监听 JavaFX tableview 中行的取消选择?

java - Android:图像的大小会影响SURF的处理时间

java - 非法参数异常 readExceptionFromParcel