_chris_ Δημοσ. 16 Μαΐου 2010 Δημοσ. 16 Μαΐου 2010 θέλω να βελτιώσω τον παρακάτω κώδικα δημιουργίας στοίβας . βασικά αυτό που θέλω είναι να τροποποιήσω τις μεθόδους 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 ;-)"); } }
RubiksCube Δημοσ. 16 Μαΐου 2010 Δημοσ. 16 Μαΐου 2010 Δεν μπορώ να καταλάβω τι κάνεις στον κώδικά σου. Κάνεις define την στοίβα μέσα στο exception?? Το exception ( implements Throwable) πρέπει να είναι εντελώς ξεχωριστό class από την στοίβα. Όταν θέλεις να κάνεις throw κάνεις throw new MyException() etc.
_chris_ Δημοσ. 16 Μαΐου 2010 Μέλος Δημοσ. 16 Μαΐου 2010 γεμίζω μια στοίβα με τυχαίους αριθμούς και μετά την αδειάζω κάνοντας τους ελέγχους για το αν είναι γεμάτη ή άδεια αντίστοιχα. όπως είναι ο κώδικας είναι λίγο στημένο απλά θέλω στη θεωρητική περίπτωση που πάω να κάνω αφαίρεση στοιχείου και είναι άδεια η στοίβα να μου πετάγεται το EmptyStackException(). τώρα μου επιστρέφει 0. δε θέλω επιστροφή 0. ελπίζω να έγινα κατανοητός.. δηλαδή κάτι τέτοιο που δοκίμασα στη main αλλά το θέλω στην pop() > try { s.pop(); } catch (EmptyStackException e) { } τα μπέρδεψα λίγο. φαντάζομαι γίνεται αυτό που ζητάω
Cue Δημοσ. 17 Μαΐου 2010 Δημοσ. 17 Μαΐου 2010 Δημιούργησε 2 κλάσεις, μία για κάθε exception που θες. π.χ. > public class EmptyStackException extends RuntimeException και αντί για > if(isEmpty()) return 0; βάλε > if(isEmpty()) throw new EmptyStackException();
_chris_ Δημοσ. 17 Μαΐου 2010 Μέλος Δημοσ. 17 Μαΐου 2010 αυτό που έκανα στέκει; 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();
RubiksCube Δημοσ. 17 Μαΐου 2010 Δημοσ. 17 Μαΐου 2010 Το ότι κάνει compile δεν λέει τίποτα για το αν είναι καλός/σωστός ο κώδικάς σου. Όπως είπαν και άλλοι πρέπει να φτιάξεις 2 δικές σου Ecxeption classes. Η στοίβα πρέπει να είναι δική της class, καμία σχέση με τα exceptions. To StackOverflow δεν έχει σχέση με αυτό που ζητάς, αναφέρεται στο stack όπου αποθηκεύονται οι διάφορες μέθοδοι που καλείς. Γενικά ψάξε παραδείγματα με exceptions γιατι νόμίζω ότι δεν έχεις καταλάβει ακριβώς πως λειτουργούν. Επίσης το να επιστρέφεις 0 ή -1 ή null δεν είναι καθόλου κακό και χρησιμοποιείται πολύ. Πρέπει να δεις πως λειτουργεί η εντολή throws. Διάβασμα^2
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.