Δημοσιεύτηκε: 15 Απρ 2012, 18:51
από cyberpython
clepto έγραψε:
Μορφοποιημένος Κώδικας: Επιλογή όλων
public Tag gettags( String songs ) {
try {
File song = new File( songs);
AudioFile file;
file = AudioFileIO.read(song);
Tag tags = file.getTag();
AudioHeader = file.getAudioHeader();
return tags;
} catch (CannotReadException ex) {
Logger.getLogger(Tags.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Tags.class.getName()).log(Level.SEVERE, null, ex);
} catch (TagException ex) {
Logger.getLogger(Tags.class.getName()).log(Level.SEVERE, null, ex);
} catch (ReadOnlyFileException ex) {
Logger.getLogger(Tags.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvalidAudioFrameException ex) {
Logger.getLogger(Tags.class.getName()).log(Level.SEVERE, null, ex);
}
return tags;
}


όπως βλέπετε έχω δύο return tags;
αν σχολιάσω το δεύτερο θα μου πει ότι δεν υπάρχει return statement, αν σχολιάσω το πρώτο θα μου πει ότι δεν υπάρχει η μεταβλητή tags

γιατί μέσα στην try δεν πιάνει το return;


Η εντολή return μέσα στο try block θα εκτελεστεί μόνο αν δε συμβεί σφάλμα που πετάει exception στις προηγούμενες εντολές του try bock. Αν συμβεί τέτοιο σφάλμα, τότε ο έλεγχος μεταφέρεται στο αντίστοιχο catch block και εκτελείται ο κώδικας εκεί. Τέλος, Η εκτέλεση συνεχίζεται στην αμέσως επόμενη εντολή εκτός του try .. catch. Το πρόβλημά σου είναι οτι η αμέσως επόμενη εντολή εκτός του try .. catch είναι η
Κώδικας: Επιλογή όλων
return tags;
η οποία δε γνωρίζει τίποτα για τη μεταβλητή tags, αφού είναι δηλωμένη σε πιο εσωτερικό block από την εντολή (η μεταβλητή tags "υπάρχει" μόνο εντός του try block και μόνο για τις εντολές μετά τη δήλωσή της - αυτό ισχύει για όλα τα blocks κώδικα π.χ. while, for, if κλπ. στη Java). Μπορείς (αν θέλεις και έχει νόημα στην εφαρμογή σου) να επιστρέφεις null σε περίπτωση σφάλματος (δηλαδή στη δεύτερη εντολή return) ή να ρίχνει η μέθοδός σου κάποιο exception που θα το χειρίζεται με τη σειρά του ο κώδικας που την καλεί.