Προς το περιεχόμενο

java-στοίβα και δημιουργία exception


_chris_

Προτεινόμενες αναρτήσεις

Δημοσ.

θέλω να βελτιώσω τον παρακάτω κώδικα δημιουργίας στοίβας .

βασικά αυτό που θέλω είναι να τροποποιήσω τις μεθόδους pop() και push()

ώστε να μου πετάει EmptyStackException() και StackOverflowException() αντίστοιχα.

Λίγο βλακεία να επιστρέφει 0.

Ό,τι και να κάνω μου πετάει errors.

μπορεί να βοηθήσει κανείς;

 

>public class ArrayStackEx{
   protected int head[];
   protected int pointer;

   public ArrayStackEx(int capacity){
       head = new int[capacity];
       pointer = -1;
   }
   public boolean isEmpty(){
       return pointer == -1;
   }
   public void push(int i){
       
       if(pointer+1 < head.length)
           head[++pointer] = i;      	
   }
   public int pop(){
  
       if(isEmpty())
           return 0;
       return head[pointer--];
   }


   public static void main(String[] args){
       ArrayStackEx s = new ArrayStackEx(10);
       int i,j;
       System.out.println("starting...");
       for(i=0;i<10;i++){
           j = (int)(Math.random() * 100);
           s.push(j);
           System.out.println("push: " + j);
       }
       while(!s.isEmpty()){
           System.out.println("pop: " + s.pop());
       }
       System.out.println("Done ;-)");
   }
}

Δημοσ.

Δεν μπορώ να καταλάβω τι κάνεις στον κώδικά σου. Κάνεις define την στοίβα μέσα στο exception??

Το exception ( implements Throwable) πρέπει να είναι εντελώς ξεχωριστό class από την στοίβα. Όταν θέλεις να κάνεις throw κάνεις throw new MyException() etc.

Δημοσ.

γεμίζω μια στοίβα με τυχαίους αριθμούς και μετά την αδειάζω κάνοντας τους ελέγχους για το αν είναι γεμάτη ή άδεια αντίστοιχα.

όπως είναι ο κώδικας είναι λίγο στημένο απλά θέλω στη θεωρητική περίπτωση που πάω να κάνω αφαίρεση στοιχείου και είναι άδεια η στοίβα να μου πετάγεται το EmptyStackException(). τώρα μου επιστρέφει 0. δε θέλω επιστροφή 0.

 

ελπίζω να έγινα κατανοητός..

δηλαδή κάτι τέτοιο που δοκίμασα στη main αλλά το θέλω στην pop()

 

>
  try {
           s.pop();
        }
        catch (EmptyStackException e) {
        }

 

τα μπέρδεψα λίγο. φαντάζομαι γίνεται αυτό που ζητάω

Δημοσ.

Δημιούργησε 2 κλάσεις, μία για κάθε exception που θες. π.χ.

>
public class EmptyStackException extends RuntimeException

 

και αντί για

>
if(isEmpty())
           return 0;

 

βάλε

 

>
   if(isEmpty())
       throw new EmptyStackException();

Δημοσ.

αυτό που έκανα στέκει; compile πάντως κάνει και δουλεύει.

 

>import java.util.EmptyStackException;
public class ArrayStackEx2 extends RuntimeException{
   protected int head[];
   protected int pointer;

   public ArrayStackEx2(int capacity){
       head = new int[capacity];
       pointer = -1;
   }
   public boolean isEmpty(){
       return pointer == -1;
   }
   public void push(int i){
       
       if(pointer+1 < head.length)
           head[++pointer] = i; 
   }
   public int pop(){
  
       if(isEmpty())
         throw new EmptyStackException();
       return head[pointer--];
   }

   public static void main(String[] args){
       ArrayStackEx2 s = new ArrayStackEx2(10);
       int i,j;
       System.out.println("starting...");
       for(i=0;i<10;i++){
           j = (int)(Math.random() * 100);
           s.push(j);
           System.out.println("push: " + j);
       }
       while(!s.isEmpty()){

           System.out.println("pop: " + s.pop());
       }
       System.out.println("Done ;-)");
   }
}

 

αν ήθελα με παρόμοιο τρόπο να κάνω και το push()?

υπάρχει: StackOverflowException();

Δημοσ.

Το ότι κάνει compile δεν λέει τίποτα για το αν είναι καλός/σωστός ο κώδικάς σου. Όπως είπαν και άλλοι πρέπει να φτιάξεις 2 δικές σου Ecxeption classes. Η στοίβα πρέπει να είναι δική της class, καμία σχέση με τα exceptions. To StackOverflow δεν έχει σχέση με αυτό που ζητάς, αναφέρεται στο stack όπου αποθηκεύονται οι διάφορες μέθοδοι που καλείς.

Γενικά ψάξε παραδείγματα με exceptions γιατι νόμίζω ότι δεν έχεις καταλάβει ακριβώς πως λειτουργούν. Επίσης το να επιστρέφεις 0 ή -1 ή null δεν είναι καθόλου κακό και χρησιμοποιείται πολύ. Πρέπει να δεις πως λειτουργεί η εντολή throws.

Διάβασμα^2

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...