Узнайте, какая переменная бросает NullPointerException программно

вы можете сделать это с помощью php и css.

php-путь - это использование выражения if else , как показано ниже

    if(isset(

вы можете сделать это с помощью php и css.

php-путь - это использование выражения if else , как показано ниже

[110]POST['submit'])){ $name =

вы можете сделать это с помощью php и css.

php-путь - это использование выражения if else , как показано ниже

[110]POST['first_name']; $email =

вы можете сделать это с помощью php и css.

php-путь - это использование выражения if else , как показано ниже

[110]POST['email_address']; $subject =

вы можете сделать это с помощью php и css.

php-путь - это использование выражения if else , как показано ниже

[110]POST['subject']; $message =

вы можете сделать это с помощью php и css.

php-путь - это использование выражения if else , как показано ниже

[110]POST['message']; $mailTo = "jamie@sharpsdigital.co.uk"; $headers = "From: MLS systems Contact Form "; $txt = "$name has sent you an email from the address. " .$email. "\n\n With the message of.\n\n" .$message. " \n\n This is an automated response from the contact form, Please click on the blue email address above to respond." ; if(mail ($mailTo, $subject, $txt, $headers)){ echo "Thanks for your contact."; } }else{ ?> your form goes here <?php }?>
23
задан Cœur 30 September 2017 в 18:16
поделиться

6 ответов

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

throw new NullPointerException();

Я бы сказал, что нет универсального способа закрепить исключение нулевого указателя на конкретную переменную.

Лучше всего поместить как можно меньше операторов в каждую строку, чтобы стало очевидно, что вызвало исключение нулевого указателя. Рассмотрите возможность рефакторинга вашего кода в вопросе, чтобы он выглядел примерно так:

List items = this.superSL.items;
String name = items.get(name);
String source = name.getSource();
if (source.compareTo(VIsualShoppingList.Source_EXTRA) == 0)  {
    // ...
}

Конечно, нужно больше строк кода. Но он также более читабелен и удобен в обслуживании.

28
ответ дан 29 November 2019 в 02:08
поделиться

Вы могли бы рассмотреть, как [1 110] объявленный здесь , JDK 14, который должен включать JEP 358:

JEP 358: Полезный NullPointerExceptions

предположим NPE происходит в этом коде:

a.b.c.i = 99;

имя файла и номер строки не точно определяют точно, какая переменная была пустой.
Было это a или b или c?

А подобная проблема происходит при доступе к массиву и присвоении. Предположим, что NPE происходит в этом коде:

a[i][j][k] = 99;

имя файла и номер строки не точно определяют точно, какой компонент массива был пустым.
Было это a или a[i] или a[i][j]?

Описание:

, Если бы более сложный оператор a.b.c.i = 99; бросает NPE, сообщение разделило бы оператор и точно определило бы причину путем показа пути полного доступа, который привел к пустому указателю:

Exception in thread "main" java.lang.NullPointerException: 
        Cannot read field "c" because "a.b" is null
    at Prog.main(Prog.java:5)

Снова: быть протестированным с JDK 14.

1
ответ дан 29 November 2019 в 02:08
поделиться

К сожалению, нет простого программного способа определить, какая переменная или вызов метода является источником исключения. Вы можете использовать что-то вроде Аспектно-ориентированное программирование (AOP) , например AspectJ , но это не является неотъемлемой частью языка и обычно не включается в программу просто для целей отладки.

  • if (var == null) -> слишком много работы
  • попробуйте {} catch () {}
  • Отладчик

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

if (this.superSL.items.get(name).getSource().compareTo(VIsualShoppingList.Source_EXTRA)==0)  {

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

1) Корректность - допустимо ли в проекте, чтобы один из этих вызовов возвращал нуль? Если это так, вам следует разобрать его, протестировать и обработать соответствующим образом.

2) Понятность - будущим сопровождающим (включая future you ) будет легче понять, если вы промежуточные, хорошо названные переменные, чтобы помочь прояснить, что происходит в этой строке. .

3) Эффективность - обычно, когда вы так глубоко погружаетесь в граф (объединяете вместе серию вызовов методов), вероятно, вам придется вернуться к нему позже. Захват этого промежуточного значения в промежуточной переменной означает отказ от повторного вызова одного или нескольких методов.

4) Отладка - как указано в вашем вопросе, разделение сложной строки, подобной этой, упрощает отладку. путем сужения возможного источника исключения.

6
ответ дан 29 November 2019 в 02:08
поделиться

Думаю, вам стоит обратить внимание на Закон Деметера .

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

1
ответ дан 29 November 2019 в 02:08
поделиться

Я знаю, что вы предположили, что (var == null) - это слишком много работы, но, как Мигель заявил в комментариях, что это то, с чем я бы пошел.

1
ответ дан 29 November 2019 в 02:08
поделиться

Что вы имеете в виду, говоря «использовать отладчик -> вручную, слишком медленно»? Если ваш код правильно структурирован, то в одной строке будет использоваться не более двух или трех переменных. Неужели так медленно их проверять? У вас не каждую минуту NullPointers.

2
ответ дан 29 November 2019 в 02:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: