# Hilfe bei Informatik Hausaufgaben



## D1visionByZer0 (2. Nov 2018)

Hallo Java Community,
Ich komme gerade bei meinen Informatik Hausaufgaben nicht weiter.
Das Programm gibt die ganze Zeit eine NullPointerException Fehlermeldung aus.

Der Quelltext lautet:

package deutsche.bahn;

import java.util.Random;

/**
 *
 */
public class Strecke {
        Stack<Integer> gleis1= new Stack();
        Stack<Integer> gleis2= new Stack();
        Stack<Integer> gleis3= new Stack();
        Random r = new Random();

    public void sortieren(int panzahl){
        for(int i=0;i<panzahl;i++){
            gleis1.push(r.nextInt(20));
            System.out.println(gleis1.top());
        }

        while(!gleis1.isEmpty()){
            while(gleis1.top()>gleis3.top()||gleis3.isEmpty()){ 
                gleis3.push(gleis1.top()); 
                gleis1.pop(); 
                }

            //Falls nun es nicht mehr stimmt
            while(!gleis1.isEmpty()&&gleis3.top()>gleis1.top()){
                gleis2.push(gleis3.top()); 
                gleis3.pop();
             }
        }


        while(!gleis2.isEmpty())
        {
            while(gleis2.top()>gleis3.top()||gleis3.isEmpty()){
                gleis3.push(gleis2.top());
                gleis2.pop();
            }

            //Falls nun es nicht mehr stimmt
            while(gleis2.top()<gleis3.top()&&!gleis2.isEmpty()){
            gleis1.push(gleis3.top());
            gleis3.pop();
                 }
        }

        while(!gleis1.isEmpty()){
            while(gleis3.top()<gleis1.top()||gleis3.isEmpty()){ //Solange die Reihenfolge stimmt.
                gleis3.push(gleis1.top()); //Von Gleis 1 auf Gleis 3
                gleis1.pop(); //Aus Gleis 1 gelöscht
                }

            //Falls nun es nicht mehr stimmt
            while(!gleis1.isEmpty()&&gleis3.top()>gleis1.top()){
                gleis2.push(gleis3.top()); 
                gleis3.pop();
             }
        }

    }

}
Vielen Dank schon mal jetzt.


----------



## mihe7 (2. Nov 2018)

D1visionByZer0 hat gesagt.:


> Das Programm gibt die ganze Zeit eine NullPointerException Fehlermeldung aus.



Im Stacktrace der Exception steht, in welcher Klasse und in welcher Zeile die Exception aufgetreten ist...


----------



## D1visionByZer0 (2. Nov 2018)

@mihe7 laut der Ausgabe: 
at deutsche.bahn.Strecke.sortieren(Strecke.java:27)
at deutsche.bahn.DeutscheBahn.main(DeutscheBahn.java:21)
ich finde jedoch da nicht wo dort eine NullPointerException seien soll.


----------



## mihe7 (2. Nov 2018)

Ja, und was steht in Strecke.java, Zeile 27?


----------



## D1visionByZer0 (2. Nov 2018)

while(gleis1.top()>gleis3.top()||gleis3.isEmpty()){


----------



## mihe7 (2. Nov 2018)

Kann es sein, dass weiter oben im Stacktrace noch etwas von Stack.java steht?

EDIT: mal andersrum gefragt, was ist das für eine Stack-Klasse?


----------



## fhoffmann (2. Nov 2018)

Du solltest erst überprüfen, ob gleis3 leer ist, und erst dann das oberste Element nehmen.


----------



## mihe7 (2. Nov 2018)

@fhoffmann darauf wird es hinauslaufen


----------



## D1visionByZer0 (2. Nov 2018)

@fhoffmann das hat schon mal den eine Fehler behoben jetzt kommt aber die Fehlermeldung and Stelle 33:
while(gleis3.top()>gleis1.top()&&!gleis1.isEmpty()){


----------



## fhoffmann (2. Nov 2018)

Dann drehe das doch auch um

```
while(!gleis1.isEmpty()&&gleis3.top()>gleis1.top()){
```


----------



## D1visionByZer0 (2. Nov 2018)

Schon mal euch beiden vielen Dank für eure Hilfe


----------



## D1visionByZer0 (2. Nov 2018)

fhoffmann hat gesagt.:


> Dann drehe das doch auch um
> 
> ```
> while(!gleis1.isEmpty()&&gleis3.top()>gleis1.top()){
> ```


So hatte ich das eben. 
Ändert leider nichts daran.


----------



## D1visionByZer0 (2. Nov 2018)

```
for(int i=0;i<panzahl;i++){
            gleis1.push(r.nextInt(20));
            System.out.println(gleis1.top());
        }
```
oder könnte es etwas mit der zweiten Zeile zu tun haben?


----------



## mihe7 (2. Nov 2018)

D1visionByZer0 hat gesagt.:


> könnte es etwas mit der zweiten Zeile zu tun haben?


@D1visionByZer0 immer ins Stacktrace schauen, das hatten wir doch schon


----------



## mihe7 (2. Nov 2018)

Und noch was: 





> EDIT: mal andersrum gefragt, was ist das für eine Stack-Klasse?


----------



## D1visionByZer0 (2. Nov 2018)

Die Steck Klasse:

```
public class Stack<ContentTyp> {
    private StackNode head;
   
    private class StackNode {
    private ContentTyp content;
    private StackNode next;
        /**
         * @return the Name
         */
        public ContentTyp getContent() {
            return content;
        }

        /**
         * @param Name the Name to set
         */
        public void setContent(ContentTyp content) {
            this.content = content;
        }

        /**
         * @return the next
         */
        public StackNode getNext() {
            return next;
        }

        /**
         * @param next the next to set
         */
        public void setNext(StackNode next) {
            this.next = next;
        }
       
            public StackNode(ContentTyp pName){
            content=pName;
            next = null;
            }
   
    }
    public Stack (){
        head = null;
    }
    boolean isEmpty(){
        return head==null;
    }
    public void push(ContentTyp pContent){
        StackNode x = new StackNode(pContent);
        if (isEmpty()) {
            head = x;
    }
        else {
            x.setNext(head);
            head = x;
        }   
    }
    public void pop() {
       /* if (isEmpty()) {
            throw new RuntimeException("Die Warteschlange ist leer!");
        }
       */
        if(!isEmpty())head = head.getNext();
    }
    public ContentTyp top(){
        if(isEmpty()){
            return null;
        }
        else{
           
            return head.getContent();
        }
    }
}
```


----------



## D1visionByZer0 (2. Nov 2018)

Das steht im Stacktrace:

```
Exception in thread "main" java.lang.NullPointerException
    at deutsche.bahn.Strecke.sortieren(Strecke.java:33)
    at deutsche.bahn.DeutscheBahn.main(DeutscheBahn.java:21)
C:\Users\?\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)
```


----------



## mihe7 (2. Nov 2018)

Evtl. ist ja diesmal das andere gleisX.top() == null?


----------



## D1visionByZer0 (2. Nov 2018)

@mihe7 leider nicht.


----------



## mihe7 (2. Nov 2018)

Naja, eines von beiden muss ja sein.


----------



## D1visionByZer0 (2. Nov 2018)

@mihe dachte ich eigentlich auch. Jedoch ist die NullPointerException für mich sehr verwirrend.


----------



## mihe7 (2. Nov 2018)

`while(!gleis1.isEmpty()&&!gleis3.isEmpty()&&gleis3.top()>gleis1.top()){`


----------



## D1visionByZer0 (2. Nov 2018)

Jetzt meckert er entweder über die Zeile 27 wie eben oder er hängt sich auf. scheinbar müssen wir irgendwelche Fälle übersehen.


----------



## mihe7 (2. Nov 2018)

D1visionByZer0 hat gesagt.:


> wir


Du, nicht wir ;-)


----------



## D1visionByZer0 (2. Nov 2018)

mihe7 hat gesagt.:


> Du, nicht wir ;-)


Das stimmt.


----------



## mihe7 (2. Nov 2018)

Worum gehts eigentlich?


----------



## D1visionByZer0 (2. Nov 2018)

mihe7 hat gesagt.:


> Worum gehts eigentlich?


http://www.oberstufeninformatik.de/info13/Stack.pdf
Diese Strategie halt benutzen um Züge nach "Größe" zu sortieren. Man hat halt nur 3 Gleise. Ein Startgleis, ein Zielgleis und ein Abstell Gleis.


----------



## mihe7 (3. Nov 2018)

Ah, ja. Zwei Anmerkungen:

1. Du musst das "Arbeitsgleis" und das "Abstellgleis" ggf. mehrfach wechseln (= dynamisch).
2. Deine Initialisierung sorgt mit hoher Wahrscheinlichkeit dafür, dass eine Zugnummer mehrfach vorkommt. Das darf entweder nicht sein oder Du musst den Vergleich entsprechend anpassen.


----------



## D1visionByZer0 (3. Nov 2018)

mihe7 hat gesagt.:


> Ah, ja. Zwei Anmerkungen:
> 
> 1. Du musst das "Arbeitsgleis" und das "Abstellgleis" ggf. mehrfach wechseln (= dynamisch).
> 2. Deine Initialisierung sorgt mit hoher Wahrscheinlichkeit dafür, dass eine Zugnummer mehrfach vorkommt. Das darf entweder nicht sein oder Du musst den Vergleich entsprechend anpassen.


 Oke vielen Dank dir schon mal.
Jedoch selbst nach dem ich diese beiden Punkte berücksichtigt habe stürzt das Programm mit einem NullPointerException ab.


----------



## D1visionByZer0 (3. Nov 2018)

@mihe7 Ich habe den Fehler gefunden.
Die while waren falsch es mussten If-Anweisungen sein.
Vielen Dank für deine/eure Hilfe.


----------



## mihe7 (3. Nov 2018)

D1visionByZer0 hat gesagt.:


> Die while waren falsch es mussten If-Anweisungen sein


Es funktionieren auch while-Schleifen. 

Zeig mal Deinen Code.


----------

