2013-03-09 3 views
5

sono un java newbie. ho una domanda su come organizzare il codice java quando si usa try catch finally blocks. supponiamo di dover leggere alcuni file di testo e fare alcuni calcoli sul contenuto del file memorizzato. come dovrebbe essere il mio codice?l'organizzazione del codice java quando si usa try catch finally blocks

Per esempio

codice 1 si presenta come:

public static void main(String[] args){ 

try{ 

//open files using BufferedReader, read and store the file contents. 

}catch(IOException e){ 

e.printStackTrace(); 

} 
finally{ 

//close the files 

} 
// do computations on the data 
} 

codice 2 appare come segue:

public static void main(String[] args){ 

try{ 

//open files using BufferedReader, read and store the file contents. 

// do computations on the data 

}catch(IOException e){ 

e.printStackTrace(); 

} 
finally{ 

//close the files 

} 
} 

quale dei due è una pratica migliore di codifica? Inoltre, il blocco dovrebbe essere posizionato subito dopo lo try catch o può essere posizionato verso la fine.

+0

metodo 2 perché probabilmente hai bisogno dei dati se vuoi fare calcoli su di esso. – Breavyn

+7

Chiamare 'e.printStackTrace()' in un blocco 'catch' non * gestisce * l'eccezione. Questo è il classico [try/catch/ignore anti-pattern] (http://c2.com/cgi/wiki?EmptyCatchClause). – Asaph

+0

Vorrei solo inserire quello che deve essere nel tentativo di catturare all'interno del try catch. Leggendo il file si genera un'eccezione, quindi Id lo ha inserito nel try catch. Se i tuoi calcoli lo fanno, allora mettili in una prova separata, altrimenti, spostali all'esterno. Quindi, tipo di raccomandare il codice 1 – user489041

risposta

2

Utilizzare Java 7 e provare con risorse.

try(Connection = pool.getConnection()) { // or any resource you open, like files 
// ... 

} // auto closes 

Questa funzione si avvicina a deprecando finally - non ho personalmente trovato un caso d'uso per finally una volta questa funzione è stata aggiunta e suggerisco di evitare di esso. È come goto o probabilmente continue, o anche i cicli for per quanto riguarda la programmazione funzionale - le nuove funzionalità hanno reso l'uso non necessario.

+0

Grazie per questo consiglio. Lo proverò. – scv

1

Infine il blocco deve essere posizionato subito dopo il try-catch. Dove vuoi fare i calcoli sui tuoi dati dipende da te ... ma se lo metti dopo il blocco try-catch, tenterà i calcoli anche se viene lanciata un'eccezione, a meno che tu non usi una condizione.

0

Il secondo metodo deve essere utilizzato perché sarà più semplice eseguire calcoli sui dati senza incorrere in problemi di ambito variabile. Tuttavia, entrambi i modi possono funzionare a seconda dei calcoli che devono essere eseguiti.

0

Il secondo.

L'idea con eccezioni è che li si lancia nel punto in cui viene rilevato un problema e vengono catturati non prima del primo punto in cui il problema precedente non influisce più sull'esecuzione del codice. Forse facendo un po 'di manovra nel blocco catch e qualche cleanup usando un blocco finally.

Nel primo codice di esempio il codice che segue il problema è ancora interessato dall'errore che ha causato l'eccezione. Quindi l'hai preso presto. Ciò significa che potrebbe essere necessario aggiungere una dichiarazione if attorno ad essa che solleva inutilmente la complessità della funzione.

0

questo dipende dalla vostra specifiche di sistema, vedo due casi possibili:

1) file è grande. Quindi non puoi caricarlo nella memmory. E dovresti leggere i file del file uno per uno e fare la tua logica su ogni pice. Questo ti impedirà di rimanere senza memmory.

2) Il file è piccolo. Quindi hai una scelta, che può seguire il primo caso o leggere il file in memmory, chiuderlo e quindi elaborarlo.

C'è un'altra considerazione: mentre il file non è chiuso, altri processi non possono accedervi. Questo potrebbe essere un problema se la tua logica è molto lunga, in tal caso leggere e chiudere un file prima è meglio.

Problemi correlati