解析大写时出错,但解析小写java时没有错误

时间:2019-02-25 13:19:55

标签: java parsing

所以我的代码是一个程序,用来告诉水在一定温度下是温度,气体还是固体,然后是单位(华氏度或摄氏温度)。

该代码适用于单位“ F”,“ f”,“ c”,但不适用于大写字母“ C”。

    public static void stateOfWater() {
    Scanner inputTempString = new Scanner(System.in);
    System.out.print("Enter temperature: ");
    String temperatureString = inputTempString.nextLine().trim();
    String unit = temperatureString.substring(temperatureString.length()-1);
    unit = unit.toLowerCase();
    temperatureString = temperatureString.replace(unit,"");
    double temperature =  Double.parseDouble(temperatureString);

        if ( (temperature <= 0 && unit.equals("c")) || (temperature <= 32 && unit.equals("f")) ) {
            System.out.println("The state of the water is: solid (ice). ");
        }

        if (  ( (0.0 <= temperature && temperature < 100) && unit.equals("c")  ) || (((32 <= temperature && temperature < 212) && unit.equals("f")))) {
            System.out.println("The state of the water is: liquid. ");
        }

        if ((temperature > 100 && unit.equals("c")) || (temperature > 212 && unit.equals("f")))  {
            System.out.println("The state of the water is: gaseous. ");
        }
    }

当我尝试输入包含大写字母C的温度时出现此错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "43C"
at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.base/java.lang.Double.parseDouble(Double.java:543)
at lab2.Lab.stateOfWater(Lab.java:13)
at lab2.main.main(main.java:5)

2 个答案:

答案 0 :(得分:2)

为什么会出现此异常?

您要将单位转换为小写,然后将小写字符串替换为空字符串。如果您的字符串是43C,它将尝试用空字符串替换c……当然,这是行不通的。

您应该首先从温度字符串中切断该单元,然后将其转换为小写。

String input = inputTempString.nextLine().trim();
String unit = input.substring(input.length() - 1).toLowercase();
double temperature = Double.parseDouble(input.substring(0, input.length() - 1));

但是,43F为什么不能工作,而43C却不能工作?

它实际上适用于大写字母F的原因是,字母F是浮点文字的一部分,正如Double.parseDouble(String)的文档中提到的那样,该文档又指向Double.valueOf(String),在文档中{ turn指向Java Language Specification § 3.10.2,该令牌称为FloatTypeSuffix令牌。


此外,我建议使用另一种方法。

我将解析输入并将其转换为标准化单位,例如摄氏温度,然后对于负责打印水态的那段代码,我只需要编写if语句一两个比较。例如,代替您的if语句,例如:

(((0.0 <= temperature && temperature < 100) && unit.equals("c")  ) || (((32 <= temperature && temperature < 212) && unit.equals("f"))))

我要简短一些:

String state = "";
if (temperature < 0) {
    state = "solid (ice)";
}
else if (temperature < 100) {
    state = "liquid";
}
else {
    state = "gaseous";
}

答案 1 :(得分:0)

实际上,您甚至不需要单位!只需检查给定字符串的最后一个字符,如果它是'F'或'f',则减去32即可达到摄氏度。

public static void stateOfWater() {
    try (Scanner scan = new Scanner(System.in)) {
        System.out.print("Enter temperature (e.g. 35F or 35C): ");
        String str = scan.nextLine().trim();
        double degree = Double.parseDouble(str.substring(0, str.length() - 1));
        degree = Character.toUpperCase(str.charAt(str.length() - 1)) == 'F' ? degree : ((degree - 32) * 5) / 9;
        String state = Double.compare(degree, 0) <= 0 ? "solid (ice)" : Double.compare(degree, 100) < 0 ? "liquid" : "gaseous";
        System.out.println("The state of the water is: " + state + '.');
    }
}