# NullPointerException bei Array



## metacortex (2. Juli 2004)

Hallo,
ich habe zwei Threads geschrieben, wobei der eine ein Array füllt, der andere es wieder leert - bzw. das ist die Zielstellung, denn funktionieren tut es nicht, da beim Ausführen eine NullPointerException auftritt.

Ich habe den Quelltext mal angehängt:


```
import java.util.Random;    
class StackerProcess extends Thread {
    static ArrayStack as;
    public StackerProcess(ArrayStack as) {}
    public void run() {
      while (true) {
        int intwert = (int) (Math.random()*6);
        int n = (int) (Math.random()*10000);
        as.push(intwert);
        System.out.println("\nStackerProcess hat Wert " + intwert + " eingetragen.");
        System.out.println("StackerProcess schlaeft jetzt " + n + " Millisekunden");
        try {
          sleep(n);
          }
        catch(InterruptedException e) {
          System.out.println(e.getMessage());
          }
        }
      }
    }

class RetrieverProcess extends Thread {
    ArrayStack as;
    public RetrieverProcess(ArrayStack as) {}
    public void run() {
      while(true) {
      /*    try {
         System.out.println("\nRetrieverProcess folgenden Wert aus dem Stack entfernt: " + as.pop());
          }
        catch (StackEmptyException g) {
          System.out.println("\nStack ist leer! Kein Wert wurde entfernt.");
          }        System.out.println("Damit ergibt sich eine Array-Füllung von " + as.size());
      */
        int n = (int) (Math.random()*10000);
        System.out.println("RetrieverProcess schlaeft jetzt " + n + " Millisekunden");
        try {
          sleep(n);
          }
        catch(InterruptedException e) {
          System.out.println(e.getMessage());
          }
        }
      }
    }

public class CommonStackTest {
    public static void main(String[] args) {
      ArrayStack as = new ArrayStack();
      RetrieverProcess rthread = new RetrieverProcess(as);
      StackerProcess sthread = new StackerProcess(as);
      sthread.start();
      rthread.start();
    }
  }
```

So und jetzt noch die ArrayStack-Klasse:

```
public class ArrayStack implements stack03 {

  public int stack[][] = new int[10][2];
  public int r;

  public int size() {
    for (int k=0;k<=9;k++) {
      if ((stack[k][1] == 0) || ((k == 9) & (stack[k][1] == 1))) {
        if ((k == 9) & (stack[k][1] == 1)) {
          int r = (k+1);
          break;
          }
        int r = k;
        break;
        }
      }
    return r;
    }
    
  public boolean isEmpty() {
    if (stack[0][1] == 0) {
      return true;
      } else {
      return false;
      }
    }
  
  public int top() throws StackEmptyException {
    if (isEmpty() == true) {
      throw new StackEmptyException();
      } else {
      for (int l=0;l<=9;l++) {
        if (stack[l][1] == 0) {
          int r = stack[l-1][0];
          }
        break;
        }
      return r;
      }
    }

  public void push (int a) {
    for (int i=0;i<=9;i++) {
      if (size() <= 9) {
        if (stack[i][1] == 0) {
          stack[i][0] = a;
          stack[i][1] = 1;
          break;
          }
        } else System.out.println("Stack ist voll");
      }
    }
    
  public int pop() throws StackEmptyException {
    int temp = 1;
    if (isEmpty() == true) {
      throw new StackEmptyException();
      } else {
      for (int i=0;i<=9;i++) {
        if ((stack[i][1] == 0) || ((i == 9) & (stack[i][1] == 1))) {
          if ((i == 9)& (stack[i][1] == 1)) {  // gilt nur für den Fall, daß Stack voll ist
            temp = 10;
            break;
            } // ende if (i == 9)
          temp = i;
          break;
          } // ende if stack ...
        } // ende for
      stack[temp-1][1] = 0;
      int r = stack[temp-1][0];
      return r;
      }
    }
  
   }
```

Dummerweise passiert eben, sobald ich auf das Objekt as zugreifen will, diese Ausnahme. Wieso?

Ich nehme an, es fehlt ein Eintrag in den jeweiligen Konstruktoren bei StackerProcess und RetrieverProcess!


----------



## Snape (2. Juli 2004)

Wo füllst Du denn das Array?

public int stack[][] = new int[10][2];

legt zwar en Array an, aber es ist noch voller NULL-Objekte.


----------



## metacortex (2. Juli 2004)

Na ich dachte, das fülle ich im Thread StackerProcess mit der as.push(intwert) - Methode!?


----------



## metacortex (2. Juli 2004)

