NumberFormatException

D

Diode

Gast
Hallo,

Habe eine Frage zu einem Problem, wobei ich zu diesem Problem nicht viel im Internet finde.

Es wird eine [c]NumberFormatException[/c] geworfen. Habe den entsprechenden Codeteil auch abgefangen, soweit ich sehen konnte.

Die Exception-Meldung.
Java:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For inpu
t string: "1+3"
        at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
        at java.lang.Double.parseDouble(Unknown Source)
        at CalculatorTest.complete(CalculatorTest.java:217)
        at CalculatorTest.actionPerformed(CalculatorTest.java:199)
        at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
        at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
        at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
        at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$000(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)



Der COde der ausgeführt wird, wobei nichts geschieht, ausser einer Exception.
Java:
public void complete() {
  String a = field.getText();
  String temp;
  ArrayList<Double> ZahlenListe = new ArrayList<Double>();
  ArrayList<String> OperatorListe = new ArrayList<String>();
  StringTokenizer StrToKen = new StringTokenizer(a);
 
  while (StrToKen.hasMoreTokens()) {
   temp = StrToKen.nextToken(); 
   if(temp.equals("+")) OperatorListe.add("+");
   else if(temp.equals("-")) OperatorListe.add("-");
   else if(temp.equals("*")) OperatorListe.add("/");
   else if(temp.equals("/")) OperatorListe.add("*");
   else { 
    try {
     ZahlenListe.add(Double.parseDouble(temp));
    } catch(NumberFormatException e) {e.printStackTrace();}   
   }
  }
 
  if (OperatorListe.get(0).equals("+")) {plusMethode(ZahlenListe.get(0),ZahlenListe.get(1));}
  if (OperatorListe.get(0).equals("-")) {minusMethode(ZahlenListe.get(0),ZahlenListe.get(1));}
  if (OperatorListe.get(0).equals("/")) {divisionMethode(ZahlenListe.get(0),ZahlenListe.get(1));}
  if (OperatorListe.get(0).equals("*")) {multiMethode(ZahlenListe.get(0),ZahlenListe.get(1));}
 } 

 public void plusMethode(double wert1, double wert2) { 
  ergebnis = wert1 + wert2;
  String ergebnis2 = Double.toString(ergebnis);
  field.setText(ergebnis2);
 }

Vielen Dank
D.
 
Zuletzt bearbeitet von einem Moderator:

eRaaaa

Top Contributor
"1+3" kann nicht geparst werden, du musst schon die 1 und die 3 aus dem String herausfiltern und einzeln parsen.
Oder auf die Javascript-Engine zurückgreifen :D
 
D

Diode

Gast
Danke für die Antworten.

Ok, "nicht geparst", wobei unten der String "1+3", durch den StringTokenizer, aufgeteilt werden müsste, oder seh ich das falsch?

[c] StringTokenizer StrToKen = new StringTokenizer(a);[/c]
 

eRaaaa

Top Contributor
Mal davon abgesehen dass der eh legacy code ist:
StringTokenizer (Java Platform SE 7 )

-->
Constructs a string tokenizer for the specified string. The tokenizer uses the default delimiter set, which is " \t\n\r\f": the space character, the tab character, the newline character, the carriage-return character, and the form-feed character. Delimiter characters themselves will not be treated as tokens.

Wo steht dort, dass da bei einem + geteilt wird? Das müsstest du ihm schon (z.B. im anderen Konstruktor) mitteilen
 

Volvagia

Top Contributor
Wenn du ihm nicht sagst trennt ers nach dem Schema: "\t\n\r\f". Dadurch wird bei nextToken(); "1+3" zurückgegeben, er springt in die else und versucht verzweifelt, den String in eine Zahl umzuwandeln.

(Wenn ich mich jetzt nicht verschaut habe.)

btw. steht in meiner Signatur, wie man Variablen benennt.
 
D

Diode

Gast
Ja stimmt, der delimeter, sollte soviel vie de-limitierer bedeuten?

Also vielleicht so: [c]StringTokenizer StrToKen = new StringTokenizer(a, "+", "-", "/" , "*");[/c]

Oder muss sich je einen separaten Konstruktor aufrufen mit je einer Schleife?

Vielen Dank
D.
 
D

Diode

Gast
Stimmt ja, nur ein String, vielen Dank.

Wobei ich jetzt noch kurz google muss, ausser jemand könnte mir ein Hinweis geben wieso das eine [c]IndexOutOfBoundsException[/c] geworfen wird.

Danke
D.
 
D

Diode

