Merkwürdige NumberFormatException

J2EE, JSP, JSF, VisualWeb-Pack usw.

Moderator: wegus

Antworten
Benutzeravatar
jann
Beiträge: 50
Registriert: 18.09.2008, 19:34
Wohnort: Winsen (Aller)
Kontaktdaten:

Merkwürdige NumberFormatException

Beitrag von jann » 24.08.2015, 12:49

Moin zusammen,

seit längerem ärgern mich sporadisch auftretende Fehlermeldung in meiner Webanwendung, denen ich nicht auf die Spur komme. Ich habe eine FrontController Anwendung laufen (Java-Servlets/JSP/MySQL, Tomcat), bei der nicht reproduzierbar NumberFormatExceptions auftreten: Bsp:

java.lang.NumberFormatException: For input string: "1214E2.1214E2"

Alle Eingaben in den Formularfeldern werden geprüft und ggfs. abgefangen; selbst solche Strings, wie in der Fehlermeldung. Es sind auch nicht immer die gleichen Strings, welche in der Fehlermeldung (NumberFormatException) angezeigt werden.
Wenn solch ein Fehler auftritt, kann er auch bei einer exakten Wiederholung des Ablaufs, +Programm- und Datenbankzustand, nicht reproduziert werden.

Hat hier jemand schon mal so ein ähnliches Problem gehabt und gelöst bzw. hat jemand eine Idee, in welche Richtung ich suchen müsste?

GRuß, Jann

Benutzeravatar
smurfi
Site Admin
Beiträge: 1623
Registriert: 29.06.2006, 11:33
Wohnort: Wuppertal
Kontaktdaten:

Re: Merkwürdige NumberFormatException

Beitrag von smurfi » 25.08.2015, 05:49

Hallo,

leider ist mir so etwas nicht in der art passiert.
Kann es aber sein das es sich um ein Problem mit nicht richtig aufgeräumten Variablen handelt (Session oder Cache usw.)?
Ich kenne ein nicht immer erklärbares Problem im ADF-Framework von Oracle wenn der Browsercache da nicht richtig mitspielt z.B. wenn der Anwender im Browser den Zurück-Button benutzt. Wir haben für eine Anwendung Extra den Browsercache ausschalten müssen.

Gruß
Michael

Benutzeravatar
jann
Beiträge: 50
Registriert: 18.09.2008, 19:34
Wohnort: Winsen (Aller)
Kontaktdaten:

Re: Merkwürdige NumberFormatException

Beitrag von jann » 26.08.2015, 15:14

Hi,

die Sessions verlieren laufen nach einer festgelegten Zeit ab und werden dann automatisch vom Tomcat gelöscht. Variablen aufräumen unter Java? Ich dachte um so was muss ich mich nicht kümmern? Das habe ich das letzte Mal mit Turbo Pascal 5.5 gemacht ;-)

Wie würde das in Java gehen?

Gruß, Jann

Benutzeravatar
smurfi
Site Admin
Beiträge: 1623
Registriert: 29.06.2006, 11:33
Wohnort: Wuppertal
Kontaktdaten:

Re: Merkwürdige NumberFormatException

Beitrag von smurfi » 27.08.2015, 05:58

Naja, aufräumen von Variablen macht Java eigentlich schon von alleine.
Ich meinte viel mehr das verhalten im Browser, da ich nicht weiß wie deine Anwendung aufgebaut ist kann ich dir da auch schlecht sagen was du machen könntest. Zum testen könntest du mal probehalber den Browsercache ausschalten so das dieser nicht mehr zwischenhält.

Gruß
Michael

Benutzeravatar
jann
Beiträge: 50
Registriert: 18.09.2008, 19:34
Wohnort: Winsen (Aller)
Kontaktdaten:

Re: Merkwürdige NumberFormatException

Beitrag von jann » 30.08.2015, 12:41

So, nach einiger Recherche bzw. genauerer Analyse der Exceptions konnte ich das Auftreten des Fehlers verhindern. Die grundsätzliche Ursache scheint aber irgendwo in der Tiefe von Java zu liegen.

Ich versuche den Vorgang mal darzustellen:
An einigen Stellen in meiner Webanwendung wurden bzw. werden Datum- oder Datum+Zeitangaben teilweise über SimpleDateFormat in Date geparst.
Bsp.:

Code: Alles auswählen

