java.lang.NullPointerException: liste[i].length()

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • java.lang.NullPointerException: liste[i].length()

    Quellcode

    1. public static void main(String [] args ) {
    2. // TODO code application logic here
    3. /*Namensliste_laenge
    4. Es soll eine Liste von Namen erfasst werden
    5. Nach dem Erfassen soll für jeden Namen die Anzahl der Buchstaben
    6. ausgegeben werden
    7. zb.
    8. Stefan 6
    9. Claudia 7
    10. ...*/
    11. String name;
    12. String liste[]=new String[100];
    13. for(int i=0; i<=liste.length;i++){
    14. System.out.println("Geben Sie Name ein: ");
    15. name=Eingabe.readString();
    16. if(name.equals (".")){
    17. System.out.println("Listeneingabe beendet!");
    18. for(int j=0; j<=liste.length;j++){ //Für die Liste
    19. if(liste[j]!=null){
    20. }
    21. System.out.print("Name: "+liste[j]);
    22. System.out.println(" Buchstaben: "+liste[j].length());
    23. }
    24. break;
    25. }
    26. else{
    27. liste[i]=name;
    28. }
    29. }
    30. }
    31. }
    Alles anzeigen




    Was ist da falsch? Bei der Ausgabe erscheint diese Fehlermeldung:

    Exception in thread "main" java.lang.NullPointerException

    at namenlänge.Main.main(Main.java:44)
    Name: nullJava Result: 1




    an was kann das liegen? Könnt ihr mir bitte helfen? Danke im voraus
  • Moin,

    Du erstellst ein String-Array mit einer Größe von 100.
    Ich bezweifle jetzt mal, dass Du dieses auch bis auf den Index 99 füllst.

    Zeile 44 wirft also dann die Exception, sobald ein Index erreicht wird,
    dem vorher kein String zugeordnet wurde -> er ist null.

    Würdest Du Zeile 44 + 45 mit in die vorherige if-Abfrage packen,
    dann sollte es keine Problem geben, da dann auf null geprüft wird.

    Was mich wundert:
    Du schachtelst zwei Mal dieselben for-Schleifen, einmal mit dem Index i,
    einmal mit dem Index j.
    Das entzieht sich jedweder Logik, da zuerst wohl das Array gefüllt werden sollte,
    bevor das Ganze durchlaufen wird.
    So wie es jetzt ist, müsstest Du nach der ersten Eingabe die Ausgabe des ersten Namens bekommen,
    gefolgt von der NullPointerException.

    Gruß,
    Puni
  • Quellcode

    1. for(int i=0; i<=liste.length;i++){
    2. ...
    3. for(int j=0; j<=liste.length;j++){


    Über den Sinn oder Unsinn des Codes lass ich mich nicht aus, aber die beiden zitierten Zeilen sind der Stein des anstoßes. Eine Liste mit 5 Elementen (liste.size) die bei 0 anfängt geht logischerweise nur bis 4 (liste[0], liste[1]. liste[2], liste[3] & liste[4] = 5 Elemente). Deine Schleifen müssen also eher so lauten: for(int i=0; i<liste.length;i++). Aus dem "kleiner gleich" muss ein "echt kleiner" werden, da du sonst jedesmal einen über das Ziel hinausschießt.
    Das andere Problem ist, dass du womöglich keine 100 Strings eingibst sondern mit . vorher abrichst. Das behandelst du es in der zweiten Schleife auch nicht. Du fragst zwar ab ob der String null ist, aber wenn das so ist machst du einfach genau das gleiche wie wenn das nicht fder Fall ist. Du hast da einfach leere geschweifte Klammern, das bewirkt einfach überhaupt nix, er macht dann dadrunter weiter. du musst die println() schon in die Geschweiften Klammern reinschreiben, sonst wird das nix. Du solltest dir die Geschweiften Klammern aber insgesamt nochmal angucken, das sieht irgendwie komisch aus - es würde helfen wenn du den Code ein wenig einrückst.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • RE: java.lang.NullPointerException: liste[i].length()

    FBI_1907 schrieb:

    Quellcode

    1. String liste[]=new String[100];

    das wahre Problem liegt imho hier. Nimm doch für Listen auch wirklich ne Liste (ArrayList bzw Vector oder LinkedList oder sonstwas)als Datenstruktur. Arrays mit fester Länge sind eher selten ne gute idee, wenn man keine Ahnung hat wieviele Daten denn da reinkommen können.
  • Ob dynamischer Vektor oder statisches Array, im prinzip macht das doch überhaupt keinen Unterschied. Das hat lediglich Auswirkungen auf den Speichbedarf und lässt sich aus effizienzgründen sicher optimieren. Das Problem mit nicht initialisierten Stingobjekten und Schleifen die über die Grenzen laufen bleib 1:1 bestehen. Es ist also ganz lediglich ein Effizienzproblem und muss "hinten anstehen"
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • SeBa schrieb:

    Das Problem mit nicht initialisierten Stingobjekten und Schleifen die über die Grenzen laufen bleib 1:1 bestehen.
    Nein bleibt es nicht. Bzw muss man sich da schon wirklich anstrengen um das trotzdem noch schiefgehen zu lassen. Z.B. liefert ein Vector mit liste.Size nur die tatsächliche Anzahl an Elementen im Vector und nicht die Kapazität. Damit würde eine Schleife for(int i=0; i<liste.size;i++) schonmal problemlos funktionieren.
    Und auch nicht initialisierte Stringobjekte müsste man mutwillig in die Liste einfügen um damit Probleme zu bekommen.
    Es geht hier nicht nur um Optimierung, es geht darum Fehlerquellen von vorneherein auszuschließen.
  • Sorry, aber da bin ich anderer Meinung! Da er den Vektor mit readLine füllt und readLine prinzipiell null zurücklieferen kann muss man den Fall behandeln. null tritt dann sicher seltener auf als bei einem Array, aber den Fall deswegen nicht zu behandeln ist grob fahrlässig und macht sein Programm nicht viel besser. Es wird nur schwerer den Fehler zu finden und reporduzieren.

    Und for(int i=0; i<liste.size;i++) funktioniert auch bei einem Array problemlos, sagte ich aber auch bereits.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • SeBa schrieb:

    Und for(int i=0; i<liste.size;i++) funktioniert auch bei einem Array problemlos, sagte ich aber auch bereits.
    das das prinzipiell funktioniert ist klar, nur läuft man dabei auch über array-felder, die im Programm noch nie in irgend einer weise benutzt wurden. Alle Elemente in nem Vector hat man zumindest mal da reingesteckt.
    Und das readline null liefern kann ist klar, aber das würde ich zu dem Zeitpunkt an dem man es einliest überprüfen, und nicht wenn mans schon längst irgendwo in ner Datenstruktur abgespeichert hat.
  • Rondrer schrieb:

    SeBa schrieb:

    Und for(int i=0; i<liste.size;i++) funktioniert auch bei einem Array problemlos, sagte ich aber auch bereits.
    das das prinzipiell funktioniert ist klar, nur läuft man dabei auch über array-felder, die im Programm noch nie in irgend einer weise benutzt wurden.
    Für mich ein Optimierungsproblem, sollte die Funktionalität nicht beeinträchtigen.


    Rondrer schrieb:

    Alle Elemente in nem Vector hat man zumindest mal da reingesteckt.
    Und das readline null liefern kann ist klar, aber das würde ich zu dem Zeitpunkt an dem man es einliest überprüfen, und nicht wenn mans schon längst irgendwo in ner Datenstruktur abgespeichert hat.
    Macht auf jedenfall Sinn, auf null sollte man aber auch beim auslesen prüfen, außer das Programm ist so primitiv wie dieses hier.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]