2016-11-12 1 views
1

Ich bin mir nicht sicher, was ich falsch mache, die Aufgabe ist es, einen Code zu erstellen, der eine Temperatur von C nach F oder von F nach C konvertiert, bis der Benutzer entscheidet, dass sie fertig sind, bin ich auch soll eine Fehlermeldung ausgeben, wenn ein ungültiges Zeichen erscheint, und den Benutzer korrigieren lassen, ohne erneut nach dem numerischen Teil zu fragen.Java Temp-Konvertierungsprogramm. korrekte Ausgabe, aber Fehler

Das Programm scheint gut zu laufen, bis ich einen anderen Wert als 'c' 'C' 'f' oder 'F' eingeben. An diesem Punkt bekomme ich immer noch die gewünschte Ausgabe, aber als ich hier einen Fehler erhalte, ist mein Code.

import java.util.Scanner; 

public class ProjectThree 
{ 
    public static void main(String[] args) 
    { 
     Scanner keyboard = new Scanner(System.in); 
     System.out.println("Please enter a temperature to be converted followed" 
      + "\nby a C or c for Celsius or an F or f for Fahrenheit. If " 
      + "\nfinished converting temperatures enter done."); 
     String userInput, intString; 
     userInput = keyboard.nextLine(); 

     while (!(userInput.equalsIgnoreCase("done"))) 
     { 
      int length, temp, degreesC, degreesF; 
      length = userInput.length(); 
      intString = userInput.substring(0,length - 1); 
      temp = Integer.parseInt(intString); 
      char scale = userInput.charAt(length - 1); 

      while (!((scale == 'c') || (scale == 'C') || (scale =='f') || 
       (scale == 'F'))) 
      { 
       System.out.println("Error: Invalid temperature unit. Enter a C or c" 
        + " for Celsius or an F or f for Fahrenheit."); 
       String errorInput = keyboard.next(); 
       scale = errorInput.charAt(0); 
       userInput = intString + errorInput; 
      } 
      switch (scale) 
      { 
       case 'C': 
       case 'c': 
        degreesF = (9 * (temp/5) + 32); 
        System.out.println(userInput + " is equal to " + degreesF 
         + "F"); 
        break; 
       case 'F': 
       case 'f': 
        degreesC = (5 * (temp - 32))/9; 
        System.out.println(userInput + " is equal to " + degreesC 
         + "C"); 
        break; 
      } 
      System.out.println("\nPlease enter a temperature to be converted followed" 
       + "\nby a C or c for Celsius or an F or f for Fahrenheit. If " 
       + "\nfinished converting temperatures enter done."); 
      userInput = keyboard.nextLine(); 
     } 
    } 
} 

und der Fehler ist

Please enter a temperture to be converted followed 
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
by a C or c for Celsius or an F or f for Farenheit. If 
finished converting tempertures enter done. 
    at java.lang.String.substring(String.java:1955) 
    at ChapterFour.ProjectThree.main(ProjectThree.java:33) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 5 seconds) 
+0

Sie sollten den Code in eine try catch-Anweisung setzen –

+0

Welcher ist die Eingabe, die diese Ausnahme generiert? –

+0

Verwenden Sie einen Debugger und Sie werden herausfinden, warum Sie diese Ausnahme erhalten – Jens

Antwort

0

im Allgemeinen, eine Menge Dinge gibt es, dass auf schlechten Eingang schief gehen „könnte“, weil Sie eine Fehlerprüfung nicht haben. Hier sind ein paar Dinge, die ich bemerkt habe ...

1) Wie ich denke, jemand anderes erwähnt, Sie nicht die Länge Ihrer Eingaben überprüfen, bevor Sie auf sie reagieren. Wenn jemand ohne etwas anderes eintritt, erhalten Sie wahrscheinlich eine Ausnahme. Gleiches, wenn sie eine ungültige Eingabe eingeben.

