Почему я получаю это исключение?
Вы переводите единицу в нижний регистр, а затем заменяете строку в нижнем регистре пустой.Если бы ваша строка была 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) , что, в свою очередь, ссылается на спецификацию языка Java § 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";
}