Questa è una domanda specifica qui, ma mi interessa la "best practice" generale per situazioni simili in quanto sono nuovo di Java.
Supponiamo di avere un codice Java che deve aprire un file (vedi sotto per il codice). Per prima cosa ho una funzione che controlla la presenza dei file. Se il file esiste, chiamiamo funzioni per aprirlo ed elaborarlo. Altrimenti restituiamo un messaggio all'utente che dichiara che il file non è stato trovato.
Ora nelle funzioni che aprono il file, dobbiamo ancora avere un'istruzione try / catch per la possibile IOException perché è un'eccezione controllata. La funzione openSpecifiedFile deve restituire un FileInputStream. Il fatto che il nostro file sia stato dimostrato di esistere diversi millisecondi fa non è sufficiente per garantire che l'istruzione catch non venga mai eseguita (anche se è improbabile) quindi preferirei non restituire null qui.
C'è una via per restituire un oggetto predefinito, o semplicemente evitare l'istruzione di ritorno nulla tutti insieme e uscire dal programma con qualche tipo di eccezione di runtime? L'unico modo in cui le cose potrebbero andare male qui è che se qualcosa di molto brutto fosse successo, mi sento ...
Suppongo che la domanda generale sia "Quando si eseguono i controlli per assicurarsi che non si verifichino determinate eccezioni controllate, qual è un buon modo per gestire i blocchi try / catch necessari?"
public static void main(String[] args) {
String filename = args[0];
if (specifiedFileExists(filename)) {
FileInputStream specifiedFile = openSpecifiedFile(filename);
processFile(specifiedFile);
} else
System.out.println("The specified file does not exist");
}
private static boolean specifiedFileExists(String filename) {
File currentFile = new File(filename);
return currentFile.exists();
}
private static FileInputStream openSpecifiedFile(String filename) {
try {
return new FileInputStream(filename);
} catch (IOException e) {}
return null;
}
private static void processFile(FileInputStream currentFile) {
ByteBuffer filledBuffer = fillBufferFromFile(currentFile);
String messageFromFile = processBufferToString(filledBuffer);
System.out.println(messageFromFile);
}
private static ByteBuffer fillBufferFromFile(FileInputStream currentFile) {
try {
FileChannel currentChannel = currentFile.getChannel();
ByteBuffer textBuffer = ByteBuffer.allocate(1024);
currentChannel.read(textBuffer);
textBuffer.flip();
return textBuffer;
} catch (IOException e) {}
return ByteBuffer.allocate(0);
}
private static String processBufferToString(ByteBuffer filledBuffer) {
StringBuilder characterBuilderFromFile = new StringBuilder();
while (filledBuffer.hasRemaining())
characterBuilderFromFile.append((char) filledBuffer.get());
return characterBuilderFromFile.toString();
}