2) Der switch-Anweisung fehlt eine Standardklausel. Sie sollten etwas hinzufügen, das "etwas schief gelaufen ist, bitte versuchen Sie es erneut", nur damit Sie wissen, dass es aufgetreten ist.

3) Ich sehe Ihre Verwendung von keyboard.nextLine() anfänglich und keyboard.next(), wenn Sie nur nach dem Zeichen fragen. Wenn Sie nach dem Zeichen einen Rückgabewert eingeben, wird der Zeilenumbruch möglicherweise von der folgenden Zeile nextLine() aufgerufen, wodurch ein Fehler wie in Punkt 1 beschrieben ausgegeben wird. Während das Verhalten von next() googeln dies zu bestätigen, stieß ich auf die folgende (sieht aus wie jemand anderes ähnliches Problem hatte):

Issues with nextLine();

+0

Ich habe die Standardklausel aus dem Switch genommen, da sie nur mit entsprechenden Fällen aktiviert werden kann. Guter Punkt über das Hinzufügen von Schecks für Längen! Ich habe diese Eingabefehler nicht berücksichtigt – OnlinePseudonym

0

Für leeren String oder String der Länge one Sie nichts Griff haben .So es throw ein exception .Sie müssen Benutzer try catch blockieren oder etwas wie ich tun.Ignoriere einfach Länge zero und one für Eingabezeichenfolge.

Scanner keyboard = new Scanner(System.in); 

     System.out.println("Please enter a temperature to be converted followed" 
       + "\nby a C or c for Celsius or an F or f for Fahrenheit. If " 
       + "\nfinished converting temperatures enter done."); 

     String userInput, intString; 
     userInput = keyboard.nextLine(); 

     while (!(userInput.equalsIgnoreCase("done"))) { 
      int length, temp, degreesC, degreesF; 
      length = userInput.length(); 
      System.out.println(length); 
      if (length > 1) { 
       intString = userInput.substring(0, length - 1); 
       temp = Integer.parseInt(intString); 
       // System.out.println("Temp = " + temp); 
       char scale = userInput.charAt(length - 1); 
       // System.out.println("scale" + scale); 

       while (!((scale == 'c') || (scale == 'C') || (scale == 'f') || (scale == 'F'))) { 
        System.out.println("Error: Invalid temperature unit. Enter a C or c" 
          + " for Celsius or an F or f for Fahrenheit."); 
        String errorInput = keyboard.next(); 
        scale = errorInput.charAt(0); 
        userInput = intString + errorInput; 
       } 
       switch (scale) { 
       case 'C': 
       case 'c': 
        degreesF = (9 * (temp/5) + 32); 
        System.out.println(userInput + " is equal to " + degreesF + "F"); 
        break; 
       case 'F': 
       case 'f': 
        degreesC = (5 * (temp - 32))/9; 
        System.out.println(userInput + " is equal to " + degreesC + "C"); 
        break; 
       } 
      } 

      System.out.println("\nPlease enter a temperature to be converted followed" 
        + "\nby a C or c for Celsius or an F or f for Fahrenheit. If " 
        + "\nfinished converting temperatures enter done."); 
      userInput = keyboard.nextLine(); 
     } 

Beachten Sie, dassString substring(int beginIndex, int endIndex): Gibt die substring aus dem gegebenen index(beginIndex) bis zum angegebenen index(endIndex) starten. Für z.B. "Chaitanya". substring(2,5) würde "ait" zurückgeben. Es löst IndexOutOfBoundsException Wenn die beginIndex ist weniger als Null ODER beginIndex > endIndex ODER endIndex ist größer als die length von String.

In Ihrem Fall, wenn Sie einfach erter c oder C Länge-1 zero geworden, das ist Ihr last index .Auch Ihre first index ist auch zero .Das ist, warum Sie IndexOutOfBoundsException bekam.

Hoffe, du hast es.

Verwandte Themen