当前正在努力理解我的错误消息的含义。我了解我不喜欢将我从浮点数更改为整数,但是如何解决呢?
import java.util.Scanner;
public class gradeAverage {
public static void main (String [] args) {
Scanner sc = new Scanner(System.in);
System.out.println("First test score?");
float test1 = sc.nextInt();
System.out.println("Second test score?");
float test2 = sc.nextInt();
System.out.println("Third test score?");
float test3 = sc.nextInt();
float testAverage = (test1 + test2 + test3)/3;
System.out.println("Your test average is " + testAverage + ".");
switch(testAverage) {
case(97.5 <= testAverage <= 100):
System.out.println("Grade is an A+");
break;
case(93.5 <= testAverage <= 97.49):
System.out.println("Grade is an A");
break;
case(89.5 <= testAverage <= 93.49):
System.out.println("Grade is an A-");
default:
System.out.println("Grade is below an A-");
}
}
}
错误
gradeAverage.java:13: error: incompatible types: possible lossy conversion from float to int
switch(testAverage) {
^
gradeAverage.java:14: error: bad operand types for binary operator '<='
case(97.5 <= testAverage <= 100):
^
first type: boolean
second type: int
2 errors
答案 0 :(得分:2)
发生第一个错误是因为switch语句中的表达式仅限于几种基本类型,出于性能原因,在实现/ jvm中构建“跳转表”很简单。
表达式的类型必须为char,byte,short,int,Character,Byte,Short,Integer,String或枚举类型(第8.9节),否则会发生编译时错误。 Java Language Specification : Switch Statements
Java编译器正在尝试将类型缩小到Integer以符合限制,但是这种严重的错误可能是编译器设计者将其标记为错误的。
第二个错误
gradeAverage.java:14: error: bad operand types for binary operator '<='
case(97.5 <= testAverage <= 100):
是因为您对Java的大小写标签语法有基本的误解。
Java中的case语句(从Java 10(以及不久的11)开始)接受值,而不是表达式或语句。
case(93.5 <= testAverage <= 97.49):
System.out.println("Grade is an A");
break;
在Java中根本不可能。
Java Language Specification : Switch Statements还显示Java案例语句期望使用ConstantExpression或EnumConstantName
case ConstantExpression :
case EnumConstantName :
因此,必须在编译时知道case语句的值。
但是,开关语句中的模式匹配以及开关表达式作为Project Amber的一部分正在研究中,具体如下:http://cr.openjdk.java.net/~briangoetz/amber/pattern-match.html
答案 1 :(得分:0)
根据this reference,您不能在 switch 语句中使用 float 。改用 if 怎么样?
答案 2 :(得分:0)
在开关盒中不能有量程。如果您的开关具有给定的String或整数值,则每种情况都会检查开关输入是否与一个值完全匹配。
对于情况100,应将其写为100.0。如果确实需要使用范围而不是单个值,请使用if-elseif-else子句。
在switch语句中的每种情况之后,您都需要使用break;
行来告诉代码离开switch语句,否则它将继续读取它们并在其中执行所有操作,而不管其前面的情况如何是真的。
答案 3 :(得分:0)
您不能在Java的 case 语句中使用表达式。 switch语句中使用的变量只能是整数,可转换的整数(字节,短整数,字符),字符串和枚举。 考虑Java中 switch-case 语句的以下用例:
public class Test {
public static void main(String args[]) {
// char grade = args[0].charAt(0);
char grade = 'C';
switch(grade) {
case 'A' :
System.out.println("Excellent!");
break;
case 'B' :
case 'C' :
System.out.println("Well done");
break;
case 'D' :
System.out.println("You passed");
case 'F' :
System.out.println("Better try again");
break;
default :
System.out.println("Invalid grade");
}
System.out.println("Your grade is " + grade);
}
}