Exceptions bei push/pop in Stack

sh33p

Bekanntes Mitglied
Ich bin echt schon am Verzweifeln was diese Klasse angeht.
Die Klasse simuliert einen Stack mit typischen Operationen wie Push,Top und Pop auf Basis eines Arrays.Nur mit folgender Besonderheit: Wenn das Array a voll ist, werden die Element in ein 2. Array (temp) kopiert,das doppelt so groß ist.

Problem:

Es hagelt eine ArrayIndexOutOfbOundsException. Wenn ich eine push folge von mehr als 10 mache und dann mit top lesen möchte,hagelt es diese Exception.
Wenn ich sie in der TestKlasse abfange, funktioniert es auch nicht.
Wo steckt bitte der Fehler? :bahnhof:



Java:
public final class StackDYN {


 private int count; // aktuelle Zahl der Elemente -1

 private int[] a = new int[10]; // Ablageplatz fuer die Elemente
 int[] temp = new int[a.length * 2];

 // Invariante: -1 <= count <= 9
  public StackDYN() { // Konstruktor, erzeugt den leeren Stapel
  
  count = -1;
 }



 public void push(final int x) throws Exception  {   //Oberste Element drauflegen

    if(count >= a.length){

     // inhalt von a nach temp kopieren
     
     for(int i = 0; i < a.length;i++){
       temp[i] = a[i];
     }
        }
         if (count < a.length) {
         count++;
         a[count] = x;
        }
         if(count < -1)
         throw new Exception();
}


 public int top(){
    try{


   if(count >= a.length)
   return temp[count];

   }catch(ArrayIndexOutofBoundsException e){

   }return a[count];
 }





  public void pop() throws Exception{ // Oberste Element entfern

    if (count >= 0)
    count--;
    
   if(count <-1)
   throw new Exception();




 }
 }
 
Zuletzt bearbeitet von einem Moderator:
Wo steckt bitte der Fehler?
dort wo die Exception geworfen wurde.
Diese tritt auf wenn du auf einen index zugreifts der ausserhalb des arrays liegt.

Schau wo der Fehler geworfen wird. Wie groß genau dein array an der stelle ist und mit welchem index zu zugreifst.
 
bzw mas machst du da überhaupt mit dem temp? Ist doch falsch.
Wenn dein Stack zu groß ist musst du ein neues array erstellen, umkopieren und dann dieses verwenden. das heißt aber nicht das du dann immer temp verwendest sondern zu lässt einfach dein array auf temp zeigen.

Ich würd das alles auch noch ein bissen einrücken und zusammenräumen, dann wirds klarer...
 
ich möchte ja eben nicht über das array hinüber zugreifen,sondern,wenn es voll ist,alles in ein neues kopieren..in diesem dürfte ja keine exception auftreten,da es doppel so lang ist...

Java:
public void push(final int x) throws Exception  {   //Oberste Element drauflegen

    if(count > a.length){

     // inhalt von a nach temp kopieren
     
     for(int i = 0; i < a.length;i++){
       temp[i] = a[i];
     }
     }
         if (count < a.length) {
         count++;
         a[count] = x;
        }
         if(count < -1)
         throw new Exception();
}
 
diesem dürfte ja keine exception auftreten
ok wenn es das aber trotzdem tut hast du einen fehler gemacht.
Also in der zeile wo der fehler fliegt vorher die länge das array und count ausgeben. Dann siehst du warum.


und einrücken!....
ach scheiß drauf, ich erbarme mich... moment....
 
das kompilier ja nicht mal.... ich würd eine IDE verwenden...


ok...

Java:
if (count < a.length) {
         count++;
         a[count] = x;
}

count = 9 und length = 10 (dh 0 bis 9)
ins if... count++ somit ist count 10, und du greifst mit a[10] zu was natürlich fliegt... weil dein feld nur von 0 bis 9 geht...
da ist dein fehler... ich reparier dir das aber nicht
 
Du erstellst das größere Array erst wenn du es brauchst.

Java:
if(count > a.length)
{
       
   int[] temp = new int[a.length() * 2];
     
   for(int i = 0; i < a.length; i++)
   {
       temp[i] = a[i];
   }

   a = temp;
}
 

Zurück
Oben