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

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


pappous_soulis

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

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

 

Άλλο ένα πολύ καλό παράδειγμα για το πώς σε καθοδηγεί η γλώσσα:

Ας υποθέσουμε ότι δεν θέλαμε να κάνουμε υλοποίηση με try/catch. Για να υλοποιήσουμε τους ελέγχους, θα είχαμε:

>
public class Examples {
public static void main(String[] args) {
	java.io.File aFile = new java.io.File("D:\\mywork\\input");
	if (aFile.exists() && !aFile.isDirectory()) {
		java.io.FileInputStream fis = new java.io.FileInputStream(aFile);
	}
	else if (!aFile.exists()) {
		System.err.println("File not found");
	}
	else if (aFile.isDirectory()) {
		System.err.println("File is a directory. Cannot read anything from a directory");
	}
	else {
		System.err.println("Unknown file error");
	}
}
}

 

Στους constructors του FileInputStream βλέπουμε ότι:

Throws:

FileNotFoundException - if the file does not exist, is a directory rather than a regular file, or for some other reason cannot be opened for reading.

Άρα ο ίδιος ο compiler της Java μας υποχρεώνει να χρησιμοποιήσουμε exceptions. Ο παραπάνω κώδικας διορθώνεται ως εξής:

>
[b]try {
[/b]	java.io.FileInputStream fis = new java.io.FileInputStream(aFile);
[b]}
catch (FileNotFoundException e) {[/b]
// TODO Auto-generated catch block
System.err.println("Error reading file");
e.printStackTrace();
[b]}[/b]

 

Τελικά, αφού πρέπει να χρησιμοποιήσουμε exceptions, μπορούμε να πετάξουμε και τα δικά μας if/else. Έτσι όμως η πληροφορία λάθους που είναι διαθέσιμη για feedback προς το χρήστη, θα είναι περιορισμένη. Εδώ όμως, μπορούμε να τα έχουμε όλα έτσι:

>
public class Examples {
public static void main(String[] args) {
	java.io.File aFile = new java.io.File("D:\\mywork\\input");
	try {
		java.io.FileInputStream fis = new java.io.FileInputStream(aFile);
	}
	catch (FileNotFoundException e) {
		// TODO Auto-generated catch block
		System.err.println("Error reading file");
		if (aFile.exists() && !aFile.isDirectory()) {
			/* You should never see this as under these conditions the file should be read */
		}
		else if (!aFile.exists()) {
			System.err.println("File not found");
		}
		else if (aFile.isDirectory()) {
			System.err.println("File is a directory. Cannot read anything from a directory");
		}
		else {
			System.err.println("Unknown file error");
		}
			
		e.printStackTrace();
	}
}
}

 

Αν δεν ήταν δουλειά της main να χειριστεί το exception (ήταν πχ του GUI) αλλά μόνο να διαβάσει το αρχείο, τότε τα πράγματα θα ήταν πολύ πιο απλά:

>
public static void main(String[] args) [b]throws java.io.FileNotFoundException[/b] {
java.io.File aFile = new java.io.File("D:\\mywork\\input");
java.io.FileInputStream fis = new java.io.FileInputStream(aFile);
}

...και οι έλεγχοι (if/else) και το feedback (messages/dialog popups) θα βρισκόταν στο class του GUI.

 

:-)

Δημοσ.

Κατατοπιστικότατος. Φίλε πολύ καλή εξήγηση. Το API ανα χείρας (ανα tab καλύτερα) και βλέπουμε σε κάθε περίπτωση. Φοβερός. Κρατάω το post για reference. Να 'σαι καλά :)

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

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

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