как избежать завершения программы при возникновении исключения в java

#java #android

#java #Android

Вопрос:

Я создаю приложение для поиска BPM в Android. На основе ввода файла генерируется исключение с нулевым указателем и исключение ввода-вывода. При возникновении исключения программа завершается, даже если я окружаю код блоком try / catch. Мое требование заключается в том, чтобы программа не завершалась, а переходила к другим частям.

Мой код:

 try {
    mp3file.seekMP3Frame();
    sourcefile = new File("/sdcard/a.mp3");
    mp3file = new MP3File(sourcefile);
    AbstractID3v2 tag = mp3file.getID3v2Tag();
    text=tag.getFrame("TBPM").toString();       
} 
catch (NullPointerException e) {
    System.out.println("null pointer exception");
}
catch (IOException e1) {
    System.out.println("IO exception");
}
........  // other coding 
  

Комментарии:

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

2. Вы уверены в получении исключения только из этих двух? добавьте еще 1 блок catch для общего исключения

3. NullPointerException обычно s вызываются логическими ошибками, а не непредсказуемыми условиями. Возможно, вы захотите проверить, что их вызывает, и исправить это, а не перехватывать.

4. Подозрительно. Вы видите строки печати? Возможно, у вас возникает другая ошибка? Вы можете попытаться перехватить Throwable (родительский интерфейс как исключения, так и ошибки) и посмотреть, попадете ли вы в этот блок…

Ответ №1:

  • Если ошибка возникает между блоком try — catch :

Здесь вы перехватываете только 2 исключения (исключение NullPointerException и исключение IOException). Любое другое исключение во время выполнения между блоками try — catch все еще может привести к сбою вашей программы. поймайте java.lang.Throwable для обеспечения того, чтобы все исключения были перехвачены.

  • Если ошибка не возникает между блоком try — catch :

Найдите в stacktrace строку в вашем классе, где возникает ошибка, и реализуйте там «правильную» обработку ошибок.

Если ваше приложение выходит из строя, вы всегда будете видеть stacktrace в logcat. Этот stacktrace сможет сообщить вам, какая строка кода вызывает сбой.

Ответ №2:

Используйте finally блок в своем коде, который похож

  `try{

 } catch{

 } finally{

 }`
  

finally будет выполняться, даже если ваш блок try выдает исключение или даже если этого не происходит.

Комментарии:

1. Если между блоком try catch возникнет исключение во время выполнения, приложение все равно выйдет из строя. Единственный способ избежать этого — перехватить ВСЕ исключения (используя java.lang. Бросаемый). Очевидно, что это не учитывает ошибки (например: NoClassDefFoundError)

2. Блок finally будет выполнен, даже если код выдает исключение во время выполнения, но это исключение будет распространено после выполнения блока finally, и приложение может затем завершиться. Это не решает проблему.

3. Этот ответ не решает проблему. Вам нужно понять концепцию множественного перехвата. Чтобы убедиться, что все ошибки перехвачены, вы должны перехватить (Throwable th) в самом последнем конце перехвата. Наконец, это просто означает, что даже если у вас есть exceptio / нет исключения, вы все равно хотите сделать что-то подобное внутри блока finally. Например, тесное соединение.