为了账号安全,请及时绑定邮箱和手机立即绑定

Java 重复的局部变量。难倒

Java 重复的局部变量。难倒

至尊宝的传说 2022-08-03 15:51:42
我对编码是全新的,并试图让我的第二个程序工作。它的作用非常简单,但它在第24行“重复的局部变量确认”上抛出了一个错误。不能完全弄清楚为什么它不喜欢我正在做的事情。Scanner userInput = new Scanner(System.in);  char confirm;do{System.out.println("Welcome to the story teller");System.out.println("What is your name?");String name = userInput.nextLine();System.out.println("How old are you?");int age = userInput.nextInt();System.out.println("What country would you like to visit?");String country = userInput.nextLine();System.out.println("Great! So your name is" + name + ", you are" + age + "years old and you would like to visit" + country + "?");System.out.println("Press Y to continue or N to start over");char confirm = userInput.next().charAt(0);  if (confirm !='y' || confirm !='n'){ System.out.println("Sorry that input is not valid, please try again"); }  else {  System.out.println(name + "landed in" + country + "at the age of" + age + ".");  }} while(confirm == 'Y'|| confirm == 'y');
查看完整描述

4 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

因为您的“确认”变量已在作用域(第二行)中定义。如果要赋值,只需编写confirm = userInput.next().charAt(0);



查看完整回答
反对 回复 2022-08-03
?
守着一只汪

TA贡献1872条经验 获得超3个赞

你声明了两次。将第二个声明更改为仅分配给它,您应该没问题:confirm

confirm = userInput.next().charAt(0);
// No datatype, so you aren't declaring confirm, just assigning to it


查看完整回答
反对 回复 2022-08-03
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

似乎除了重新声明变量之外,还有一个或多个问题 -confirm

问题 1:

后。它不会提示输入国家/地区,而是提示 。int age = userInput.nextInt()Press Y to continue or N to start over

此问题的原因:

由于您使用的是扫描仪,因此只会从输入中获取整数值,并且将跳过换行符。int age = userInput.nextInt();\n

修复

作为解决方法,我在之后添加了这样,它将在之后消耗字符。userInput.nextLine();int age = userInput.nextInt();\nnextInt()

问题 2:

在第 1 次迭代后,此行将导致问题。confirm = userInput.next().charAt(0);

此问题的原因:

在第 2 次迭代中,您不会收到输入名称的提示,因为该行将采用上次迭代作为输入,并将跳过并提示 age 。String name = userInput.nextLine();\nHow old are you?

修复

作为一种解决方法,我在之后添加了这样一个,它将在之后使用字符,并且下一次迭代将按预期进行。userInput.nextLine();confirm = userInput.next().charAt(0);\nuserInput.next().charAt(0)

问题 3:

这个逻辑只期望和在,但在这里你是期望和两者。if (confirm !='y' || confirm !='n')ynlowercasewhile(confirm == 'Y'|| confirm == 'y')yY

修复 - 我已经在下面的代码中添加了必要的更改,但建议您将其更改为开关盒。

注意:

不建议在每次输入后都这样做,您可以简单地解析它。有关详细信息,请参阅此处userInput.nextLine()

我不推荐它,但这会让你的程序工作

Scanner userInput = new Scanner(System.in);

    char confirm;


    do {


        System.out.println("Welcome to the story teller");

        System.out.println("What is your name?");

        String name = userInput.nextLine();


        System.out.println("How old are you?");

        int age = userInput.nextInt();


        userInput.nextLine(); //adding this to retrieve the \n from nextint()


        System.out.println("What country would you like to visit?");

        String country = userInput.nextLine();


        System.out.println("Great! So your name is " + name + ", you are " + age

                + "years old and you would like to visit " + country + " ?");

        System.out.println("Press Y to continue or N to start over");

        confirm = userInput.next().charAt(0);


        userInput.nextLine(); //adding this to retrieve the \n this will help in next iteration


        System.out.println(name + " landed in " + country + " at the age of " + age + ".");


        if (confirm == 'y' || confirm == 'Y') {

            continue; // keep executing, won't break the loop

        } else if (confirm == 'n' || confirm == 'N') {

            break; // breaks the loop and program exits.

        } else {

            System.out.println("Sorry that input is not valid, please try again");

            // the program will exit

        }

    } while (confirm == 'Y' || confirm == 'y');

}

建议您使用 switch case 而不是 if 比较并解析字符和整数输入并删除任意添加作为解决方法。confirmationuserInput.nextLine()


查看完整回答
反对 回复 2022-08-03
?
暮色呼如

TA贡献1853条经验 获得超9个赞

修复的另一个选项是删除不必要的声明char confirm;

并仅在需要时使用

char confirm = userInput.next().charAt(0);

根据@ScaryWombat建议,您需要更改变量的作用域(当前作用域与whiledo )


查看完整回答
反对 回复 2022-08-03
  • 4 回答
  • 0 关注
  • 204 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信