Gast
Den Ausnahmefehler [c]IndexOutOfBoundsException[/c] konnte ich leider nicht beheben.

Laut google, geschieht dies wenn ein Array oder ArrayList, den Index über-unterschreitet.
In diesem Fall müsste die Liste leer sein [c]Index:0 Size:0[/c] ?

Oder an was könnte das liegen?

Java:
import java.util.*;

public class Parsen {
 double ergebnis;
 public static void main(String[] args) {
  Parsen p = new Parsen();
  p.complete();
 }

 public void complete() {
  String a = "1+3";
  String temp;
  ArrayList<Double> ZahlenListe = new ArrayList<Double>();
  ArrayList<String> OperatorListe = new ArrayList<String>();
  StringTokenizer str = new StringTokenizer(a, "+-/*");
  
  while (str.hasMoreTokens()) {
   temp = str.nextToken(); 
   if(temp.equals("+")) OperatorListe.add("+");
   else if(temp.equals("-")) OperatorListe.add("-");
   else if(temp.equals("*")) OperatorListe.add("/");
   else if(temp.equals("/")) OperatorListe.add("*");
   else { 
    ZahlenListe.add(Double.parseDouble(temp));   
   }
  }
 
  if (OperatorListe.get(0).equals("+")) plusMethode(ZahlenListe.get(0),ZahlenListe.get(1));
  if (OperatorListe.get(0).equals("-")) minusMethode(ZahlenListe.get(0),ZahlenListe.get(1));
  if (OperatorListe.get(0).equals("/")) divisionMethode(ZahlenListe.get(0),ZahlenListe.get(1));
  if (OperatorListe.get(0).equals("*")) multiMethode(ZahlenListe.get(0),ZahlenListe.get(1));
 } 
 
 public void plusMethode(double wert1, double wert2) { 
  ergebnis = wert1 + wert2;
  String ergebnis2 = Double.toString(ergebnis);
  System.out.println(ergebnis2);
 }

 public void minusMethode(double wert1, double wert2) { 
  ergebnis = wert1 - wert2;
  String ergebnis2 = Double.toString(ergebnis);
  System.out.println(ergebnis2);
 }

 public void divisionMethode(double wert1, double wert2) { 
  ergebnis = wert1 / wert2;
  String ergebnis2 = Double.toString(ergebnis);
  System.out.println(ergebnis2);
 }

 public void multiMethode(double wert1, double wert2) { 
  ergebnis = wert1 * wert2;
  String ergebnis2 = Double.toString(ergebnis);
  System.out.println(ergebnis2);
 }
}

Vielen Dank
D.
 
P

pappawinni

Gast
Könnte es vielleicht sein, dass der Tokenizer etwas anderes tut, als du denkst?
Vielleicht teilt dein Tokenizer den String nur an den Trennzeichen "+-*/" auf und die Trennzeichen sind anschliessend einfach verschwunden?
Das würde bedeuten, dass deine anschliessende Abfrage der Operatoren, die du ja als Trennzeichen hernimmst, ziemlich für die Katz wäre.
Gib doch mal nach zeile 18 den wert von Temp aus. Dann geht dir vielleicht ein Licht auf.
 
Zuletzt bearbeitet von einem Moderator:
D

Diode

Gast
Ja das stimmt, er delimitiert ja den String um "+-/*".

Das Problem ist, wie könnte man den String auf die Operatoren prüfen?
 

Volvagia

Top Contributor
Contains? o_O Mit ner Schleife und getCharAt? o_O
Mit mehr als nur einen Term würde ichs sowieso nicht mit sowas machen. (bzw. niemals damit, da ich gehört habe, dass man ihm nicht mehr verwenden soll. Wie eRaaaa gesagt hat: "Mal davon abgesehen dass der eh legacy code ist".)

Da fällt mir ein, dass hier jemand mal einen Parser für mathematische Funktionen geschrieben hat. Weiß aber nicht mehr wo, ist schon lange her. Vielleicht kann sich Google ja noch daran errinnern.
 
D

Diode

Gast
Habs so gelöst, wobei es mit [c]split()[/c] auch machbar wäre.

Java:
import java.util.*;

public class Parsen {
 double ergebnis;
 public static void main(String[] args) {
  Parsen p = new Parsen();
  p.complete();
 }

 public void complete() {
  String a = "1+3";
  String temp;
  ArrayList<Double> ZahlenListe = new ArrayList<Double>();
  ArrayList<String> OperatorListe = new ArrayList<String>();
  StringTokenizer str1 = new StringTokenizer(a, "+-/*");
  StringTokenizer str2 = new StringTokenizer(a, "1234567890");
  
  while (str1.hasMoreTokens()) {
   temp = str1.nextToken();
   ZahlenListe.add(Double.parseDouble(temp));   
  }
  while (str2.hasMoreTokens()) {
   temp = str2.nextToken(); 
   if(temp.equals("+")) OperatorListe.add("+");
   else if(temp.equals("-")) OperatorListe.add("-");
   else if(temp.equals("*")) OperatorListe.add("/");
   else if(temp.equals("/")) OperatorListe.add("*");
  }
 
  if (OperatorListe.get(0).equals("+")) plusMethode(ZahlenListe.get(0),ZahlenListe.get(1));
  if (OperatorListe.get(0).equals("-")) minusMethode(ZahlenListe.get(0),ZahlenListe.get(1));
  if (OperatorListe.get(0).equals("/")) divisionMethode(ZahlenListe.get(0),ZahlenListe.get(1));
  if (OperatorListe.get(0).equals("*")) multiMethode(ZahlenListe.get(0),ZahlenListe.get(1));
 } 
 
 public void plusMethode(double wert1, double wert2) { 
  ergebnis = wert1 + wert2;
  String ergebnis2 = Double.toString(ergebnis);
  System.out.println(ergebnis2);
 }

 public void minusMethode(double wert1, double wert2) { 
  ergebnis = wert1 - wert2;
  String ergebnis2 = Double.toString(ergebnis);
  System.out.println(ergebnis2);
 }

 public void divisionMethode(double wert1, double wert2) { 
  ergebnis = wert1 / wert2;
  String ergebnis2 = Double.toString(ergebnis);
  System.out.println(ergebnis2);
 }

 public void multiMethode(double wert1, double wert2) { 
  ergebnis = wert1 * wert2;
  String ergebnis2 = Double.toString(ergebnis);
  System.out.println(ergebnis2);
 }
}

Nochmals vielen Dank
D.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P parseInt -> "202103122000" -> NumberFormatException Java Basics - Anfänger-Themen 14
C NumberFormatException: null ohne Ausnahmebehandlung stoppen Java Basics - Anfänger-Themen 7
Jascha NullPointerException vs NumberFormatException Java Basics - Anfänger-Themen 5
K Datentypen NumberFormatException Java Basics - Anfänger-Themen 7
Dogge NumberFormatException null Java Basics - Anfänger-Themen 5
O NumberFormatException Java Basics - Anfänger-Themen 2
M Compiler-Fehler Fehler Meldung java.lang.NumberFormatException: empty String Java Basics - Anfänger-Themen 2
D Interpreter-Fehler NumberFormatException Textfeld Java Basics - Anfänger-Themen 24
Furtano Variablen NumberFormatException Java Basics - Anfänger-Themen 14
N NumberFormatException, aber wieso? Java Basics - Anfänger-Themen 5
J Problem mit NumberFormatException Java Basics - Anfänger-Themen 6
M NumberFormatException Chat WordPress Java Basics - Anfänger-Themen 13
C NumberFormatException-Problem Java Basics - Anfänger-Themen 6
StupidAttack NumberFormatException Java Basics - Anfänger-Themen 19
M java.lang.NumberFormatException-Problem Java Basics - Anfänger-Themen 6
M BMI-Rechner NumberFormatException Java Basics - Anfänger-Themen 30
S NumberFormatException , mit Try/Catch? Java Basics - Anfänger-Themen 7
B NumberFormatException: For input string: "" Java Basics - Anfänger-Themen 4
S NumberFormatException Java Basics - Anfänger-Themen 13
K Fehler Meldung java.lang.NumberFormatException: empty String Java Basics - Anfänger-Themen 1
R Warum NumberFormatException? Java Basics - Anfänger-Themen 4
M Abfangen von java.lang.NumberFormatException Java Basics - Anfänger-Themen 6
J Double.parseDouble(s) wirft keine NumberFormatException Java Basics - Anfänger-Themen 12
G NumberFormatException bei double und long Java Basics - Anfänger-Themen 11
M for-Schleife mit NumberFormatException Java Basics - Anfänger-Themen 15
A NumberFormatException Java Basics - Anfänger-Themen 7
B komische NumberFormatException beim DezimalToBinär-Rechner Java Basics - Anfänger-Themen 4
B NumberFormatException Java Basics - Anfänger-Themen 5
F 2 numberformatexception abfangen? Java Basics - Anfänger-Themen 20
S java.lang.NumberFormatException Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben