Jar datei ausführen verursacht NumberFormatException

Diskutiere Jar datei ausführen verursacht NumberFormatException im Allgemeine Java-Themen Bereich.
Hatsi09

Hatsi09

Hallo,

ich führe meine jar Datei mit der Console aus, hab gegooglt wie das geht. Das Problem ist, dass ich dort eine NumberFormatException beim Einlesen einer Datei bekomme, die ich in der IDE (Netbeans) nicht bekomme:
Code:
C:/Users/Thomas/Documents/Abrechnungskasse/Backup/Konto.csv
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException
        at java.math.BigDecimal.<init>(Unknown Source)
        at java.math.BigDecimal.<init>(Unknown Source)
        at java.math.BigDecimal.<init>(Unknown Source)
        at abrechnungskasse.Abrechnungskasse.generateKonto(Abrechnungskasse.java:1682)
        at abrechnungskasse.Abrechnungskasse.<init>(Abrechnungskasse.java:96)
        at abrechnungskasse.Abrechnungskasse$26.run(Abrechnungskasse.java:1931)
        at java.awt.event.InvocationEvent.dispatch(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$JavaSecurityAccessImpl.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)
In der ersten Zeile steht nochmal der Pfad, damit ich mir sicher bin, dass er auch die richtige Datei einliest.
in Zeile 1682 steht folgendes:
Code:
BigDecimal konto;
...
String[] inhalt = line.split(";");
konto = new BigDecimal(inhalt[1]);
Hab schon gegooglt, aber keine Lösung für das Problem gefunden. Dasselbe Problem bekomme ich auch, wenn ich die .exe ausführe, die ich aus meiner jar Datei generiert habe.
Bitte kann mir jemand helfen, woran das liegt, ich versteh nicht wieso der Java in der IDE funktioniert und beim Ausführen der jar nicht!?

Danke im Vorraus
 
L

LimDul

Erster Schritt: Gibt mal die Zeile aus mittels System.out.println (bzw. danach auch den Wert nach dem splitten).

So ist schwer dir zu helfen ohne den Rest zu kennen. Klar ist, in inhalt[1] steht was drin, was nicht parsebar ist. Gib das aus und schau dann nach, wo das herkommen kann.
 
Hatsi09

Hatsi09

es ist ganz komisch. Wenn ich mein Programm in Netbeans laufen lass, bekomme ich folgenden Output:
Code:
C:/Users/Thomas/Documents
C:/Users/Thomas/Documents/Abrechnungskasse/Backup/Konto.csv
kontostand;1230.00€;859.15€;212.00€;75.85€;0.0€;40.00€;0.0€;20.0€;0.0€;0.0€
inhalt: kontostand 1230.00€ 859.15€ 212.00€ 75.85€ 0.0€ 40.00€ 0.0€ 20.0€ 0.0€ 0.0€
inhalt[1]: 1230.00
wenn ich die daraus gebaute jar über die Konsole ausführe, lautet der output jedoch:
Code:
C:/Users/Thomas/Documents
C:/Users/Thomas/Documents/Abrechnungskasse/Backup/Konto.csv
kontostand;1230.00â?¬;859.15â?¬;212.00â?¬;75.85â?¬;0.0â?¬;40.00â?¬;0.0â?¬;20.0â?¬;0.0â?¬;0.0â?¬
inhalt: kontostand 1230.00â?¬ 859.15â?¬ 212.00â?¬ 75.85â?¬ 0.0â?¬ 40.00â?¬ 0.0â?¬ 20.0â?¬ 0.0â?¬ 0.0â?¬
inhalt[1]: 1230.00â?

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException
        at java.math.BigDecimal.<init>(Unknown Source)
        at java.math.BigDecimal.<init>(Unknown Source)
        at java.math.BigDecimal.<init>(Unknown Source)
        at abrechnungskasse.Abrechnungskasse.generateKonto(Abrechnungskasse.java:1691)
        at abrechnungskasse.Abrechnungskasse.<init>(Abrechnungskasse.java:97)
        at abrechnungskasse.Abrechnungskasse$26.run(Abrechnungskasse.java:1940)
        at java.awt.event.InvocationEvent.dispatch(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$JavaSecurityAccessImpl.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)
Mir ist klar, dass er "1230.00â?" nicht in eine Zahl konvertieren kann, die Frage ist, warum kommt in der jar "1230.00â?" raus und in der IDE "1230.00"?
 
L

LimDul

Willkommen in der fröhlichen Welt der Zeichensätze. Wir schreiben das Jahr 2020 und immer noch gibt es diese Probleme (Es ist zum kotzen, dass man immer noch diese Probleme hab, obwohl das Thema mehr als ein paar Jahre alt ist). Seis drum, da kannst nix für.

Die eine Variante wird es als ISO-8859-15 lesen, die andere als UTF-8 würde ich mal vermuten. Woher der sich das Encoding sieht, weiß ich nicht. Ich würde dir raten, schau nach, wo die Datei eingelesen wird im Code und gib dort das korrekte Encoding direkt mit. Wenn du den Code zum einlesen zeigst, kann man ggf. auch besser helfen.
 
Hatsi09

Hatsi09

Code:
private void generateKonto() {
        try
        {
            FileReader reader = new FileReader(backupPfad + "Konto.csv");
            System.out.println(backupPfad + "Konto.csv");
            BufferedReader br = new BufferedReader(reader);
            String line;
            int zeile = 1;
            while ((line = br.readLine()) != null)
            {
                if (zeile == 1)
                {
                    System.out.println(line);
                    String[] inhalt = line.split(";");
                    System.out.print("inhalt: ");
                    for (int i=0; i < inhalt.length; i++)
                    {
                        System.out.print(inhalt[i] + " ");
                    }
                    System.out.println();
                    if (inhalt.length > 1)
                    {
                        inhalt[1] = inhalt[1].substring(0, inhalt[1].length()-1);
                        inhalt[2] = inhalt[2].substring(0, inhalt[2].length()-1);
                        inhalt[3] = inhalt[3].substring(0, inhalt[3].length()-1);
                        inhalt[4] = inhalt[4].substring(0, inhalt[4].length()-1);
                        inhalt[5] = inhalt[5].substring(0, inhalt[5].length()-1);
                        inhalt[6] = inhalt[6].substring(0, inhalt[6].length()-1);
                        inhalt[7] = inhalt[7].substring(0, inhalt[7].length()-1);
                        inhalt[8] = inhalt[8].substring(0, inhalt[8].length()-1);
                        inhalt[9] = inhalt[9].substring(0, inhalt[9].length()-1);
                        inhalt[10] = inhalt[10].substring(0, inhalt[10].length()-1);
                        System.out.println("inhalt[1]: " + inhalt[1]);
                        konto = new BigDecimal(inhalt[1]);
                        kontoEcht = new BigDecimal(inhalt[2]);
                        ...
                    }
                }
                if (zeile > 3)
                {
                    String[] inhalt = line.split(";");
                    String[] datum1 = inhalt[0].split("\\.");
                    String[] datum2 = inhalt[1].split("\\.");
                    inhalt[5] = inhalt[5].substring(0, inhalt[5].length()-1);
                    Rechnung rechnung = new Rechnung(new Date(Integer.valueOf(datum1[0]), Integer.valueOf(datum1[1]), Integer.valueOf(datum1[2])), new Date(Integer.valueOf(datum2[0]), Integer.valueOf(datum2[1]), Integer.valueOf(datum2[2])), new BigDecimal(inhalt[5]), inhalt[3], inhalt[4]);
                    rechnung.setPerson(inhalt[2]);
                    rechnung.setArt(inhalt[6]);
                    rechnung.setBearbeitet(true);
                    rechnungen.add(rechnung);
                }
                zeile = zeile + 1;
            }
            br.close();
        }
        catch (IOException e)
        {
            Benachrichtigung b = new Benachrichtigung("Leider konnte das Konto nicht gelesen werden!");
            b.setVisible(true);
        }
    }
hier ist der Code, das zweite if kannst du ignorieren, soweit kommt er ja gar ned
 
Blender3D

Blender3D

Mir ist klar, dass er "1230.00â?" nicht in eine Zahl konvertieren kann
Die Frage ist warum in der csv Datei redundant das € Zeichen vermerkt ist. Vermutlich hast Du beim funktionierenden Aufruf einen Zeichensatz der das € Zeichen nicht beinhaltet. Darum funktionierts dort und sonst nicht. Um das zu umgehen könntest Du bevor Du eine Umwandlung in eine Zahl anstrebst alle Zeichen aus dem String vorher entfernen.
Java:
public static String trimToNumber(String str) {
        StringBuffer num = new StringBuffer();
        boolean comma = true;
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (Character.isDigit(c))
                num.append(c);
            if (comma && c == '.' || c == ',') {
                comma = false;
                num.append('.');
            }
        }
        return num.toString();
    }
 
Hatsi09

Hatsi09

Die Frage ist warum in der csv Datei redundant das € Zeichen vermerkt ist. Vermutlich hast Du beim funktionierenden Aufruf einen Zeichensatz der das € Zeichen nicht beinhaltet. Darum funktionierts dort und sonst nicht. Um das zu umgehen könntest Du bevor Du eine Umwandlung in eine Zahl anstrebst alle Zeichen aus dem String vorher entfernen.
Java:
public static String trimToNumber(String str) {
        StringBuffer num = new StringBuffer();
        boolean comma = true;
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (Character.isDigit(c))
                num.append(c);
            if (comma && c == '.' || c == ',') {
                comma = false;
                num.append('.');
            }
        }
        return num.toString();
    }
Super danke dir, das war das Problem, mit deiner Methode läuft es endlich😛
 
mrBrown

mrBrown

Der “richtige“ Weg wäre btw gewesen, das Charset als UTF-8 anzugeben, am einfachsten mit Files.newBufferedReader. Den eigentlichen Fehler versteckst du aktuell nur.
 
Thema: 

Jar datei ausführen verursacht NumberFormatException

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben