2010-08-04 3 views
22

Я пытаюсь бросить исключение в моем коде, как это:Как бросить RuntimeException («не может найти символ»)

throw RuntimeException(msg); 

Но когда я строю в NetBeans я получаю эту ошибку:

C:\....java:50: cannot find symbol 
symbol : method RuntimeException(java.lang.String) 
location: class ... 
     throw RuntimeException(msg); 
1 error 

Нужно ли мне что-то импортировать? Я опечатываю это? Я уверен, что я должен делать что-то немого :-(

+3

Зачем вам нужно исключать RuntimeException? –

+6

@JonathonFaust - Потому что иногда вы не хотите самостоятельно обрабатывать исключение или не хотите заставить пользователя обрабатывать исключение. Но если никто не справится с этим, приложение должно потерпеть крах. В Python почти каждое исключение - исключение во время выполнения, и все его любят. Если вы знаете, как следует обрабатывать исключение, вы обрабатываете его, а если нет, то вы игнорируете его - либо кто-то из вас может справиться, либо вы потерпите крах, и любой сценарий в порядке. Единственное, что было бы нехорошо, это записывать его и игнорировать. – ArtOfWarfare

+0

Не бросайте исключение во время выполнения или создайте подкласс RuntimeException просто потому, что вы не хотите беспокоиться о том, чтобы указать исключения, которые могут использовать ваши методы. http://journals.ecs.soton.ac.uk/java/tutorial/java/exceptions/runtime.html –

ответ

84

throw new RuntimeException(msg)

Вам нужно new там. Это создает экземпляр и бросать его, не вызывая метод.

+1

Зачем нужно исключать RuntimeException? Мир сумасшедший ... – PedroD

+0

@PedroD \t Потому что проверенные исключения - неудачный эксперимент? Или вы спрашиваете, почему кто-то захочет выбросить * raw * 'RuntimeException' вместо разумного подкласса? –

+0

Нет, проверенные исключения должны быть единственным типом, который можно использовать. Они являются частью API, который вы создаете/определяете. Исключенные исключения должны быть зарезервированы для системных ошибок, которые не могут/не должны быть восстановлены (например, NullPointer или OutOfMemory). Например. Если у меня есть функция, которая анализирует число из строки, она должна бросить мне ** checked ** NumberFormatException, потому что ожидается, что эта функция может выйти из строя по этой причине, и вполне разумно, что я мог бы поймать и восстановить из этого ошибка, поэтому его нужно проверить ... Однако, если я получу указатель Null ... – PedroD

33

Exception является Object как и любой другой в Java. вы должны использовать new ключевое слово, чтобы создать новый Exception, прежде чем throw его.

throw new RuntimeException(); 

При желании вы также можете сделать следующее:

RuntimeException e = new RuntimeException(); 
throw e; 

Оба фрагмента кода эквивалентны.

Link to the tutorials for completeness.

3

Вам нужно создать экземпляр RuntimeException, используя new так же, как вы бы создать экземпляр большинства других классов:

throw new RuntimeException(msg); 
6

вам придется создать его экземпляр перед вами бросить его

throw new RuntimeException(arg0) 

PS: достаточно Intrestingly в среде NetBeans IDE должен иметь аль готовы указать, что ошибка времени компиляции

+1

Почему downvotes? +1, чтобы противостоять им. –

15

Как и все остальные, создайте экземпляр объекта перед его выбросом.

Просто хотел добавить один бит; невероятно редко бросать исключение RuntimeException. Было бы нормально, если бы код в API мог вызывать подкласс этого, но, как правило, код приложения генерирует исключение или что-то, что расширяет Exception, но не RuntimeException.

И в ретроспективе я пропустил добавление причины , почему вы используете исключение вместо RuntimeException; @Jay, в комментарии ниже, добавлен в полезный бит. RuntimeException не является проверенным исключением;

  • Подпись метода не обязана объявлять, что может быть выбрано исключение RuntimeException.
  • Абоненты этого метода не обязаны улавливать исключение или признавать его каким-либо образом.
  • Разработчики, которые пытаются использовать ваш код, не будут предвидеть эту проблему, если они не будут выглядеть внимательно, и это увеличит нагрузку на обслуживание кода.
+1

То же. В общем, вы должны создать свои собственные исключения для броска и наследовать их от Exception. RuntimeException следует использовать с особой осторожностью, поскольку оно обходит обычные гарантии в Java, что функция должна объявлять все исключения, которые она может выбрасывать. – Jay

+0

Одним из распространенных случаев для этого является то, что вы реализуете существующий интерфейс, который не объявляет какие-либо проверенные исключения. Например, при написании кеша с поддержкой сети имеет смысл реализовать «Map», но если вы получаете «IOException» при обработке 'put()' или 'get()', вам придется бросить некоторые вид RuntimeException. (Это должен быть собственный класс, но это должно быть исключение). –

1

Просто для других: убедитесь, что это новое RuntimeException, а не новое RuntimeErrorException, которому нужна ошибка в качестве аргумента.

1
throw new RuntimeException(msg); 

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