Fehler - readJavaFormatString(Unknown Source)

hi98hi98

Mitglied
Guten Abend,

ich hätte mal kurz eine Frage zu einem Code-Abschnitt.
Ich habe einen Taschenrechner geschrieben, und zwar mit einem unüblicherem Algorithmus.
Aber jetzt zu meiner Frage:
In folgendem Code-Abschnitt taucht untenstehender Fehler auf:

Code:

Java:
public String term ="";
    public double end;
    private String[] z = new String[3];
    private ArrayList<String> list;
    int iz=1;
  
    public String ergebnis(String erg, String newOp){
        erg = erg+newOp;
        return erg;
      
    }
    public String addTerm(String newPart){
      
        term = term + newPart;
        String x = term;
        System.out.println(x);
        return x;
      
    }
    public String removeLastChar() {
        term = term.substring(0,term.length()-1);
        return term;
    }
    public String reset() {
        term = "";
        return term;
    }
    public double StringToDouble(String s){      
        double e = Double.parseDouble(s);
        return e;
    }  
    public double rech(){
      
        list = new ArrayList<String>();
        for(int i=0; i<=term.length()-1;i++){
            String a = Character.toString(term.charAt(i));
            list.add(i,a);  
          
        }      
        for(int i=0; i<=list.size();i=i++){
            String b = list.get(i);
            System.out.println(b);
            end = end +classify(b);
          
            }
        return end;
        }      
  
    private double classify(String s){


        if(iz==1){          
      
            if(s=="0"||s=="1"||s=="2"||s=="3"||s=="4"||s=="5"||s=="6"||s=="7"||s=="8"||s=="9"){      
                z[0]=z[0]+s;
            }
          
            else if(s=="+"||s=="-"||s=="*"||s=="/"){
                iFunc(iz);  
                z[2]=s;
            }
            else {System.out.println("Syntax-Fehler");}}
      
        else if(iz==-1){
          
            if(s=="0"||s=="1"||s=="2"||s=="3"||s=="4"||s=="5"||s=="6"||s=="7"||s=="8"||s=="9"){      
                z[1]=z[1]+s;
            }
          
            else if(s=="+"||s=="-"||s=="*"||s=="/"){
                iFunc(iz);  
                z[2]=s;
            }
            else {System.out.println("Syntax-Fehler");}          
        }
        Term t = new Term();
        System.out.println(StringToDouble(z[0]));
        return  t.ergebnis(StringToDouble(z[0]),StringToDouble(z[1]), z[2]);
        
    }
  
    private void iFunc(int i){
        i=i*-1;
    }
}
Und das ist der Fehler der rauskommt:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
    at java.lang.Double.parseDouble(Unknown Source)
    at operatorClass.StringToDouble(operatorClass.java:34)
    at operatorClass.classify(operatorClass.java:82)
    at operatorClass.rech(operatorClass.java:48)
    at guiClass.actionPerformed(guiClass.java:206)
    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 Source)
    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$500(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 Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    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 Source)
    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 Fehler taucht anscheinend im rot markierten Teil auf.
Wäre cool wenn sich das mal jemand anschauen könnte.

LG hi9hi98
 
Zuletzt bearbeitet von einem Moderator:
1. Nutze bitte java Code-Tags:
Java:
 String hinweis = "So wie hier"
2. StringToDouble wird von classify aufgrufen, und classify wiederum von rech (übrigens eigenartige Methodennamen). Und in rech wird der Stringparameter b ausgegeben, bevor er an classify übergeben wird.
Was ist denn die letzte Ausgabe auf der Konsole vor der Fehlermeldung?
 
Ja Stimmt.
Wenn die Rech() aufgerufen wird dann zeigt er immer die Zahl die gerade geprüft wird.
also z.b ich gebe 9876+ 5 = dann ruft er die Rech() auf und diese holt sich die erste Zahl, also 9. Diese wird dann auch noch vor dem Syntaxfehler ausgegeben.
 
falls du eigentlich 82 gemeint hast:

Code:
 System.out.println(StringToDouble(z[0]));

