NullPointerException не перехватывается - PullRequest
0 голосов
/ 14 сентября 2018

Я использую отражение Java как таковое:

try {
    method.invoke(someObject);
  } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NullPointerException e) {
    //Do something
  }

method извлекается из итерации по getMethods() из "Set<Method> getMethods = new HashSet<Method>(Arrays.asList(curObject.getClass().getMethods()))"

someObject не null , но в вызове метода он вызывает что-то, что приводит к NullPointerException.

Однако код по-прежнему выдает ошибку NullPointerException с трассировкой стека, указывающей обратно на "method.invoke (someObject);".

Почему catch не работает? Это как-то связано с отражением?

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

Я думаю, вы должны попробовать это:

 try
 { 
   // your code may error occures !!
 }
 catch(NullPointerException e)
{
//do your work here
}
catch(InvocationTargetException e)
{
//do your work here
}
catch(IllegalAccessException e)
{
//do your work here
}
catch(IllegalArgumentException e)
{
//do your work here
}
catch(Exception e)
{
//do your work here
}

здесь все ваши исключения ловятся в нескольких блоках перехвата.

0 голосов
/ 21 сентября 2018

Если я правильно прочитал трассировку стека, генерируется не исключение NullPointerException, а com.mapp.node.logging.exception.ConstructingFatalThrowableException с сообщением (и, вероятно, причиной) "java.lang.NullPointerException".Первая строка трассировки стека NullPointerExcpetion должна начинаться с java.lang.NullPointerException.

. Чтобы проверить это, вы можете просто добавить ConstructingFatalThrowableException в свой блок catch.

0 голосов
/ 21 сентября 2018

Это не NPE: это com.mapp.node.logging.exception.ConstructingFatalThrowableException, генерируемый каким-то прикольным кодом, который позволяет вмешиваться при создании NPE.

Чтение стека снизу вверх:

com.mapp.node.logging.exception.ConstructingFatalThrowableException: java.lang.NullPointerException
    at com.mapp.server.util.ExceptionInstrumentationUtil.handleFatalThrowable(ExceptionInstrumentationUtil.java:212)
    at com.mapp.server.util.ExceptionInstrumentationUtil.access$000(ExceptionInstrumentationUtil.java:32)
    at com.mapp.server.util.ExceptionInstrumentationUtil$2.sample(ExceptionInstrumentationUtil.java:164)
    at com.mapp.server.util.ExceptionInstrumentationUtil$2.sample(ExceptionInstrumentationUtil.java:160)
    at com.google.monitoring.runtime.instrumentation.ConstructorInstrumenter.invokeSamplers(ConstructorInstrumenter.java:207)
    at java.lang.RuntimeException.<init>(RuntimeException.java:52)
    at java.lang.NullPointerException.<init>(NullPointerException.java:60)

Поток находится в NullPointerException.java:60, где есть вызов java.lang.RuntimeException.<init> (т. Е. Конструктор суперкласса), где (в RuntimeException.java:52) есть то, что JVM инструментирует для вызова как com.google.monitoring.runtime.instrumentation.ConstructorInstrumenter.invokeSamplers ( Я полагаю, что это занимает место super()?).

Во всяком случае - ваше исключение брошено в ExceptionInstrumentationUtil.java:212.

0 голосов
/ 19 сентября 2018

Причина, по которой вы не ловите исключение, заключается в том, что это не NullPointerException, а com.mapp.node.logging.exception.ConstructingFatalThrowableException.Это исключение выдается с сообщением (которое следует за именем исключения) "java.lang.NullPointerException" , и это является источником путаницы.Попробуйте поймать ConstructingFatalThrowableException вместо NPE и посмотрите, работает ли он.


Также обратите внимание, что вы не должны ловить NullPointerException.Это RuntimeException, и эта группа исключений обычно указывает на программную ошибку, и в этом случае вы не должны ее «обрабатывать», потому что, если вы знали, что ее следует ожидать, вам следовало бы избежать этой ошибки.Посмотрите, что говорят docs :

Исключения времени выполнения представляют проблемы, которые являются результатом программной проблемы, и поэтому нельзя ожидать, что клиентский код API будет разумно ожидатьоправиться от них или обращаться с ними любым способом .Такие проблемы включают арифметические исключения, такие как деление на ноль;Исключения указателя, такие как попытка доступа к объекту через нулевую ссылку (...)

Имея это в виду, просто избегайте NullPointerException.Проверьте пример ниже:

if(var!= null) {
    //Normal code here 
} 
else {
    //Handle the null pointer here
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...