2016-08-09 43 views
-1

Das ist also das Programm, das ich für die Schule schrieb:Wie kann ich dieses Programm korrigieren, um zu verhindern, dass es java.lang.NumberFormatException auslöst?

import java.io.*; 
public class p35{ 
public static void main()throws IOException 
{ 
    InputStreamReader isr = new InputStreamReader(System.in); 
    BufferedReader br = new BufferedReader(isr); 
    System.out.println("Enter c for circle,r for rectangle and t for triangle"); 

    char a = (char)br.read(); 
    switch(a) 
    { 
     case 'c': System.out.println("Enter radius"); 
        String r = br.readLine(); 
        int rad = Integer.parseInt(r); 
        System.out.println("area of circle is:"+(22/7)*(rad*rad)); 
        break; 
     case 'r': System.out.println("Enter length"); 
        String l = br.readLine(); 
        int len = Integer.parseInt(l); 

        System.out.println("Enter breadth"); 
        String bd = br.readLine(); 
        int breadth = Integer.parseInt(bd); 
        System.out.println("area of rectangle is: "+len*breadth); 
        break; 
     case 't': System.out.println("Enter base"); 
        String b = br.readLine(); 
        int bas = Integer.parseInt(b); 

        System.out.println("Enter height"); 
        String h = br.readLine(); 
        int htg = Integer.parseInt(h); 
        System.out.println("area of triangle is: "+(1/2)*bas*htg); 
        break; 
     } 
    } 
} 

Es ist nicht java.lang.NumberFormatException zu arbeiten und wirft scheint. Kann mir jemand helfen, es zu korrigieren? ps. Ich bin nicht berechtigt, die Ausnahmebehandlung zu verwenden, also könnten Sie bitte versuchen, mir zu helfen, ohne das zu benutzen? Dank

+0

Verwenden Sie einen 'Scanner', der nützliche Methoden hat, um das zu tun, was Sie wollen – TheLostMind

+0

Sie können regex verwenden, um sicherzustellen, dass es eine Nummer ist, bevor Sie es analysieren ... Wenn es keine gültige Zahl ist, wird der Benutzer nach einer gültigen Nummer gefragt . – brso05

+0

Drucken Sie die Zeichenfolge aus, die Sie analysieren möchten. Ich wette, da ist eine neue Zeile oder etwas darin, weil 'br.read()' die Zeile nicht konsumiert. – aioobe

Antwort

0

Da es scheint, Sie beginnen mit der Programmierung, werde ich den folgenden Ansatz vorschlagen.

Sie sollten die Eingabe analysieren und überprüfen, dass es eine Nummer ist. Brechen Sie die Eingabe in Zeichenarray Überprüfen Sie, ob jedes Zeichen eine Zahl ist (zwischen '1' bis '0' oder a. Oder ein Leerzeichen)

Dies ist eine einfache Möglichkeit, eine Ausnahme zu vermeiden. Wenn die Eingabe gültig ist, verarbeiten Sie sie, wenn dies nicht der Fall ist, zeigen Sie ein ungültiges Ausgabeformat an.

0

Was können Sie tun, um sicherzustellen, dass es sich um eine Zahl ist, ist einfach:

if(!string.replaceAll("[^0-9]", "").isEmpty()) 

Dies setzt sich nur dann, wenn die Zeichenfolge eine Zahl ist, Wenn Sie Doppel überprüfen möchten, ist es ein bisschen schwieriger, aber ich Ist machbar, hier ist ein Code-Schnipsel für die Erklärung, wie.

Pattern pattern = Pattern.compile("[0-9]{1,}\\.[0-9]{1,}?"); 

Dies ist das Muster, nach dem Sie überprüfen müssen, für ein „doppeltes“ Format, es ist im Grunde sagt ein beliebige Anzahl 0-9 1 oder mehr Male dann einen Punkt dann mehr Zahlen 0-9 1 oder mehrmals, was ist ein Doppelgänger?

Hope this half erhalten Sie Ihre Antwort, wie das zu tun, auch für die Doppelprüfung können Sie pattern.matcher (string) .matches() verwenden, um zurückzukehren, wenn es sich um eine Doppel ist oder nicht

0

Es ist, weil wie Sie Benutzereingaben erfassen. Wenn Sie den Eingabestream-Reader erstellt und die read-Methode aufgerufen haben, fordert er Sie zur Eingabe von Eingaben auf. Aber wenn Sie später readLine() anrufen, arbeitet es immer noch in der gleichen ersten Zeile (das Zeichen und eine Rückkehr). Deshalb sollten Sie diese Meldung erhalten:

char a = (char) br.read(); 
br.readLine(); // this finishes consuming the first line of input 

Anstelle der Verwendung eines Eingangsstroms:

Exception in thread "main" java.lang.NumberFormatException: For input string: "" 

Sie Ihren Code, indem es „raubend“ die erste Zeile der Eingabe nach dem Lesen der Zeichen beenden beheben , ziehen Sie in Erwägung, die für diese Art von Zweck erstellte Scannerklasse zu verwenden.

public static void main(String[] args) throws Exception { 
    Scanner in = new Scanner(System.in); 
    System.out.println("Enter c for circle,r for rectangle and t for triangle"); 
    String input = in.next(); 
    if (!input.isEmpty()) { 
     char a = input.charAt(0); 
     switch (a) { 
      case 'c': 
       System.out.println("Enter radius (int)"); 
       int rad = in.nextInt(); 
       System.out.println("area of circle is: " + (22/7) * (rad * rad)); 
       break; 
      case 'r': 
       System.out.println("Enter length (int)"); 
       int len = in.nextInt(); 
       System.out.println("Enter breadth (int)"); 
       int breadth = in.nextInt(); 
       System.out.println("area of rectangle is: " + len * breadth); 
       break; 
      case 't': 
       System.out.println("Enter base (int)"); 
       int bas = in.nextInt(); 
       System.out.println("Enter height (int)"); 
       int htg = in.nextInt(); 
       // Note change to calculation 
       System.out.println("area of triangle is: " + bas * htg/2); 
       break; 
     } 
    } 
} 

FYI eine letzte Sache ist zu beachten, dass Ihr Dreieck Berechnung gebrochen ist. Da Sie hier mit ganzen Zahlen arbeiten, wird es int arithmetisch sein. wird immer 0 sein, also wird Ihr Bereich immer 0 sein. Tun Sie die Multiplikation zuerst, dann dividieren Sie durch 2, wenn Sie ein int-Ergebnis wollen. Wenn Sie es genauer berechnen möchten, konvertieren Sie es zuerst in ein Double. Das gleiche gilt für den Kreisradius, aber nicht ganz so schlecht, da 22/7 nicht auf 0 runden wird.

Beispiel zu der Herstellung verdoppelt:

(22.0/7) * rad * rad 

Notiere die .0 am 22., dass den ersten Abschnitt in ein Doppel Ergebnis machen und ein doppeltes mal ein int auch ein doppelt so hoch ist, so dass Sie mit doppelter Genauigkeit erhalten werden stattdessen von ganzzahliger Genauigkeit.

+0

Danke, dass Sie mich wissen lassen, dass meine Dreiecksgleichung gebrochen ist. –

+0

das einzige Problem, das ich jetzt habe, ist, dass wenn ich br.readLine() hinzufügen; Nach der Eingabe des Char-Benutzers bleibt die virtuelle Maschine hängen und kann das Programm nicht im Terminal ausführen. –

+0

@UrvishRamaiya das ist seltsam. Es funktionierte für mich auf meiner Maschine. Ich würde empfehlen, stattdessen die Scanner-Version zu verwenden. –