#java #android #exception-handling #try-catch
#java #Android #исключение #try-catch
Вопрос:
У меня проблема с пониманием того, как try{} catch(Exception e){...}
работает!
Допустим, у меня есть следующее:
try
{
while(true)
{
coord = (Coordinate)is.readObject();//reading data from an input stream
}
}
catch(Exception e)
{
try{
is.close();
socket.close();
}
catch(Exception e1)
{
e1.printStackTrace();
}
}
Раздел 2
try
{
is.close();
db.close();
}
catch(Exception e)
{
e.printStackTrace();
}
Допустим, мой while()
цикл выдает ошибку из-за исключения is
потока.
Это выведет меня из бесконечного цикла и переведет в первый catch(){............}
блок.
Мой вопрос заключается в следующем:
После создания исключения, выхода из цикла while()
и достижения
catch(){
}
Продолжит ли моя программа его выполнение и перейдет ли к разделу 2? До тех пор, пока исключение не было перехвачено? Или все заканчивается на первом catch()
?
Комментарии:
1. Да, это перейдет ко второму разделу, как вы можете подтвердить экспериментально. Было ли что-нибудь еще?
2. Экспериментирование с этими вещами вряд ли займет минуту. Если только вы не читаете из книги и никогда не захотите опробовать их на своем компьютере.
3. Когда вы знаете, какое исключение вы пытаетесь перехватить, безопаснее не использовать все ошибки с помощью блока catch (Exception ex){}
Ответ №1:
Я думаю, вы хотите использовать finally
after your first catch [ catch (Exception e)
] для закрытия ваших потоков:
try {
// Do foo with is and db
} catch (Exception e) {
// Do bar for exception handling
} finally {
try {
is.close();
db.close();
} catch (Exception e2) {
// gah!
}
}
Ответ №2:
Пока в вашем предложении catch не генерируются исключения, ваша программа продолжит выполнение после вашего предложения catch (или finally). Если вам нужно повторно создать исключение из предложения catch, используйте throw; или создать новое исключение (например). Не используйте throw ex, так как это изменит свойство трассировки стека вашего исключения.
Ответ №3:
После перехвата исключения выполнение продолжается после блока try / catch. В данном случае это ваш раздел 2.
Неперехваченное исключение завершит поток, что может привести к завершению процесса.
Ответ №4:
Да, вы правы. Он будет перенесен в раздел 2.
Если вы хотите, чтобы ваш раздел 2 обязательно выполнялся, независимо от любого сгенерированного исключения, вы можете захотеть заключить их в блок finally.
try {
// Do foo with is and db
}
catch (Exception e) {
// Do bar for exception handling
}
// Bound to execute irrespective of exception generated or not ....
finally {
try {
is.close();
db.close();
}
catch (Exception e2) {
// Exception description ....
}
}
Комментарии:
1. Вам действительно нужно было копировать и вставлять мой ответ в качестве нового ответа?
2. @Chris : Ваш ответ правильный, но OP должен знать, что он должен использовать finally только в том случае, если этот программный код должен выполняться.. Кстати, я поддержал ваш ответ .. 1 🙂