用Java输入验证

时间:2014-10-11 01:08:00

标签: java string validation boolean

我已经尝试了很多次来让它发挥作用。我想这样做,如果用户输入的内容不是要输入的内容,那么它会给出错误消息并提示他们输入新的答案。但是,每次尝试此操作时,无论输入什么,它都会显示错误消息(我的错误消息),即使它是正确的。帮助

import java.util.Random;
import java.util.Scanner;
public class RandomSelect 
{
    public static void main(String[] args) 
    {
         String [] arr = {"rock", "paper", "scissors"};
         Random random = new Random();
         Scanner scan = new Scanner(System.in);
         System.out.println("Please select: rock, paper, or scissors?");
         String myChoice = scan.nextLine();
         boolean myChoiceIsntCorrect = false;
         if ((!myChoice.equalsIgnoreCase("rock")) || (!myChoice.equalsIgnoreCase("paper")) || (!myChoice.equalsIgnoreCase("scissors")))
         {
            myChoiceIsntCorrect = true;
         }
         while ( myChoiceIsntCorrect == true )
         {
            System.out.println("Your input wasn't either rock, paper, or scissors. Please select one of the 3.");
            myChoice = scan.nextLine();
         }

         int select = random.nextInt(arr.length); 
         System.out.println("Computer selected " + arr[select] + ".");

         if (arr[select] == "rock" && myChoice.equalsIgnoreCase("paper"))
            System.out.println("You win!");
         if (arr[select] == "rock" && myChoice.equalsIgnoreCase("scissors"))
            System.out.println("You lose!");
         if (arr[select] == "rock" && myChoice.equalsIgnoreCase(arr[select]))
            System.out.println("It's a tie!");
         if (arr[select] == "paper" && myChoice.equalsIgnoreCase("rock"))
            System.out.println("You lose!");
         if (arr[select] == "paper" && myChoice.equalsIgnoreCase("scissors"))
            System.out.println("You win!");
         if (arr[select] == "paper" && myChoice.equalsIgnoreCase(arr[select]))
            System.out.println("It's a tie!");
         if (arr[select] == "scissors" && myChoice.equalsIgnoreCase("paper"))
            System.out.println("You lose!");
         if (arr[select] == "scissors" && myChoice.equalsIgnoreCase("rock"))
            System.out.println("You win!");
         if (arr[select] == "scissors" && myChoice.equalsIgnoreCase(arr[select]))
            System.out.println("It's a tie!");
    }
}

我没有使用布尔值尝试过它,并认为布尔值可能有效。但它无论是否有效都没有。我究竟做错了什么?是的,我是java的新手。我正在学校atm学习java课程。

5 个答案:

答案 0 :(得分:0)

if ((!myChoice.equalsIgnoreCase("rock")) || (!myChoice.equalsIgnoreCase("paper")) || (!myChoice.equalsIgnoreCase("scissors"))) {
    myChoiceIsntCorrect = true
}

并将其写成文字:

  

如果我的选择不是"摇滚"或者如果我的选择不是“纸张”#34;或者如果我的选择不是"剪刀",我的选择是不正确的。

现在将您的选择设置为"rock"

我的选择是"摇滚"。我的选择不是"#34;所以说明我的选择是不正确的。

使用&&

并阅读:How do I compare strings in Java?

答案 1 :(得分:0)

if ((!myChoice.equalsIgnoreCase("rock")) || (!myChoice.equals("paper")) || (!myChoice.equals("scissors")))
{
   myChoiceIsntCorrect = true;
}

问题在于,如果声明,你说的是选择不是摇滚或不是纸或不是剪刀。 当用户输入其中一个时,它将使另一个失败。

尝试使用&&而不是标志。

答案 2 :(得分:0)

您的输入验证存在两个问题,第一个是,正如其他人指出的那样,您需要使用&&不是||因为通过使用if我的输入不等于或不等于b或不等于c,你说输入必须等于a,b和c,因为如果它不等于任何他们,你将获得真正的价值。第二个问题是你永远不会在循环中更改myChoiceIsntCorrect,这意味着一旦进入该循环,myChoiceIsntCorrect将始终评估为true,程序将永远循环。

答案 3 :(得分:0)

这里有两个问题。

首先,你的while循环将永远运行,因为你没有在循环中更新myChoiceIsntCorrect。你应该把它改成这样的东西:

boolean invalidChoice = true;
do {
    myChoice = scan.nextLine();
    if ((!myChoice.equalsIgnoreCase("rock")) || (!myChoice.equals("paper")) || (!myChoice.equals("scissors"))) {
        System.out.println("Your input wasn't either rock, paper, or scissors. Please select one of the 3.");
    } else {
        invalidChoice = false;
    }
} while ( invalidChoice );

请注意,您可以通过反转if和else子句来简化if。

其次,您要将字符串与==进行比较。在java中,==比较引用。像"thing" == "thing"这样的东西总是返回false,因为两个"thing"是不同的对象。您arr[select] == "..."的ifs需要替换为"...".equals(arr[select])

答案 4 :(得分:0)

你已经有几个事情发生了。

  1. 如果此代码块正确,则会导致无限循环。观察:

    boolean myChoiceIsntCorrect = false;
     if ((!myChoice.equalsIgnoreCase("rock")) || (!myChoice.equalsIgnoreCase("paper")) || (!myChoice.equalsIgnoreCase("scissors")))
     {
        myChoiceIsntCorrect = true;
     }
     while ( myChoiceIsntCorrect == true )
     {
        System.out.println("Your input wasn't either rock, paper, or scissors. Please select one of the 3.");
        myChoice = scan.nextLine();
     }
    

    您永远不会更新myChoiceIsntCorrect

    相反,考虑将检查逻辑移动到另一个方法,并将循环更改为do...while,这样您就可以获得与错误检查的好处相结合的好处。你还想修复你的布尔值;在这里,我把它改为肯定而不是消极(这会导致混淆)。

    private boolean valid(String word) {
        return myChoice.equalsIgnoreCase("rock") ||
               myChoice.equalsIgnoreCase("paper") ||
               mychoice.equalsIgnoreCase("scissors");
    }
    
    // block of code to follow
    String myChoice;
    do {
        myChoice = scan.nextLine();
    } while(!valid(myChoice));
    
  2. 您在一个实例中正确检查字符串,但在另一个实例中没有:

    if (arr[select] == "rock" && myChoice.equalsIgnoreCase("paper"))
    

    这根本不起作用。

    您可以修复损坏的比较,或者使用switch语句使其读取更好一些,并将实际的布尔比较逻辑移动到另一种方法中。

    switch(select) {
        case 0: // Rock
            checkWinCondition(arr[0], myChoice);
            break;
        // other cases and default with a good error message
    }
    
    private boolean checkWinCondition(String computerSelected, String userSelected) {
        if(computerSelected.equalsIgnoreCase(userSelected)) {
            // draw
        } else {
            // other conditions
        }
    }
    
  3. 上述所有方法都旨在提高意图的可读性和清晰度。如果你不想让后者更清晰(即你只想修复错误的==比较),那就没关系。