NullPointerException bei Array

metacortex

Grünschnabel
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:

Code:
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:
Code:
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!
 
Zuletzt bearbeitet:
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.
 
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
 
Hallo!

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

Code:
    public StackerProcess(ArrayStack as) {}

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


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

Gruß Tom
 
Ja, der Konstruktor ist es.
<hint>Wird von Eclipse mal wieder deutlich diese Stelle als NP ausgegeben
Code:
as.push( intwert );
in der run()-Methode im StackerProcess.
</hint>

Mit anderen Worten: Ab und an zahlt sich die Benutzung einer IDE aus... ;)
 
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
 

Neue Beiträge

Zurück