1

このコードがひどく書かれていることは知っていますが (Java とプログラミングの初日)、ユーザーからの入力 (サイコロ) を受け取り、そのサイコロから乱数を生成するコードを Java で書いています。ユーザーがプログラムを再起動するかどうかを尋ねる while ループを追加しましたが、実行するたびに、何も入力する前に無効な入力であることがわかります。助けてください。

import java.util.Scanner;
import java.util.Random;
public class Java {
public static void main(String args[]){
    Scanner input = new Scanner(System.in);
    String restartChoice = "y";
    while (restartChoice == "y" || restartChoice == "Y"){
        int choice;
        System.out.println("Please choose which dice you would like to                       roll. 4/6/12 ");
        choice = input.nextInt();
        while (choice != 4 && choice != 6 && choice != 12){
            System.out.println("That is not a valid input, please try again... ");
            choice = input.nextInt();   
        }
        Random rand = new Random(); 
        int value = rand.nextInt(choice) + 1;
        System.out.print("You chose to roll the ");
        System.out.print(choice);
        System.out.print(" sided dice. The number is ");
        System.out.println(value);
        System.out.println("Would you like to restart? Y/N ");
        restartChoice = input.nextLine();
        while (restartChoice != "y" && restartChoice != "n" && restartChoice != "y" && restartChoice != "n"){
            System.out.println("That is not a valid input. Please try again. ");
            restartChoice = input.nextLine();
        }
    }
}

}

4

2 に答える 2

0

String.equals(otherString) を使用する

文字列はオブジェクトであり、プリミティブではありません。現在、文字列のアドレスを比較しています。

于 2013-06-23T18:46:33.257 に答える
0

Scanner#nextInt()改行文字を消費しないため、文字がループに渡されます

while (restartChoice != "y" && restartChoice != "n" && restartChoice != "y" && restartChoice != "n"){
            System.out.println("That is not a valid input. Please try again. ");
            restartChoice = input.nextLine();
}

この改行文字を使用するにはnextLine、すべてのステートメントの後にステートメントを追加します。nextLine

choice = input.nextInt();
input.nextLine();

また、==演算子はオブジェクト参照を比較します。使用String#equals:

while (restartChoice.equals("y") || restartChoice.equals("Y")) {

あなたから守るために、リテラルを最初NullPointerExceptionに置くことができます。より短いステートメント式を与えるためにも使用できますStringequalsIgnoreCaseif

while ("y".equalsIgnoreCase(restartChoice)) {

この変更は、forwhileステートメント式で必要です。

于 2013-06-23T18:42:12.017 に答える