Więc mój kod jest programem, aby określić, czy woda jest temperatura, gazowa lub stała w pewnych temperaturach, a następnie jednostka (Fahrenheita lub Celsjusza).

Kod działa na jednostki "F", "F", "C", ale nie wielkie litery "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. ");
        }
    }

Otrzymuję ten błąd, gdy próbuję wprowadzić temperaturę, która zawiera wielkie litery 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)
-1
98wau 25 luty 2019, 16:19

2 odpowiedzi

Najlepsza odpowiedź

Dlaczego otrzymuję ten wyjątek?

Konwertujesz urządzenie do małych liter, a następnie wymieniasz ciąg dalszy przez pusty. Jeśli twój ciąg był 43C, spróbuje zastąpić c przez pusty ciąg ... Cóż, to oczywiście nie działa oczywiście.

Powinieneś najpierw odciąć urządzenie z ciągów temperaturowych , a następnie konwertuj urządzenie na małe litery.

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

Ale dlaczego działa 43F, podczas gdy 43C nie?

Powodem, dla którego faktycznie pracował dla wielkich liter, jest to, że litera F jest częścią literału pływającego punktu, jak wspomniano o dokumentacji Double.Parsedouble (ciąg), który z kolei odnosi się do Double.valueof (ciąg), który Z kolei odnosi się do Java Specyfikacja języka § 3.10.2, która odnosi się do tego tokena jako token FloatTypeSuffix.


Sugeruję również inne podejście.

Błądbym wejściowy przekształcony go do znormalizowanej jednostki, na przykład Celsjusza, a następnie do kodu odpowiedzialnego za drukowanie stanu wody, musiałem napisać if instrukcje z jednym lub dwa porównania. Na przykład zamiast twojego {X1}} oświadczenie, na przykład:

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

Miałbym coś krótszego:

String state = "";
if (temperature < 0) {
    state = "solid (ice)";
}
else if (temperature < 100) {
    state = "liquid";
}
else {
    state = "gaseous";
}
2
MC Emperor 25 luty 2019, 14:06

Właściwie nie potrzebujesz nawet urządzenia! Wystarczy sprawdzić ostatni znak danego ciągu, a jeśli jest "F" lub "F", a następnie odejmij 32, aby zrobić stopień w Celsjusza.

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 + '.');
    }
}
0
oleg.cherednik 25 luty 2019, 13:49