簡體   English   中英

Java輸入驗證

[英]Input validation in Java

我已經嘗試了很多次才能使它起作用。 我要這樣做,如果用戶輸入的內容不是要輸入的內容,那么它會給他們一條錯誤消息,並提示他們輸入新的答案。 但是,每次我嘗試執行此操作時,無論輸入的內容正確無誤,它都會顯示一條錯誤消息(我的錯誤消息)。 救命?

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課程。

采取

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

並說成是:

如果我的選擇不是“石頭”,或者我的選擇不是“紙”,或者我的選擇不是“剪刀”,那么我的選擇是不正確的。

因此,現在將您的選擇設置為"rock"

我的選擇是“搖滾”。 我的選擇不是“紙”。 設置為我的選擇不正確。

使用&&

閱讀: 如何比較Java中的字符串?

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

問題在於if語句,您要說的是選擇不是搖滾還是不是紙還是不是剪刀。 當用戶輸入其中一個時,它將使另一個失敗。

嘗試改用&&符號。

輸入驗證存在兩個問題,第一個是,正如其他人所指出的,您需要使用&&而不是||。 因為通過使用如果我的輸入不等於a或不等於b或不等於c,您是說輸入必須等於a,b和c,因為如果它不等於它們中的任何一個,您將獲得真正的價值。 第二個問題是,您永遠不會在循環內更改myChoiceIsntCorrect,這意味着,一旦進入該循環,myChoiceIsntCorrect將始終求值為true,並且您的程序將永遠循環。

這里有兩個問題。

首先,您的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"類的"thing" == "thing"總是會返回false,因為兩個"thing"是不同的對象。 您的帶有arr[select] == "..." ifs需要替換為"...".equals(arr[select])

您這里發生了件事。

  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 } } 

以上所有方法均旨在提高可讀性和意圖的清晰度。 如果您不想使后者更清晰(即,您只想修正錯誤的==比較),那很好。

暫無
暫無

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

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