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

Java:Δε μπορώ να κάνω trap μια NumberFormatException


Sadako

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

Δημοσ.

Λοιπόν..

 

Δουλέυω σε μια εργασία java, και έχω κολλήσει σε ένα σημείο (προς το παρόν τουλάχιστον, δεν ξέρω αν προκύψει και τίποτα άλλο στην πορεία). Ελπίζω να μπορέσει κάποιος να με βοηθήσει..

 

To concept είναι, ότι παίρνει input απο command line argument, και χρησιμοποιεί αυτό το argument, για ένα graphical program. Τις exceptions και το error handling γενικά πιστεύω ότι ως ένα βαθμό το έχω καταλάβει. Στη μια περίπτωση μάλιστα (αν δεν βάλεις κανένα argument) το μετατρέπει κανονικά σε μήνυμα.

Όταν όμως πάω να κάνω trap το λάθος να βάλω string αντί για αριθμό, ενώ μου βγάζει NumberFormatException, πάω να την κάνω trap με τον τρόπο που ξέρω (δηλαδή: catch (NumberFormatException ex) ), και ενώ κάνει compile κανονικά, όταν πάω να το δοκιμάσω με ένα string argument, μετά την εκτέλεση μου πετάει το εξής κατεβατό, και το frame κενό:

 

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "fg"

at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)

at java.lang.Float.valueOf(Unknown Source)

at Therm_Window.paint(thermometer.java:36)

at sun.awt.RepaintArea.paintComponent(Unknown Source)

at sun.awt.RepaintArea.paint(Unknown Source)

at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.run(Unknown Source)

 

 

Μπορεί κανείς να με βοηθήσει στο να ερμηνεύσω το μήνυμα και να κάνω αυτό που θέλω??

 

Ελπίζω να εξήγησα καλά το τι χρειάζομαι.

Δεν ξέρω αν χρειάζεται στην επίλυση της απορίας μου, αλλά η main μου έχει κανονικά τη μορφή:

public static void main (String[] args)

***** Δοκίμασα αντί για String να βάλω στη main float, γιατί ίσως έκανε τη ζωή μου πιο εύκολη, αλλά ενώ κάνει compile κανονικά, όταν πάω να το τρέξω, ανεξάρτητα αν βάλω δεδομένα ή όχι, μου πετάει NoSuchMethodError: main *******

 

, ενώ ότι στο πρόγραμμα μου, αυτό το command line argument το παίρνω και το μετατρέπω σε αριθμό (σε float συγκεκριμένα).

 

Α, και κάτι άλλο σχετικό, για να μην ανοίξω καινούργιο topic. Υπάρχει τρόπος να δηλώσω το μέγεθος του array of strings της main? Θέλω δηλαδή αν δίνω πάνω απο ένα command line arguments να με οδηγεί σε ArrayIndexOutOfBoundsException, που την κάνω trap μια χαρά..

 

Ευχαριστώ

Δημοσ.

Δεν μπορώ να καταλάβω απόλυτα ποιο μπορεί να είναι το λάθος.Μπορείς να ανεβάσεις τον κώδικα που γράφεις και σου βγάζει το λάθος; Να σου πω, έχεις ελέγξει αν στη μέθοδο που θέλεις να υπάρχει η εξαίρεση έχεις τοποθετήσει τον κώδικα throws NumberFormatException;

 

π.χ. public void errorMethod() throws NumberFormatException {

 

try {

protash1;

protash2;

.

.

.

protashv; }

 

catch (NumberFormatException ex) {

protash1;

protash2;

.

.

.

protashv; }

 

}

 

Η μέθοδος main συντάσεται έτσι όπως την έχεις γράψει αρχικά. Καλύτερα να μην την πειράζεις :-D :-D :mrgreen:

Δημοσ.

Το να βάλω αυτούσιο ολόκληρο τον κώδικα μου το θεωρώ σαν τελευταία-τελευταία λύση, γιατί δε θέλω απλά να μου πει κάποιος τι πρέπει να γράψω αντ'αυτού, αλλά να καταλάβω γιατί ΔΕΝ δουλεύει αυτό που έκανα, ούτως ώστε να το ξέρω για άλλες περιπτώσεις..

Ξέρω ξέρω, είμαι απο τους ανώμαλους που δεν θέλουν μόνο να πάρουν καλό βαθμό, αλλά να μάθουν και κάτι :D

 

Αν κατάλαβα καλά τι εννοείς, μπορεί να μην προβλέπεται απο τη μέθοδο να χειρίζεται τέτοιου είδους exceptions??

 

H μέθοδο που χρησιμοποιώ για να μετατρέψω το string σε float είναι η:

float a = Float.valueOf(t).floatValue();

όπου t είναι το input απο το command line argument..

Δημοσ.

Έχεις δίκιο, καλύτερα να μάθεις κάτι παρά να το πάρεις έτοιμο και να μην ξέρεις τι σου γίνεται αργότερα.Απλά θεώρησα ότι δεν θα υπήρχε πρόβλημα.

 

