Compiler-Fehler NullPointerException beim Auslesen von .lang-Datei

Beatsleigher

Bekanntes Mitglied
Moin,

ich habe jetzt gute vier Stunden an einem Parser für meine Übersetzungsdatein gebastelt und er liest gut bis zur Hälfte durch und dann schmeißt er einen Fehler.

Vorab: Hier ist die Datei, die er ausließt: GitHub

Und hier ist die Klasse, mit dem Parser (die Methode ist 500+ Zeilen, die schreibe ich hier mit Sicherheit nicht rein.): GitHub
Ab Zeile 1534 fängt die parse()-Methode an.

Stack Trace:
Code:
[COLOR="Red"]Exception in thread "main" java.lang.NullPointerException
	at eu.m4gkbeatz.androidtoolkit.ui.UAT$LangFileParser.parse(UAT.java:1938)
	at eu.m4gkbeatz.androidtoolkit.ui.UAT.loadTranslation(UAT.java:84)
	at eu.m4gkbeatz.androidtoolkit.ui.UAT.<init>(UAT.java:74)
	at eu.m4gkbeatz.androidtoolkit.Main.main(Main.java:176)[/COLOR]

Bitte sagt mir, ihr findet da einen Fehler. Ich bin den ganzen Code und die Datei mindestens vier Male durchgegangen, da ist nichts. Der unterbricht einfach mitten drin.

Ich hoffe ihr könnt mir helfen.

Danke im Voraus!

EDIT:

Ich habe die Datei mal in eine String gelesen, und dann mittels StringReader ausgelesen, genau der gleiche Fehler.

EDIT2:
Ich habe mir mal die derzeit auszulesende Zeile ausgeben lassen, der s*****t mir da die halbe Datei auf der Matte.
Code:
[DEBUG]::[2 May 2014 02:22:38 GMT] - Attempting translation from file: file:/home/beatsleigher/code/Java/UniversalAndroidToolkit/Universal_Android_Toolkit/build/classes/eu/m4gkbeatz/androidtoolkit/resources/langs/en_gb.lang

 tabs {
      androidTab=Android
      fastbootTab=Fastboot
      deviceTab=Device
      toolkitTab=Toolkit
      logcatTab=Logcat
      dmesgTab=DMESG
      batteryTab=Battery
      rootTab=Root and CPU
      buildPropTab=Build Prop Manager
      fileManagerTab=File Manager
      settingsTab=Preferences
      updatesTab=Updates
 };
 
 panels {
      androidTab: {
Exception in thread "main" java.lang.NullPointerException
	at eu.m4gkbeatz.androidtoolkit.ui.UAT$LangFileParser.parse(UAT.java:1946)
	  applicationsPanel=Applications
	  filesPanel=Files
	  backupsPanel=Backups
	  rootingPanel=Rooting
	  adbTCPPanel=ADB via TCP
      };
      
      fastbootTab: {
	at eu.m4gkbeatz.androidtoolkit.ui.UAT.loadTranslation(UAT.java:84)
	at eu.m4gkbeatz.androidtoolkit.ui.UAT.<init>(UAT.java:74)
	  formattingPanel=Formatting
	  flashingPanel=Flashing
	  bootPanel=Boot
	  lockStatePanel=Lock State
	  updatePanel=Update
      };
      
	at eu.m4gkbeatz.androidtoolkit.Main.main(Main.java:176)
      settingsTab: {
	  devicesPanel=Devices
	  updatesPanel=Updates
	  logsPanel=Logs
	  themePanel=Theme
	  languagePanel=Language
      };
 };
 
 toolbar {
      showDevicesButton=Show Devices
 };
[DEBUG]::[2 May 2014 02:22:38 GMT] - Reloading devices...
 
Zuletzt bearbeitet:
Die Zeile in der der Fehler Auftritt steht da doch.

10 Sekunden mit einem debugger und die Lösung ist da.

Es sei an der Stelle angemerkt, dass dieser Code niemals durch irgendeine Code Review kommen würde

Die NPE kommt daher, dass du line.contains machst, obwohl noch line nicht gelesen wurde. Line ist null.
 
Zuletzt bearbeitet:
Wie JavaMeister schon sagt, die Exception und der StackTrace sagen dir Fehler und die Zeile die den Fehler verursacht!

Generell bei Datei auslesen: verwende eine normale while-Schleife (wie die äußerste) und prüfe das eingelesene auf null. Dann kann man gar nicht in die Gefahr eine NPE kommen.

Weitere Tipps:
Um die Methode übersichtlicher zu machen, teile sie auf! Du kannst 5 weitere Methoden machen (für buttons_and_labels, menus, tabs, panels, toolbar) und sollte eine Exception passieren kannst du genauer sehen welchen "Bereich" es betrifft.

Du prüfst immer wieder
Code:
 while (!line.equals("      };"));
, spare dir die Leerzeichen und prüfe ob die Zeile mit "};" endet. Vermeide viele Leerzeichen in zu überprüfenden Strings, 1x was falsch getippt/geändert und der Code arbeitet nicht mehr wie erwünscht! Probiere die String zu trimmen etc.

Java:
if (line.contains("refreshButton=")) {
    String[] arr = line.split("=");
    refreshButton = arr[1];
}
if (line.contains("intervalLabel=")) {
    String[] arr = line.split("=");
    intervalLabel = arr[1];
}
if (line.contains("secondsLabel=")) {
    String[] arr = line.split("=");
    secondsLabel = arr[1];
}
.....

Hast du dir schon mal überlegt was passiert wenn du folgende Zeile parsen willst?
Code:
..... refreshButton=XXXX intervalLabel=YYYY ....
refreshButton und intervalLabel bekommen beide XXXX gesetzt 😉

[TIPP]Allgemein bei Parsern: Gehe nie von einer fixen Formatierung aus, nur von einer fixen Syntax! [/TIPP]
Das hat den Vorteil die Formatierung des zu parsenden Files ändern kann (besser lesbar), aber der Parser immer noch funktioniert.
Bei fixen Leerzeichen muss das File immer passend formatiert sein. Ob jetzt aber zwischen 2 Properties ein Leerzeichen, zehn Leerzeichen oder gleich >100 Leerzeichen stehen sollte egal sein solange min 1 dazwischen ist!
 
Danke für die Antworten.

Ich war müde und war nicht mehr frisch in der Birne, Tipps gemerkt und werden umgesetzt.
Ich habe mich nur gewundert, weil es dre Schleifen lang funktioniert, und dann wenn ich eine Zeile ausgeben lasse, er mir da die halbe Datei vor der Tür s*****t.
 

Zurück
Oben