Java 输入无效时循环代码时出现故障
我对Java相当陌生,我一直在上一门课,自己做一些小项目。我的计划是,每当由于输入无效字符串(即除了分数和百分比之外的任何内容)而到达最终的if语句时,都要让代码循环回到开头。我似乎不知道出了什么问题,它只循环if/else语句的部分。您犯了一个Java新手犯的典型错误。您本打算使用Java 输入无效时循环代码时出现故障,java,loops,do-while,Java,Loops,Do While,我对Java相当陌生,我一直在上一门课,自己做一些小项目。我的计划是,每当由于输入无效字符串(即除了分数和百分比之外的任何内容)而到达最终的if语句时,都要让代码循环回到开头。我似乎不知道出了什么问题,它只循环if/else语句的部分。您犯了一个Java新手犯的典型错误。您本打算使用=,但无意中未将其键入为=。您可以修复输入错误,但有一个更好的解决方案可以在将来避免此问题 您不应该使用==来测试布尔值。相反,您应该按照以下模式重写代码: do { loop = false
=
,但无意中未将其键入为=
。您可以修复输入错误,但有一个更好的解决方案可以在将来避免此问题
您不应该使用==
来测试布尔值。相反,您应该按照以下模式重写代码:
do {
loop = false;
if (userInput.equalsIgnoreCase("Score")){
System.out.println("You have chose to input a score.\nEnter your score here: ");
score = kbInput.nextDouble();
System.out.println("What was the best possible score?");
total = kbInput.nextDouble();
finalScore = score / total * 100;
percent = (finalScore + "%");
if (finalScore >= 90){
grade = 'A';
} else if (finalScore >= 80){
grade = 'B';
} else if (finalScore >= 70){
grade = 'C';
} else if (finalScore >= 60){
grade = 'D';
} else {
grade = 'F';
}
System.out.println("You got " + percent + ". Which is a letter grade '" + grade + "'.");
loop = false;
} else if (userInput.equalsIgnoreCase("Percent")) {
System.out.println("You have chosen to input a percent.\nEnter your percent here: ");
finalScore = kbInput.nextDouble();
if (finalScore >= 90){
grade = 'A';
} else if (finalScore >= 80){
grade = 'B';
} else if (finalScore >= 70){
grade = 'C';
} else if (finalScore >= 60){
grade = 'D';
} else {
grade = 'F';
}
System.out.println("You got a letter grade '" + grade + "'.");
loop = false;
} else {
System.out.println("Sorry, I don't understand that.");
loop = true;
}
} while (loop = true);
这个建议适用于几乎所有使用布尔操作数的=
。(例外情况是op1==op2
,其中op1或op2
都不是布尔文本。)
更新
从用户那里获取输入的方式也存在问题
userInput
。这可能是一个问题,这取决于需求,以及它是否/如何在循环开始之前初始化while (loop = true) { // BUG!!!
while (loop == true) { // WRONG
while (loop) { // CORRECT
while (loop = false) { // BUG!!
while (loop == false) { // WRONG
while (!loop) { // CORRECT
while(true){
//做事
如果(…){
//我们想终止循环
break;//您犯了Java新手犯的一个典型错误。您本打算使用=
,但无意中将其键入为=
。您可以修复打字错误,但有更好的解决方案可以在将来避免此问题
您不应该使用==
测试布尔值。相反,您应该按照以下模式重写代码:
do {
loop = false;
if (userInput.equalsIgnoreCase("Score")){
System.out.println("You have chose to input a score.\nEnter your score here: ");
score = kbInput.nextDouble();
System.out.println("What was the best possible score?");
total = kbInput.nextDouble();
finalScore = score / total * 100;
percent = (finalScore + "%");
if (finalScore >= 90){
grade = 'A';
} else if (finalScore >= 80){
grade = 'B';
} else if (finalScore >= 70){
grade = 'C';
} else if (finalScore >= 60){
grade = 'D';
} else {
grade = 'F';
}
System.out.println("You got " + percent + ". Which is a letter grade '" + grade + "'.");
loop = false;
} else if (userInput.equalsIgnoreCase("Percent")) {
System.out.println("You have chosen to input a percent.\nEnter your percent here: ");
finalScore = kbInput.nextDouble();
if (finalScore >= 90){
grade = 'A';
} else if (finalScore >= 80){
grade = 'B';
} else if (finalScore >= 70){
grade = 'C';
} else if (finalScore >= 60){
grade = 'D';
} else {
grade = 'F';
}
System.out.println("You got a letter grade '" + grade + "'.");
loop = false;
} else {
System.out.println("Sorry, I don't understand that.");
loop = true;
}
} while (loop = true);
此建议适用于几乎所有使用布尔操作数的=
(例外是op1==op2
,其中op1
或op2
都不是布尔文字。)
更新
从用户那里获取输入的方式也存在问题
userInput
。这可能是一个问题,具体取决于需求以及循环开始之前是否/如何初始化while (loop = true) { // BUG!!!
while (loop == true) { // WRONG
while (loop) { // CORRECT
while (loop = false) { // BUG!!
while (loop == false) { // WRONG
while (!loop) { // CORRECT
while(true){
//做事
如果(…){
//我们想终止循环
break;//由于您仍在努力理解,下面是编程问题的“示例解决方案”:
while (true) {
// do stuff
if (...) {
// we want to terminate the loop
break; // <<------
}
// do more stuff
}
import java.util.Scanner;
导入java.util.NoSuchElementException;
公开课范例{
公共静态void main(字符串[]args){
扫描仪kbdInput=新扫描仪(System.in);
字符串模式=”;
双百分比=-1;
while(true){
System.out.println(“输入‘分数’或‘百分比’:”);
mode=kbdInput.next().toLowerCase();
kbdInput.nextLine();
如果(模式等于(“分数”)|模式等于(“百分比”)){
打破
}
System.out.println(“我不明白,再试一次。”);
}
while(true){
试一试{
如果(模式等于(“分数”)){
System.out.println(“您选择输入分数”);
System.out.println(“在此处输入:”);
double score=kbdInput.nextDouble();
kbdInput.nextLine();
System.out.println(“最好的分数是多少?”);
double total=kbdInput.nextDouble();
kbdInput.nextLine();
百分比=分数/总数*100;
如果(分数>=0.0&&total>0.0&&
百分比>=0.0&&percent=0.0&&percent=0.0&&percent=90){
等级=‘A’;
}否则,如果(百分比>=80){
等级=‘B’;
}否则,如果(百分比>=70){
等级=‘C’;
}否则,如果(百分比>=60){
等级='D';
}否则{
等级=‘F’;
}
System.out.println(“您得到”+百分比+
“%.”表示字母级“+”级“+”;
}
}
}
注意事项:
我已经将其分为两个循环。一个用于请求并验证输入分数的“模式”。第二个用于实际输入分数。(我从您的代码中推断出这是一个要求。这可能不正确。)
与您的版本相比,输入的验证要多得多
我使用了kbdInput.nextLine()
来“消费”在一些地方有不需要的输入。请注意,next
方法会在输入缓冲区中留下它们不想要或无法识别的任何输入字符。如果您不小心,下一次调用nextXxxx
将再次尝试解析相同的字符
我显式地捕获并处理输入数字时的错误;请参阅异常处理程序
我已经搬家了