所以我的代码是一个程序,用来告诉水在一定温度下是温度,气体还是固体,然后是单位(华氏度或摄氏温度)。
该代码适用于单位“ 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)
答案 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 + '.');
}
}