2012-04-18 2 views
0

У меня есть код, который не работает (что для меня является обычным явлением), но поскольку я не получаю ошибок, он просто продолжает работать с плохими данными. Я думаю, проблема в том, что она продолжает рассказывать мне, чтобы я обернул части своего кода в блоках try/catch (мои тесты являются базовыми, я просто выводил сообщение в области try, и если он выводится, я предполагаю, что все прошло хорошо. хорошо в моем коде). Я понимаю, что в процессе производства предложение try/catch помогает коду продолжать работать, но это затрудняет устранение неполадок, потому что я пытаюсь устранить этот раздел моего кода.Есть ли способ выбросить IOException в runnable?

Есть ли способ обойти это, чтобы я мог увидеть, когда что-то не получается в области try?

Вот пример моего кода:

try { 
     ByteArrayInputStream baos_back = new ByteArrayInputStream(message); 
     ObjectInputStream oos_back = new ObjectInputStream(baos_back); 
     i = oos_back.readInt(); 
     d = oos_back.readDouble(); 
     list_of_ints = (int[]) oos_back.readObject(); 
     oos_back.reset(); 
     baos_back.reset(); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

вы можете «выкинуть» исключение из вызывающей функции, добавив в метод декларацию 'throws'. – twain249

+1

Я бы предложил запустить ваш код через отладчик и взломать исключения. – birryree

+0

Его не часть метода. его в моем методе run() (в основном его открытие канала на сервер, вытягивание данных и преобразование его). –

ответ

1

Как я уже говорил в моем комментарии, вы можете перехватывать все исключения в Java с одеялом поймать заявление:

try { 
    // code 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Это будет ловить каждый Exception брошенный в try блоке, и единственные вещи, которые он не поймает, - Error.

На практике, вы хотите, чтобы ограничить типы исключений вы поймать, и поймать более конкретные исключения, так что вы можете цепи исключение следующим образом:

try { 
    // code 
} catch (IOException ioe) { 
    // we expected this 
    ioe.printStackTrace(); 
} catch (SomeOtherException soe) { // just an example... 
    soe.printStackTrace(); 
} catch (Exception e) { 
    // Did we expect this? Maybe not! 
    e.printStackTrace(); 
} 

Вышесказанное также делает известно, что вы ожидаете некоторые типы исключений, а затем большой общий признак catch-all, который может поймать то, чего вы не ожидали.

Вы также можете записывать исключения в файл или что-то еще, а не выводить их на стандартный, как это делает настоящий код прямо сейчас. Основная утилита регистрации - java.util.logging.


Я по-прежнему рекомендую научиться использовать отладчик. Отладчики могут делать много вещей, таких как остановка выполнения программы всякий раз, когда генерируется исключение, и позволяют вам проверять значения переменных и полей в любой момент выполнения программы. Если вы используете Eclipse или Netbeans или IntelliJ или другие IDE, у них есть отладчики. Если вы используете командную строку, есть отладчик java-дескриптора командной строки .

+0

большое спасибо. Я определю. узнайте отладчики (я использую их только для точек останова прямо сейчас, поэтому я могу запустить свой профилировщик, чтобы получить дамп памяти, но я сосредоточусь на их функциях в eclipse). Спасибо за отличный ответ и советы по программированию. –

+0

На самом деле, вы вызвали вопрос в моем сознании ... интегрированные отладчики в порядке или есть сторонние, которые лучше (я совершенно новый, поэтому не совсем уверен, как определить «лучше»)? –

+0

@learningJava - отладчики, которые поставляются с IntelliJ/Eclipse, все очень хорошо, мне никогда не приходилось использовать внешний отладчик, такой как JSwat, в мои годы написания кода для Java. Вот учебник по [Отладка с Eclipse] (http://www.ibm.com/developerworks/library/os-ecbug/). Одна из сторон, которую я использовал, - это [Memory Analyzer Tool] (http://www.eclipse.org/mat/), чтобы проверить дамп кучи Java, чтобы узнать, что привело к сбою машины с 8 ГБ оперативной памяти с помощью 'OutOfMemoryError '. – birryree

3

Вы пытаетесь получить вашу программу, чтобы взорвать, когда возникает эта ошибка? Если это так, вы можете обернуть свой IOException в RuntimeException и бросить это вместо этого. Они не отмечены, поэтому вам не нужно объявлять их, и это должно просто убить вашу программу.

+0

Да, я хочу, чтобы он взорвался, когда произошла ошибка. Я проверю вашу ссылку, выглядит многообещающе. –

1

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

Если вы хотите использовать блоки try-catch, вы всегда можете вручную исключить RuntimeException в конце блока catch. Что-то вроде:

throw new IOException(); 
try { 
    // Some code... 
} catch(Exception e) { 
    // Error handling code... 
    throw new RuntimeException(e.getMessage()); 
} 
1

Я предлагаю редактирования шаблона генерации кода, чтобы сделать это

catch ($ExceptionClass e) 
{ 
    // TODO: Autogenerated catch block 
    e.printStackTrace(); 
    throw new RuntimeExcepton(e); 
} 

Таким образом у вас есть напоминание TODO, а Barf на стандартный вывод, и убедиться, что ваша программа взорвется, если вы не обеспечивают правильное исключение обработчик.

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