Λοιπόν σχετικά με την throws:

Μια φράση throws καθορίζει τις εξαιρέσεις που μπορεί να προκαλέσει μία μέθοδος. Αυτή τη φράση την γράφεις μετά τη λίστα με τις παραμέτρους της μεθόδου και πριν από το σώμα της μεθόδου. Μπορεί να περιέχει πολλές διαφορετικές εξαιρέσεις διαχωρισμένες με κόμματα που θα προκαλεί (throws) η μέθοδος αν συμβεί ένα πρόβλημα. Αυτές οι εξαιρέσεις μπορούν να προκληθούν από προτάσεις στο σώμα της μεθόδου ή από μεθόδους που καλούνται στο σώμα. Μία μέθοδος λοιπόν, μπορεί να προκαλέσει εξαιρέσεις των κλάσεων που παρατίθενται στην φράση της throws ή εκείνη των υποκλάσεών της.

 

Οπότε όπως είπες και εσύ δεν προβλέπεται από μία μέθοδο μόνη της να μπορεί να χειριστεί μία εξαίρεση χωρίς να της δηλώσεις εσύ ότι μπορεί να προκύψει μία. Μπορείς να μην δηλώσεις κάποια συγκεκριμένη εξαίρεση αλλά απλά να γράψεις π.χ. public void errorMethod() throws Exception για να χειριστείς γενικότερες εξαιρέσεις σύμφωνα με τα κριτήριά σου.

 

Μπορείς επίσης να προκαλέσεις μόνος σου μία εξαίρεση ακριβώς την στιγμή που τη χρειάζεσαι σε μία συγκεκριμένη πρόταση του κώδικά σου με την φράση

throw new Exception(); μέσα σε ένα μπλοκ try.

 

Αυτά προς το παρόν. Ελπίζω να μην σε μπέρδεψα γιατί στη διδασκαλία δεν είμαι και επίκουρος :-D

 

Αν ωστόσο υπάρχουν απορίες, εδώ είμαστε. Δοκίμασε να κάνεις και αυτό που σου είπα στον κώδικά σου μήπως και λυθεί το πρόβλημα. Αν όχι...κάτι θα σκεφτούμε ανάλογα με τι φταίει.

Δημοσ.

Απο το μηνυμα που σου βγαζει συμπεραινω οτι το NumberFormatException ενω "πετιεται" οταν δινεις ενα string το οποιο εχει και γραμματα μεσα (πχ fg) δεν το πιανεις.

Δεν ειναι απαραιτητο παντως η μεθοδος να λεει throws ταδε exception για να το πιασεις με try - catch.

Δυστυχως ισως πρεπει να δειξεις τουλαχιστον ολο το try - catch για να βρεθει το λαθος

Δοκιμασε επισης τη μεθοδο Float.parseFloat(String s) που σου γυρναει κατευθειαν float (primitive) και οχι Float (object), οποτε δεν χρειαζεσαι και το floatValue()

 

Δεν ξερω αν μπορεις να περιορισεις το String[] args στη main αλλα μπορεις να βρεις το μεγεθος του args και με ενα if να κανεις οτι θελεις αν ξεπερναει ενα συγκεκριμενο μεγεθος. Πρεπει ντε και καλα να πεταξει exception?

Δημοσ.

Λοιπόν..

 

Άφησα για λίγο την εργασία μου στη java, και έπιασα τη δεύτερη εργασία που είναι πάνω σε Unix (κι αυτή για παράδοση στην Παρασκευή), γι'αυτό και δεν απάντησα..

 

Το να παραθέσω ολόκληρη την try catch δε νομίζω να έχει και μεγάλη σημασία, επειδή λογικά το όλο μπέρδεμα γίνεται σε αυτή τη γραμμή που έδωσα που μετατρέπω το string σε αριθμό, γιατί απο κει και πέρα, απλά παίρνω αυτό τον αριθμό, και τον χρησιμοποιώ σε ένα σχετικά απλό (για κάποιον με εμπειρία σε java) γραφικό πρόγραμμα, δηλαδή το χρησιμοποιώ σαν παράμετρο (μέσα και απο κάποιες στρογγυλοποιήσεις) σε κάποιες fillRect και drawString. Δηλαδή δεν έχει καμιά άλλη περίεργη εφαρμογή/μετατροπή στην οποία να δικαιολογείται να κολλάει..

 

Όσον αφορά το δεύτερο, απο την εκφώνηση της άσκησης, καταλαβαίνω ότι θέλει με indexoutofboundException, γιατί λέει: if there is no command line argument, or if there is more than one, then a sensible error message should be displayed. Δηλαδή τα έχει μαζί.

Τον δεύτερο τρόπο, με το args.length τον γνωρίζω, το έκανα έτσι, σε συνδιασμό με μια απλή if statement, απλά σκέφτηκα μήπως υπάρχει πιο καλός τρόπος να το κάνω..

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

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

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