...
+------------------+--------------+------+-----+---------------------+----------------+
| Field            | Type         | Null | Key | Default             | Extra          |
+------------------+--------------+------+-----+---------------------+----------------+
...
| anfrage_vom      | datetime     | NO   |     | 1970-01-01 00:00:00 |                |
...
+------------------+--------------+------+-----+---------------------+----------------+
...
public class KalenderUtils {
...
    public static SimpleDateFormat edtl_sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.UK);
    public static SimpleDateFormat gd_sdf = new SimpleDateFormat("dd.MM.yyyy",Locale.UK);
...
}
...
in einer anderen Klasse:
...
try {
    bz.setAnfrage_vom(KalenderUtils.edtl_sdf.parse(resSet.getString("b.anfrage_vom")));
} catch (ParseException ex) {
    bz.setAnfrage_vom(new Date());
}
...
Die zu parsenden Angaben kommen aus einer MySQL-Datenbank und liegen dort in korrektem Format vor! Dass das Parsen, wie oben angegeben, unsinnig ist, sei mal dahingestellt... ;-)
Methoden dieser Art werden bzw. wurden in meiner Anwendung täglich millionenfach durchlaufen und produzierten seit kurzem durchschnittlich 10 Mal am Tag eine NumberFormatException, obwohl die parse-Methode eigentlich nur eine ParseException hätte werfen sollen!
Um dem Spuk ein Ende zu bereiten, habe ich den Code oben, wie folgt abgeändert. Was viel sinnvoller ist:

Code: Alles auswählen

bz.setAnfrage_vom(resSet.getDate("b.anfrage_vom"));
Jetzt kommen die Fehlermeldungen nicht mehr!

An einer anderen Stelle im Programm warf sogar dieser Code alle paar Tage eine NumberFormatException:

Code: Alles auswählen

...
    private Date von;
...
    this.von = KalenderUtils.gd_sdf.parse("1970.01.01");
...
Es ist natürlich ebenso unsinnig die Variable so zu initialisieren aber der Programmcode ist teilweise schon 12 Jahre alt und manche temporäre "geistige Umnachtung" ist nun mal mit eingeflossen, dringeblieben und ohne weiter nachzudenken vervielfältigt worden - da ja alles bis vor wenigen Wochen auch fehlerfrei lief.

Hier noch mal zwei Auszüge aus den Exceptions:

Code: Alles auswählen

ERROR: Controller (Exception): For input string: ".001514E.4" - java.lang.NumberFormatException: For input string: ".001514E.4"
***
Full Exception:
[sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224), java.lang.Double.parseDouble(Double.java:510), java.text.DigitList.getDouble(DigitList.java:151), java.text.DecimalFormat.parse(DecimalFormat.java:1303), java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1544), java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1264), 
...
oder

Code: Alles auswählen

ERROR: Controller (Exception): For input string: "" - java.lang.NumberFormatException: For input string: ""
***
Full Exception:
[java.lang.NumberFormatException.forInputString(NumberFormatException.java:48), java.lang.Long.parseLong(Long.java:424), java.lang.Long.parseLong(Long.java:461), java.text.DigitList.getLong(DigitList.java:177), java.text.DecimalFormat.parse(DecimalFormat.java:1298), java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1544), java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1264),
Fragen die für mich offen bleiben:
Wie kommen die fehlerhaften Werte zustande (bspw. ".001514E.4" und "") und warum wird nicht schon viel früher eine ParseException bzw. NullPointerException geworfen?
Die Beantwortung wäre für mich aber nur von theoretischem Interesse.

Vielen Dank für's Mitdenken, Jann

ebaumann
Beiträge: 285
Registriert: 22.01.2009, 08:53
Wohnort: Würzburg
Kontaktdaten:

Re: Merkwürdige NumberFormatException

Beitrag von ebaumann » 31.08.2015, 07:40

Es ist schon länger her, deshalb kenne ich die Details nicht mehr: In einer MySQL-Datenbank kann ein "Null-Datum" (es existiert keines) als ein String angelegt werden (es gibt Leute, die tun das - warum auch immer - weil sie nullable auf false für das Datum setzen und nun für Null-Daten eines definiert sein muss, dass dann aber nicht gültig sein darf), der nicht in ein Datum konvertiert werden kann. Wird dieser geparst, statt null geliefert, gibt es "natürlich" eine Ausnahme, da daraus kein Datum erzeugt werden kann.

Dies sollte anhand der Tabelleneigenschaften bzw. des Table-Create-Statements zu erkennen sein. Der MySQL-JDBC-Treiber kann dann Leerstrings oder Null liefern. D.h., es ist diesem beim Verbindungsaufbau mitzuteilen.

Antworten