z92 ist leer.😉
 
Zuletzt bearbeitet:
Aber warum denn.
Dann müsste ja etwas an den if Schleifen nicht stimmen,
oder sie erkennen zumindest nicht, dass sie eine Zahl bekommen haben.
Das würde auch das "Sytax-Fehler" erklären.

Die Frage ist jetzt nur wie löse uch das...
 
Hey, ich glaube, es liegt an nem ziemlich häufigen Anfängerfehler:
Du vergleichst ja in deinen if Schleifen immer zwei Strings, zb s == "1". Das geht so NICHT, da Strings nicht per == verglichen werden können. "==" vergleichen hierbei nämlich nicht die Inhalte, sondern die Speicheradressen - was bei Strings nicht hinhaut, da der (inhaltlich) gleiche String verschiedene Speicheradressen haben kann.

Du kannst stattdessen die Methode a.equals(b) verwenden, um zwei Strings a und b auf Gleichheit zu testen. Manchmal sieht man den Wald vor lauter Bäumen nicht, ich musste jetzt auch ne Viertelstunde da drübergucken 😉
 
Vielen Dank für die Antworten.

Ich habe jetzt alle == ausgetauscht und hier und da noch etwas verbessert.
Jetzt kommt allerdings immer 0.0 als Ergebnis raus. Daraufhin habe ich begonnen mit einem System.out.print die Fehlerstelle zu finden.

Der rot-markierte Abschnitt ist die Zeile wo der Fehler liegt, jedes system.out nach diesem Teil, wird nicht mehr ausgeführt.

Java:
import java.util.ArrayList;

public class operatorClass {
   public String term ="";
   public double eee;
   private String[] z = new String[3];
   private ArrayList<String> list;
   int iz=1;

   public String ergebnis(String erg, String newOp){
     erg = erg+newOp;
     return erg;
   }

   public String addTerm(String newPart){
     term = term + newPart;
     String x = term;
     System.out.println(x);  //System.out!!!!!
     return x;
   }

   public String removeLastChar() {
     term = term.substring(0,term.length()-1);
     return term;
   }

   public String reset() {
     term = "";
     return term;
   }

   public double rech(){
     z[0]="";
     z[1]="";
     z[2]="";
     list = new ArrayList<String>();
     for(int i=0; i<=term.length()-1;i++){
       String a = Character.toString(term.charAt(i));
       list.add(i,a);
       System.out.println("Bis hier her, und nicht weiter");
     }
     for(int i=list.size(); i<=list.size()-1;i--){
       String b = list.get(i);
       eee = eee +classify(b);
     }
     return eee;
   }

   private double classify(String s){
     if(iz==1){
       if(s=="0"||s.equals("1")||s.equals("2")||s.equals("3")||s.equals("4")||s.equals("5")||s.equals("6")||s.equals("7")||s.equals("8")||s.equals("9")){
         z[0]=z[0]+s;
       } else if(s.equals("+")||s.equals("-")||s.equals("/")||s.equals("*")){
         iFunc(iz);
         z[2]=s;
       } else {
         System.out.println("Syntax-Fehler "+ s);
       }
     } else if(iz==-1){
       if(s=="0"||s.equals("1")||s.equals("2")||s.equals("3")||s.equals("4")||s.equals("5")||s.equals("6")||s.equals("7")||s.equals("8")||s.equals("9")){
         z[1]=z[1]+s;
       } else if(s.equals("+")||s.equals("-")||s.equals("/")||s.equals("*")){
         iFunc(iz);
         z[2]=s;
       } else {
       System.out.println("Syntax-Fehler ");
       }
     }
     Term t = new Term();
     return  t.ergebnis(z[0],z[1], z[2]);
   }

   private void iFunc(int i){
     i=i*-1;
   }
}

Hier noch die Klasse Term mit der Methode ergebnis():

Java:
public class Term {
  public Term(){ 
  }

  public double ergebnis(String n1,String n2, String op){
  double ee=0;
  if(op=="+"){
       ee= StringToDouble(n1)+StringToDouble(n2);
     } else if(op=="-"){
       ee=StringToDouble(n1)-StringToDouble(n2);
     } else if(op=="*"){
       ee=StringToDouble(n1)*StringToDouble(n2);
     } else if(op=="/"){
       ee=StringToDouble(n1)/StringToDouble(n2);
     } else {
       ee=StringToDouble(n1);
     }
  return ee;
  }

  private double StringToDouble(String s){ 
  double e = Double.parseDouble(s);
  return e;
  }
}


Hier noch ein Beispiel-Fall:
also ich gebe über meine buttons im programm den term 9+9 ein, dann drücke ich den =-Button dann kommt immer 0.0 raus.

LG hi98i9h8
 
Zuletzt bearbeitet von einem Moderator:
Sorry hab den Roten vergessen zu markieren.

Also bis hier läuft der code immer und danach gar nicht mehr auch nicht in classify()
Code:
eee = eee +classify(b);
 
  • Klassen werden in UpperCamelCase geschrieben. -> operatorClass = OperatorClass
  • Dann hast du immer noch Stringvergleiche mit "==" im Code drinnen -> tausche diese durch equals aus.
  • Die Methode "iFunc" macht so keinen Sinn. Sie bekommt einen Parameter, rechnet mit diesem und das Ergebnis geht verloren weil es nirgends gespeichert wird. Ich nehme an du willst damit die Variable "iz" zwischen 1 und -1 "herumschalten" lassen. Dann musst du entweder den neu errechneten Wert zurückgeben und iz zuweisen oder in der Methode direkt iz ändern!

Zu deinem Problem das nichts gemacht wird:
In der Methdoe "rech" hast du einen for-Schleife die logischerweise nicht durchlaufen werden kann.
Du setzt i auf die Länge der Liste, damit die Schleife durchlaufen werden kann muss "i <= Listenlänge - 1" sein.
Hier musst du mal logisch überlegen ob das jemals geschafft wird 😉
 
Das mit iFunc() stimmt. Das war ein dummer Fehler, hätte ich selbst draufkommen sollen.

Aber die anderen Sachen sind doch alle richtig(in Term sind alle== ausgetauscht). Du musst dir nur den aktuellen code anschauen den ich gepostet habe.

Es übrigens immer noch immer 0.0 raus.
 
Aber die anderen Sachen sind doch alle richtig(in Term sind alle== ausgetauscht). Du musst dir nur den aktuellen code anschauen den ich gepostet habe.

Nein eben nicht!
Java:
     for(int i=list.size(); i<=list.size()-1;i--){
       String b = list.get(i);
       eee = eee +classify(b);
     }
     return eee;
   ......
}if(s=="0"||s.equals("1")||s.equals("2")||s.equals("3")||s.equals("4")||s.equals("5")||s.equals("6")||s.equals("7")||s.equals("8")||s.equals("9")){
  ......     if(s=="0"||s.equals("1")||s.equals("2")||s.equals("3")||s.equals("4")||s.equals("5")||s.equals("6")||s.equals("7")||s.equals("8")||s.equals("9")){

Java:
  public double ergebnis(String n1,String n2, String op){
  double ee=0;
  if(op=="+"){
       ee= StringToDouble(n1)+StringToDouble(n2);
     } else if(op=="-"){
       ee=StringToDouble(n1)-StringToDouble(n2);
     } else if(op=="*"){
       ee=StringToDouble(n1)*StringToDouble(n2);
     } else if(op=="/"){
       ee=StringToDouble(n1)/StringToDouble(n2);
     } else {
       ee=StringToDouble(n1);
     }
  return ee;
  }
In der Klasse Term wird nirgends ein String per equals verglichen und in der anderen Klasse wird die "0" immer noch mit "==" verglichen!

(Ich habe den letzten von dir geposteten Code zitiert)


Es übrigens immer noch immer 0.0 raus.

Ja ich habe auch noch was geschrieben bezüglich einer Schleife hast du dir das angeschaut? Das sollte dir weiterhelfen 🙂
 

Zurück
Oben