pappous_soulis Δημοσ. 5 Μαΐου 2009 Δημοσ. 5 Μαΐου 2009 Λοιπόν, έχω τον εξής κώδικα. > import java.lang.ArithmeticException; public class Exception_Tester { public static void main(String args[]) { Exception_Tester et = new Exception_Tester(); int x1; int x2; x1 = 5; x2 = 0; et.printResults(x1, x2); } void printResults(int a, int throws ArithmeticException{ System.out.println("Add: "+(a+); System.out.println("Sub: "+(a-); System.out.println("Mul: "+(a*); System.out.println("Div: "+(a/b)); } } Όταν τρέχω το πρόγραμμα, μου πετάει μήνυμα σφάλματος και με παραπέμπει στην εντολή System.out.println("Div: "+(a/b)); Επειδή είμαι αρχάριος, και δεν έχω μάθει πως χειριζόμαστε τα exceptions με αυτό το τρόπο (throws), θα ήθελα να μου υποδείξει κάποιος τον τρόπο με τον οποίο χειριζόμαστε αυτή τη περίπτωση. Ευχαριστώ προκαταβολικώς.
ippo00 Δημοσ. 5 Μαΐου 2009 Δημοσ. 5 Μαΐου 2009 Όταν το κάνεις throw θα πρέπει απλά να το κάνεις handle αλλού
pappous_soulis Δημοσ. 5 Μαΐου 2009 Μέλος Δημοσ. 5 Μαΐου 2009 try catch Μπλοκ Η άσκηση ζητάει να γίνει με throw.
Evgenios1 Δημοσ. 5 Μαΐου 2009 Δημοσ. 5 Μαΐου 2009 Κατι τετιο εννοω > public class Main { public static void main(String args[]) { Main et = new Main(); int x1; int x2; x1 = 5; x2 = 0; try{ et.printResults(x1, x2); } catch(Exception e) { System.out.println(e.getMessage()); } } void printResults(int a, int throws ArithmeticException{ System.out.println("Add: "+(a+); System.out.println("Sub: "+(a-); System.out.println("Mul: "+(a*); System.out.println("Div: "+(a/b)); } }
pappous_soulis Δημοσ. 5 Μαΐου 2009 Μέλος Δημοσ. 5 Μαΐου 2009 Σ'ευχαριστώ Ευγένιε, πιστεύω το κατάλαβα.
earthworm Δημοσ. 5 Μαΐου 2009 Δημοσ. 5 Μαΐου 2009 κάνεις διαίρεση με το μηδέν ... για αυτό σου δείχνει σφάλμα στην System.out.println("Div: "+(a/b));
teo64x Δημοσ. 6 Μαΐου 2009 Δημοσ. 6 Μαΐου 2009 κάνεις διαίρεση με το μηδέν ... για αυτό σου δείχνει σφάλμα στην System.out.println("Div: "+(a/b)); Σκοπός του thread δεν ήταν να βρεθεί γιατί πετάγεται λάθος (αυτό είναι προφανές), αλλά να ρωτήσει ο topic starter πώς χειριζόμαστε τα exceptions.
earthworm Δημοσ. 6 Μαΐου 2009 Δημοσ. 6 Μαΐου 2009 Σκοπός του thread δεν ήταν να βρεθεί γιατί πετάγεται λάθος (αυτό είναι προφανές), αλλά να ρωτήσει ο topic starter πώς χειριζόμαστε τα exceptions. οοπ ... σαν να'χεις δίκιο teo .. πάω πάσο ..
elis88 Δημοσ. 7 Μαΐου 2009 Δημοσ. 7 Μαΐου 2009 Βάζεις σε ένα block try τον κώδικα που θελεις να διαφυλάξεις. και αμέσως μετα το κάνεις catch ώστε σε περιπτώση που χτυπήσει αυτό το exception να κάνει κάποια ενεργεια που θες εσυ. π.χ > void printResults(int a, int throws ArithmeticException { try { System.out.println("Add: "+(a+); System.out.println("Sub: "+(a-); System.out.println("Mul: "+(a*); System.out.println("Div: "+(a/b)); } catch(ArithmeticException e) { //periptosi pou xtipisei to exception System.out.println("error"); } }
Wise_One Δημοσ. 14 Μαΐου 2009 Δημοσ. 14 Μαΐου 2009 Μια γενικότερη απορία για τα exceptions. Ας πούμε ότι κάνουμε μια Swing εφαρμογή. Κι έχουμε πεδίο εισαγωγής κειμένου. Ο χρήστης δε δίνει κείμενο (ενώ θα 'πρεπε). Αν δεν κάνω λάθος, το λογικό είναι να ρίξουμε exception έτσι δεν είναι; Ρίχνουμε το exception. Το κάνουμε catch. Εκεί στον κώδικα του catch τί πρέπει να βάλουμε ώστε να μη τερματιστεί η εκτέλεση του προγράμματος; Ακόμα πιο γενικά, τα exceptions τα χρησιμοποιούμε για κάθε λάθος που μπορεί να προκύψει στο πρόγραμμα ή τα προφανή μπορούμε να τα αποτρέψουμε μ' ένα loop ας πούμε;
vag_pRiMi Δημοσ. 14 Μαΐου 2009 Δημοσ. 14 Μαΐου 2009 Η εκτέλεση των exceptions είναι απαιτητική και θεωρείται καλό να αποφεύγονται. Όπως υποδηλώνει και το όνομά τους μπαίνουν στο παιχνίδι σε "εξαιρετικές" περιπτώσεις και όταν δεν υπάρχει άλλος τρόπος ή η υλοποίηση ελέγχου είναι πολύ "ακριβή" π.χ. network timeouts. Επίσης είναι μια δικλείδα ασφαλείας για περιπτώσεις λαθών που ενδεχομένως έχεις ξεχάσει να χειριστείς ή κρυφών σφαλμάτων (bugs) και βάζοντας ένα try/catch να γλυτώσεις να σου "κρεμάσει" ή να κλείσει ξαφνικά το πρόγραμμα. Στην περίπτωση του παραδείγματός σου, γίνεται αυτό που λες, αλλά πόσο exceptional είναι το να βάλει ένας χρήστης λάθος input; Καμιά φορά και η ίδια η γλώσσα σε οδηγεί: Για την μετατροπή ενός String σε int, στη Java υπάρχει η parseInt(). Αν η μετατροπή αποτύχει τότε παίρνεις NumberFormatException. Μπορεί η λογική της υλοποίησης για τον έλεγχο πριν τη μετατροπή να είναι απλή αλλά γιατί να το κάνεις αυτό κάθε φορά; Έτσι με αυτοπεποίθηση προχωράς και το στέλνεις κατ' ευθείαν για μετατροπή και αν πάει κάτι στραβά σκάει. Το να ελέγξεις όμως αν το String είναι κενό δεν κοστίζει, έτσι πριν επιχειρήσεις την μετατροπή κάνεις τον έλεγχο για κενό. Μια άλλη χρήση των exception είναι και για τον 'καταμερισμό ευθυνών". Σε ένα μέρος του κώδικά σου που θες να έχει performance δεν κάνεις έλεγχο για λάθος input και θεωρείς ότι όλα πάνε καλά. Αν όμως κάτι σκάσει κάνεις άμεσα throw Exception (και όχι απλά return) ώστε να επιστρέψεις το..."μπαλάκι" του λάθους στην πηγή του προβλήματος. Στην τελική είναι και θέμα "στυλ" προγραμματισμού. Βρίσκεις που σε βοηθάει και το ακολουθείς αρκεί να μην αλλάζεις γνώμη συχνά γιατί στο τέλος θα βρίζεις τον εαυτό σου . Άλλες ιδέες; HTH
Wise_One Δημοσ. 14 Μαΐου 2009 Δημοσ. 14 Μαΐου 2009 Μάλιστα. Άλλωστε, αν δεν κάνω λάθος, τα exceptions χρησιμοποιούνται στις μεθόδους κι όχι σε απλούς ελέγχους. Δηλαδή καλύτερα να έχω ένα loop που θα εμφανίσει ένα μήνυμα όταν μια μεταβλητή θα πάρει συγκεκριμένη τιμή, παρά να ρίξω ένα exception τότε και να εμφανίσω το μήνυμα. Ωραία, νομίζω πως κατάλαβα. Θα το εμπεδώσω ακόμα καλύτερα όταν πιαστώ με κάτι προγράμματα που θέλω να κάνω. Μια τελευταία ερώτηση-παράδειγμα. Φτιάχνεις stream που θα διαβάσει από αρχείο. Καλύτερα να κάνεις exception αν πας να διαβάσεις και δε βρεθεί το αρχείο, ή να κάνεις τυπικό έλεγχο για την ύπαρξή του;
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.