Как различить исключения для программиста и JVM - PullRequest
8 голосов
/ 29 мая 2010


Как подсказывает заголовок , как я могу сказать JVM-исключение из Программно (это означает, что он был сгенерирован программистом или программой) выброшенное исключение ?


Исключения JVM


1) ArrayIndexOutOfBoundsException

2) ClassCastException

3) NullPointerException



Программно выброшено


1) NumberFormatException

2) Ошибка подтверждения


Большое спасибо

Ответы [ 3 ]

5 голосов
/ 29 мая 2010

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

Любое исключение, определенное в стандартных библиотеках классов Java, может быть вызвано приложением или кодом сторонней библиотеки. В некоторых случаях это плохая (или даже ужасная) идея выбросить стандартное исключение, но в других это рекомендуется делать.

Единственный возможный способ отличить исключение, выдаваемое JVM и кодом приложения, - это проверить кадры стека из выданного исключения, чтобы выяснить, какой класс создал это исключение. (Строго говоря, это не говорит вам, где было сгенерировано исключение ... но это достаточно близко, учитывая, что исключения почти всегда создаются и добавляются в одном и том же утверждении.)

Но даже это не особенно полезно. Я имею в виду, в чем семантическая разница между исключением, создаваемым кодом приложения и библиотекой классов? Это, конечно, ничего не говорит о первопричине проблемы.

4 голосов
/ 29 мая 2010

Я не уверен, что вы имеете в виду под исключениями JVM. Это все исключения времени выполнения, которые могут быть сгенерированы программистом в любой момент (исключение AssertionError), хотя считается, что выбрасывать определенные исключения, такие как NullPointerException, не очень удобно Дело в том, что нет двух качеств, разделяющих две упомянутые вами категории, кроме их типичного использования. Все исключения во время выполнения расширяются, прямо или косвенно, RuntimeException.

Из JavaDocs для Throwable:

Только объекты, которые являются экземплярами этот класс (или один из его подклассов) брошены виртуальной машиной Java или может быть брошено броском Java заявление.

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

3 голосов
/ 29 мая 2010

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

  • большинство Error классов выбрасываются виртуальной машиной из-за внутренних или внешних причин. Единственное исключение ThreadDeath, генерируется в потоке, когда этот поток останавливается, и является своего рода «хаком», чтобы заставить поток раскрутить свой стек и выйти.
  • большинство проверенных исключений относятся к проблемам окружающей среды, которые приводят к сбоям в некоторых операциях, но могут быть разрешимыми и несмертельными для JVM (IOException, SQLException, RemoteException).
  • остальные, непроверенные исключения, являются комбинацией как jvm, так и инициируемого программистом исключения. Например, JDK выдает IllegalArgumentException, когда параметры метода не соответствуют спецификации. Это исключение JVM или программное исключение? Неясно, включает ли ваше определение исключений JVM JDK или нет. ArrayIndexOutOfBounds генерируется для недопустимых обращений к массиву, генерируемых JVM, но он также генерируется в некоторых API, например, Track.get от java.midi. (Хотя это можно назвать плохой формой, и вместо этого следовало бы использовать суперкласс IndexOutOfBounds.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...