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);
我是Java的新手,我自己上课并做迷你项目。我的计划是每当你到达最后的if语句时,由于输入一个无效的字符串(即除了Score和Percent之外的任何内容),代码循环回到开头。我似乎无法弄清楚什么是错的,它只是循环if / else语句的部分。
答案 0 :(得分:4)
你犯了一个Java新手所犯的经典错误。您打算使用==
,但意外错误输入=
。你可以解决这个问题,但是有一个更好的解决方案可以避免将来出现这个问题。
您不应该使用==
来测试布尔值。相反,您应该按照以下模式重写代码:
while (loop = true) { // BUG!!!
while (loop == true) { // WRONG
while (loop) { // CORRECT
while (loop = false) { // BUG!!
while (loop == false) { // WRONG
while (!loop) { // CORRECT
这个建议几乎适用于==
与布尔操作数的每一次使用。 (例外情况为op1 == op2
,其中 op1
或op2
布尔文字。)
<强>更新强>
您从用户那里获得输入的方式也存在问题。
您没有在循环中阅读userInput
。这可能是一个问题,取决于要求,以及在循环开始之前是否/如何初始化。
如果用户输入错误的浮点数,您将收到异常。这包括用户输入类似“100.0点”的情况。
您不验证输入;例如测试负分数,分数大于最大值,百分比超出范围0..100。
最后,你终止循环的方式是笨重的。做这样的事情会更好:
while (true) {
// do stuff
if (...) {
// we want to terminate the loop
break; // <<------
}
// do more stuff
}
答案 1 :(得分:1)
由于您仍在努力理解,这里有一个&#34;样本解决方案&#34;编程问题:
import java.util.Scanner;
import java.util.NoSuchElementException;
public class Example {
public static void main(String[] args) {
Scanner kbdInput = new Scanner(System.in);
String mode = "";
double percent = -1;
while (true) {
System.out.println("Enter 'score' or 'percent': ");
mode = kbdInput.next().toLowerCase();
kbdInput.nextLine();
if (mode.equals("score") || mode.equals("percent")) {
break;
}
System.out.println("I don't understand that. Try again.");
}
while (true) {
try {
if (mode.equals("score")){
System.out.println("You chose to input a score.");
System.out.println("Enter it here: ");
double score = kbdInput.nextDouble();
kbdInput.nextLine();
System.out.println("What is the best score?");
double total = kbdInput.nextDouble();
kbdInput.nextLine();
percent = score / total * 100;
if (score >= 0.0 && total > 0.0 &&
percent >= 0.0 && percent <= 100.0) {
break;
}
System.out.println("The score / best score you " +
"gave make no sense.");
} else if (mode.equals("percent")) {
System.out.println("You chose to input a percent.");
System.out.println("Enter it here: ");
percent = kbdInput.nextDouble();
kbdInput.nextLine();
if (percent >= 0.0 && percent <= 100.0) {
break;
}
System.out.println("The percent you gave is not " +
"between 0 and 100.");
}
} catch (NoSuchElementException ex) {
kbdInput.nextLine();
System.out.println("You entered an invalid number.");
}
System.out.println("Try again.");
}
if (percent >= 0.0 && percent <= 100.0) {
char grade;
if (percent >= 90){
grade = 'A';
} else if (percent >= 80){
grade = 'B';
} else if (percent >= 70){
grade = 'C';
} else if (percent >= 60){
grade = 'D';
} else {
grade = 'F';
}
System.out.println("You got " + percent +
"%. Which is a letter grade '" + grade + "'.");
}
}
}
需要注意的事项:
我把它分成了两个循环。一个请求并验证&#34;模式&#34;输入分数。第二个实际输入它们。 (我已经推断这是您的代码的要求。这可能不正确。)
与您的版本相比,输入的验证要多得多。
我使用了kbdInput.nextLine()
来消费&#34;在一些地方不需要的输入。请注意,next
方法会留下他们不想要或无法在输入缓冲区中识别的任何输入字符。如果您不小心,下一次调用nextXxxx
将尝试再次解析相同的字符。
我明确地捕捉并处理输入数字时的错误;看到异常处理程序。
我已移动常用代码来计算并显示等级到最后。
我已将多行println语句更改为单独的语句。这是有充分理由的。
"\n"
并不总是输出换行符的正确方式。这取决于执行平台 println
将正确执行此操作,假设输出的目的地是运行代码的同一台计算机。
最后,此代码不会处理用户在键盘上输入END-OF-FILE的情况(例如Linux上的^ D)。
练习:看看如果你这样做会发生什么。弄清楚会发生什么,并找到适当的解决方案。