开关有问题

时间:2018-09-10 02:05:08

标签: java

当前正在努力理解我的错误消息的含义。我了解我不喜欢将我从浮点数更改为整数,但是如何解决呢?

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

4 个答案:

答案 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)

  1. 在开关盒中不能有量程。如果您的开关具有给定的String或整数值,则每种情况都会检查开关输入是否与一个值完全匹配。

  2. 对于情况100,应将其写为100.0。如果确实需要使用范围而不是单个值,请使用if-elseif-else子句。

  3. 在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);
  }
  }