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

Απορία πάνω στη Java (exceptions)


pappous_soulis

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

Δημοσ.

Λοιπόν, έχω τον εξής κώδικα.

>
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), θα ήθελα να μου υποδείξει κάποιος τον τρόπο με τον οποίο χειριζόμαστε αυτή τη περίπτωση.

 

Ευχαριστώ προκαταβολικώς. :-)

Δημοσ.

Κατι τετιο εννοω

 

 

> 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));
   }
}

 

Δημοσ.
κάνεις διαίρεση με το μηδέν ... για αυτό σου δείχνει σφάλμα στην System.out.println("Div: "+(a/b));

 

Σκοπός του thread δεν ήταν να βρεθεί γιατί πετάγεται λάθος (αυτό είναι προφανές), αλλά να ρωτήσει ο topic starter πώς χειριζόμαστε τα exceptions. :-)

Δημοσ.
Σκοπός του thread δεν ήταν να βρεθεί γιατί πετάγεται λάθος (αυτό είναι προφανές), αλλά να ρωτήσει ο topic starter πώς χειριζόμαστε τα exceptions. :-)

 

οοπ ... σαν να'χεις δίκιο teo .. πάω πάσο .. :-)

Δημοσ.

Βάζεις σε ένα 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");
   }
}

Δημοσ.

Μια γενικότερη απορία για τα exceptions.

 

Ας πούμε ότι κάνουμε μια Swing εφαρμογή. Κι έχουμε πεδίο εισαγωγής κειμένου. Ο χρήστης δε δίνει κείμενο (ενώ θα 'πρεπε). Αν δεν κάνω λάθος, το λογικό είναι να ρίξουμε exception έτσι δεν είναι;

 

Ρίχνουμε το exception. Το κάνουμε catch. Εκεί στον κώδικα του catch τί πρέπει να βάλουμε ώστε να μη τερματιστεί η εκτέλεση του προγράμματος;

 

Ακόμα πιο γενικά, τα exceptions τα χρησιμοποιούμε για κάθε λάθος που μπορεί να προκύψει στο πρόγραμμα ή τα προφανή μπορούμε να τα αποτρέψουμε μ' ένα loop ας πούμε;

Δημοσ.

Η εκτέλεση των exceptions είναι απαιτητική και θεωρείται καλό να αποφεύγονται. Όπως υποδηλώνει και το όνομά τους μπαίνουν στο παιχνίδι σε "εξαιρετικές" περιπτώσεις και όταν δεν υπάρχει άλλος τρόπος ή η υλοποίηση ελέγχου είναι πολύ "ακριβή" π.χ. network timeouts. Επίσης είναι μια δικλείδα ασφαλείας για περιπτώσεις λαθών που ενδεχομένως έχεις ξεχάσει να χειριστείς ή κρυφών σφαλμάτων (bugs) και βάζοντας ένα try/catch να γλυτώσεις να σου "κρεμάσει" ή να κλείσει ξαφνικά το πρόγραμμα.

 

Στην περίπτωση του παραδείγματός σου, γίνεται αυτό που λες, αλλά πόσο exceptional είναι το να βάλει ένας χρήστης λάθος input; Καμιά φορά και η ίδια η γλώσσα σε οδηγεί: Για την μετατροπή ενός String σε int, στη Java υπάρχει η parseInt(). Αν η μετατροπή αποτύχει τότε παίρνεις NumberFormatException. Μπορεί η λογική της υλοποίησης για τον έλεγχο πριν τη μετατροπή να είναι απλή αλλά γιατί να το κάνεις αυτό κάθε φορά; Έτσι με αυτοπεποίθηση προχωράς και το στέλνεις κατ' ευθείαν για μετατροπή και αν πάει κάτι στραβά σκάει. Το να ελέγξεις όμως αν το String είναι κενό δεν κοστίζει, έτσι πριν επιχειρήσεις την μετατροπή κάνεις τον έλεγχο για κενό.

 

Μια άλλη χρήση των exception είναι και για τον 'καταμερισμό ευθυνών". Σε ένα μέρος του κώδικά σου που θες να έχει performance δεν κάνεις έλεγχο για λάθος input και θεωρείς ότι όλα πάνε καλά. Αν όμως κάτι σκάσει κάνεις άμεσα throw Exception (και όχι απλά return) ώστε να επιστρέψεις το..."μπαλάκι" του λάθους στην πηγή του προβλήματος.

 

Στην τελική είναι και θέμα "στυλ" προγραμματισμού. Βρίσκεις που σε βοηθάει και το ακολουθείς

αρκεί να μην αλλάζεις γνώμη συχνά γιατί στο τέλος θα βρίζεις τον εαυτό σου

.

 

Άλλες ιδέες;

 

HTH

:-)

Δημοσ.

Μάλιστα. Άλλωστε, αν δεν κάνω λάθος, τα exceptions χρησιμοποιούνται στις μεθόδους κι όχι σε απλούς ελέγχους. Δηλαδή καλύτερα να έχω ένα loop που θα εμφανίσει ένα μήνυμα όταν μια μεταβλητή θα πάρει συγκεκριμένη τιμή, παρά να ρίξω ένα exception τότε και να εμφανίσω το μήνυμα.

 

Ωραία, νομίζω πως κατάλαβα. Θα το εμπεδώσω ακόμα καλύτερα όταν πιαστώ με κάτι προγράμματα που θέλω να κάνω.

 

Μια τελευταία ερώτηση-παράδειγμα. Φτιάχνεις stream που θα διαβάσει από αρχείο. Καλύτερα να κάνεις exception αν πας να διαβάσεις και δε βρεθεί το αρχείο, ή να κάνεις τυπικό έλεγχο για την ύπαρξή του;

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

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

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