Ich glaube übrigens auch garnicht, daß es mit nicht initialisierten Array-Feldern zusammenhängt. Die Felder werden ja trivial vorinitialisiert, d.h. bei INT mit dem Zahlwert 0. 

Ich denke eher, die Variable as zeigt auf NULL und nicht auf das Array. Dies würde zumindest erklären, warum die Exception sogar bei der eigentlichen Füll-Funktion push auftritt


----------



## Thomas Darimont (2. Juli 2004)

Hallo!

... wie wäre es denn wenn du die Konstruktoren mal sinnvoll implementierst? ;-)


```
public StackerProcess(ArrayStack as) {}

   ersetzen durch ... (da wo es nötig ist ...)


    public StackerProcess(ArrayStack as) {
        this.as = as;
    }
```

Gruß Tom


----------



## Snape (2. Juli 2004)

Ja, der Konstruktor ist es.
<hint>Wird von Eclipse mal wieder deutlich diese Stelle als NP ausgegeben

```
as.push( intwert );
```
in der run()-Methode im StackerProcess.
</hint>

Mit anderen Worten: Ab und an zahlt sich die Benutzung einer IDE aus...


----------



## Trespasser (12. Juli 2004)

Thomas ist sehr unhoflich!


----------



## Cybernd (12. Juli 2004)

Hinweise zu snape:

a) es gibt keine NULL Objekte. (Hey jetzt weiß ich warum SMA das null kritisiert, wo es doch auch wirklich ein Null(); für diesen Zweck geben könnte ;P)

NULL ist eine Sonderbehandlung die in der VM Spec entsprechend ausformuliert wird. Leider eine problematische Behandlung wie man es jetzt bei den Java 1.5 Metadaten sieht, denn dort ist NULL leider nicht zulässig.

b) Primitive Datentypen sind eine weitere Sonderbehandlung

ein new int[10][10] erstellt ein neues Array mit int's an jeder Arraystelle. Da es sich aber hierbei um einen primitive handelt wird dort automatisch ein Wert hinterlegt. Bei einem Array mit Objekten wäre es anders da ja zuerst nur das Array mit leeren Referenzen angelegt wird, aber bei primitiven gibt es diesen Zwischenlayer ja nicht wodurch dort automatisch der Wert hinterlegt wird. Das wiederum führt dazu das bei einem new int[10][10] eigentlich keine NullPointerException mehr auftreten kann.

Okay auch geschummelt denn natürlich kann auch hier eine Exception auftreten, denn int ist nunmal kein Objekt wodurch man darauf auch keine Methode anwenden kann ;o) Macht aber nix, denn man könnte das int gar nicht dazu bekommen das Sie eine Methodensignatur tragen würde. Man müsste also ein Array aus Integer() ereugen.

In Summe würde ich in dem Falle fast dazu neigen zu sagen, das du in dem Thema leider noch nicht allzu Sattelfest bist. Eventuell noch einmal ein entsprechendes Kapitel in einem Buch deiner Wahl durchlesen da es sich hier um wirklich elementares Grundwissen handelt. Viel wichtiger als z.b. eine bestimmte API zu können, da die Api ja selbst mit dem selben Grundwisse umgesetzt wird.

(Im übrigen gerade der Grund warum ich Javas eingeschränkten Sprachumfang liebe. Man braucht nur wenig Grundwissen wirklich können um damit jegliche 3rd Party lib interpretieren  zu können.)

hth
cybi


----------



## Thomas Darimont (12. Juli 2004)

Hallo!



> Thomas ist sehr unhoflich!



