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:
So und jetzt noch die ArrayStack-Klasse:
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!
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: