2013-03-09 2 views
5

Я новичок в java. У меня вопрос о том, как организовать Java-код при использовании блоков try catch finally. предположим, что мне нужно прочитать некоторые текстовые файлы и выполнить некоторые вычисления в содержимом сохраненного файла. как должен выглядеть мой код?организация java-кода при использовании try catch finally blocks

Например

код 1 выглядит следующим образом:

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 
} 

код 2 выглядит следующим образом:

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 

} 
} 

, который из этих двух лучше кодирования практика? Также должен быть окончательно заблокирован после того, как попытайтесь поймать или его можно поместить ближе к концу.

+0

метод 2, потому что вам, вероятно, нужны данные, если вы хотите выполнять вычисления на нем. – Breavyn

+7

Вызов 'e.printStackTrace()' в блоке 'catch' - это * не * обработка исключения. Это классический [try/catch/ignore anti-pattern] (http://c2.com/cgi/wiki?EmptyCatchClause). – Asaph

+0

Я бы поставил только то, что должно быть в попытке поймать внутри try catch. Чтение файла приведет к исключению, поэтому Id поставил это в try catch. Если ваши вычисления выполняются, то помещайте их в отдельный try catch, если нет, перемещайте их снаружи. Таким образом, я рекомендую код 1 – user489041

ответ

2

Используйте Java 7 и попробуйте с ресурсами.

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

} // auto closes 

Эта функция приближается к протестующий finally - я лично не нашел случай использования для finally раз была добавлена ​​эта функция и предлагаю вам избежать. Это как goto или, возможно, continue, или даже for петель в плане функционального программирования - новые функции сделали ненужным использование.

+0

Спасибо за этот совет. Я это попробую. – scv

1

Окончательный блок должен быть размещен сразу после попытки захвата. Там, где вы хотите делать вычисления на ваших данных, зависит от вас ... но если вы поместите его после блока try-catch, он попытается выполнить вычисления, даже если выбрано исключение, если вы не используете условие.

0

Второй метод следует использовать, потому что будет проще производить вычисления по данным без использования проблем с переменной областью. Однако оба способа могут работать в зависимости от вычислений, которые необходимо выполнить.

0

Второй.

Идея с исключениями заключается в том, что вы бросаете их в том месте, где обнаруживается проблема, и они улавливаются не ранее первой точки, где более ранняя проблема больше не влияет на выполнение кода. Возможно, выполнив некоторую обработку в блоке catch и некоторую очистку, используя блок finally.

В вашем первом примере кода код, следующий за уловкой, по-прежнему зависит от ошибки, вызвавшей исключение. Таким образом, вы поймали его на ранней стадии. Это означает, что вам может потребоваться добавить к нему утверждение if, которое излишне повышает сложность функции.

0

Это зависит от ваших особенностей системы, я вижу два возможных случая:

1) файл большой. Тогда вы не можете загрузить его в память. И вы должны читать посты файла один за другим и делать свою логику на каждой странице. Это не даст вам исчерпать память.

2) Файл маленький. Затем у вас есть выбор, чтобы следить за первым случаем или читать файл в memmory, закрыть его, а затем обработать.

Существует еще одно соображение: в то время как файл не закрыт, другие процессы не могут получить к нему доступ. Это может быть проблемой, если ваша логика очень длинная, в таком случае лучше всего читать и закрывать файл.

Смежные вопросы