Wieso? Ich hab Ihm nur einen Tipp gegeben ;-) [War nicht bös' gemeint Roman] 

Gruß Tom


----------



## Cybernd (12. Juli 2004)

War wohl genauso sarkastisch formuliert wie deine ursprüngliche Antwort ;P

cybi


----------



## Thomas Darimont (12. Juli 2004)

Eigentlich nicht. 

Gruß Tom


----------



## Trespasser (12. Juli 2004)

irgendwie hast du herablassend geschreiben...

vielleicht war das nicht deine absicht!

mfg


----------



## Cybernd (12. Juli 2004)

Ein indirekter Hinweis auf die Fehlerquelle um dem Fragenden die Chance zu geben das Problem selbst aufzuspüren? Das interpretierst du als unhöflich?

cybi


----------



## Trespasser (12. Juli 2004)

sein tip ist nicht unhöflich nur die art wie er es geschreiben hat...

aber wie bereits gesagt : vielleicht war das nicht beabsichtigt....

kann in der Hitze des Gefechts schon mal vorkommen.


----------



## Cybernd (12. Juli 2004)

Ich neige dazu meine Antworten ebenso zu formulieren, da ich nie die Antwort vorkauen will. 

Begründung: Kaue ich sie vor wird der Fragestellung eventuell nicht in der Lage sein aus den Fehlern zu lernen. Wenn er den Fehler aber durch die indirekte Antwort selbst gefunden hat wird er sich diese Stelle besser merken können.

Aber dort unhöflichkeit reinzuinterpretieren ist dann schon ein wenig aus den Haaren herbeigezogen.

cybi


----------



## Trespasser (12. Juli 2004)

irgendwie kommt da nichts gescheites heruas.....

ich meine den Thomas seine antworten nicht deine.

aber  du brauchst ihm nicht so offensichtlich dazulegen,
das er deiner Meinung nach ein java-*depp* ist und nicht hier hergehört.

Jeder auf dem Board ist willkommen und soll lernen.
Doch durch sowas verdirbt man jemanden die Lust.

mfg


----------



## Cybernd (12. Juli 2004)

Wieso versuchst du dich gerade rechtzufertigen?

Fällt dir eigentlich auf, das du der einzige bist der sich im Moment angegriffen fühlt? 

Üblicherweise bin ich bei derartig rethorischen Antworten gewohnt das die Ursprungsposter danach mit einem Danke antworten. Das sagt mir im übrigen meine Erfahrung, da ich bereits ettliche tausend Antworten formuliert habe.

cybi


----------



## Thomas Darimont (12. Juli 2004)

> Jeder auf dem Board ist willkommen und soll lernen.
> Doch durch sowas verdirbt man jemanden die Lust.



So soll es auch sein und so ist es auch. Wie schon gesagt die obige Aussage war wirklich nicht böse gemeint und damit ist das Thema erledigt. Ich bin immer froh, wenn neue Leute ins Forum kommen, mit denen man sich über Java Erfahrungen Unterhalten und austauschen kann.

Gruß Tom


----------



## Trespasser (12. Juli 2004)

ich rechtfertige mich nicht! und schreibe dir auch nicht vor wie du deine
Anworten formulieren sollst - Ich habe lediglich meine Meinung abgegeben.

Würderst du einen Chef einer Firma auch so ansprechen der dir einen 
10.000 € Auftrag gegeben hat?

Wäre nur mal zum überlegen ob man auch so behandelt werden will!

Du brauchst dich auch nicht rechtferitigen.  Ich habe kein problem mit deinen
Antworten. Habe dich lediglich darauf hingewiesen.

mfg


----------



## Cybernd (12. Juli 2004)

Und wir weisen dich lediglich darauf hin das die ursprüngliche, kritisierte Antwort keinerlei Abwertung / Unhöflichkeit enthält. 

so what?
cybi


----------



## Trespasser (12. Juli 2004)

Wie du meinst....

Ein Forum ist dazu da Tips zugeben.
Was jeder aus den Tips macht ist seine Sache.

Trotzdem finde ich du hast recht hast, dass man jeden ohne drumherum auf 
seine Fehler hinweisen soll. Nur finde ich das deine Methode zu hart war.

belassen wir nun dabei!


----------



## Cybernd (12. Juli 2004)

Wie hättest du es denn formuliert?

cybi


----------



## Trespasser (12. Juli 2004)

ihm nur die Fehler gesagt und das mit dem "nochmal  lesen" weggelassen.

mfg


----------



## Cybernd (12. Juli 2004)

Wo schrieb Thomas "nochmal Lesen?"

Könnte es sein das du Dinge in seine Aussage hineininterpretierst die nicht existieren.

Also ich empfinde Thomas antwort als höflicher gegenüber einem nüchternen
"this.as = as; fehlt"

cybi


----------



## Trespasser (12. Juli 2004)

die letzten meldungen waren jetzt auf deine Antwort bezogen.

belassen wirs jetzt dabei,
es kennt sich jetzt eh keiner mehr aus.


----------



## metacortex (12. Juli 2004)

Ich fand es nicht als herablassend und auch nicht beleidigend. In diesem Sinne denke ich, das Thema hat sich unterdessen erledigt. 

Vielen Dank für die ursprünglichen Tipps, die letzten Posts haben ja inhaltlich nichts mehr mit der Problemstellung zu tun.

Grüße
Metacortex


----------



## Trespasser (12. Juli 2004)

Finde ich auch dass sich das erledigt hat.

Vielleicht sollte ich mich korrigieren:  eher nicht sehr nett,statt herablassend und beleidigend.

Menschen aben nun mal imLeben unterschiedliche Ansichten,Stile etc.
Wäre ja ziemlich langweilig wenn alle gleich wären. Ins besondere wenn es keine Mädchen gäbe

mfg


----------

