вопрос о try-catch

#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 🙂