Хорошим местом для начала является JavaDocs . Они охватывают это:
Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
- Вызов метода экземпляра нулевого объекта.
- Доступ или изменение поля нулевого объекта.
- Выполнение длины null, как если бы это был массив.
- Доступ или изменение слотов с нулевым значением, как если бы это был массив.
- Бросать нуль, как если бы это было значение Throwable.
Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.
blockquote>Также, если вы попытаетесь использовать нулевую ссылку с
synchronized
, который также выдаст это исключение, за JLS :SynchronizedStatement: synchronized ( Expression ) Block
blockquote>
- В противном случае, если значение выражения равно null,
NullPointerException
.Как это исправить?
Итак, у вас есть
NullPointerException
. Как вы это исправите? Возьмем простой пример, который выдаетNullPointerException
:public class Printer { private String name; public void setName(String name) { this.name = name; } public void print() { printString(name); } private void printString(String s) { System.out.println(s + " (" + s.length() + ")"); } public static void main(String[] args) { Printer printer = new Printer(); printer.print(); } }
Идентифицирует нулевые значения
. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:
Exception in thread "main" java.lang.NullPointerException at Printer.printString(Printer.java:13) at Printer.print(Printer.java:9) at Printer.main(Printer.java:19)
Здесь мы видим, что исключение выбрано в строке 13 (в методе
printString
). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, чтоs
имеет значение null, а вызов методаlength
на него вызывает исключение. Мы видим, что программа перестает бросать исключение, когдаs.length()
удаляется из метода.Трассировка, где эти значения взяты из
Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что
s
передается сprintString(name)
в методеprint()
, аthis.name
- null.Трассировка, где эти значения должны быть установлены
Где установлен
this.name
? В методеsetName(String)
. С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. Этого достаточно, чтобы дать нам решение: добавить вызов
printer.setName()
перед вызовомprinter.print()
.Другие исправления
Переменная может иметь значение по умолчанию (и
setName
может помешать ему установить значение null):private String name = "";
Либо метод
printString
может проверить значение null например:printString((name == null) ? "" : name);
Или вы можете создать класс, чтобы
name
всегда имел ненулевое значение :public class Printer { private final String name; public Printer(String name) { this.name = Objects.requireNonNull(name); } public void print() { printString(name); } private void printString(String s) { System.out.println(s + " (" + s.length() + ")"); } public static void main(String[] args) { Printer printer = new Printer("123"); printer.print(); } }
См. также:
Я все еще не могу найти проблему
Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).
Ctrl + E + D : Подсказка по Документу
Формата для команд : Настроенный договорился о параметрах форматирования в Visual Studio (они очень гибки), затем экспортируйте настройки в .settings файл для каждого разработчика для импорта.
Теперь, если все разработчики учатся автоформатировать все, это не только произведет идеальная непротиворечивость форматирования в течение проекта без усилия во всем , но также и значительно уменьшит раздражающие ложные различия в различном инструменте при слиянии нескольких регистраций с Управлением исходным кодом.
, О, я наслаждаюсь хорошими инструментами!
Я просто узнал, что Сдвиг + F11 ступает из текущей функции.
Это очень полезно, когда Вы хотите к нечто функции отладки в нечто (панель (baz ()). Используйте F11 , Сдвиг + F11 для вскакивания и из панели и baz.
Высокий звук + Сдвиг + Клавиши со стрелками ( ← ↑ ↓ → ), или перемещение мыши = выбор Блока/Столбец
происходит действительно удобный
Ctrl + M , Ctrl + O : выйдите из строя к определениям. Я использую все это время вместе с #regions
(несмотря на , что Jeff говорит ) получить обзор кода моего экрана.
Ctrl + Сдвиг + R -> Осуществляют рефакторинг с Resharper
Ctrl + Сдвиг + 8 - Отслеживание в обратном порядке переходит к предыдущему" F12 / Переходят к определению"
Если Вы устанавливаете Визуальный, Помогают X , который я настоятельно рекомендую, чтобы Вы сделали, они полезны:
Высокий звук + O : Переключите текущий документ между заголовком/реализацией (.h/.cpp)
Высокий звук + G : Перейдите к определению/объявлению
F7 для создания и затем F8 для движения в ошибки и предупреждения один за другим.
Высокий звук + F4 ;)
, Но на более серьезной ноте, Ctrl + Пространство , вероятно, поражен много от меня в моем ограниченном использовании VS.
F7 переключается от режима конструктора для кодирования представления.
"Находят в файлах", был огромный усилитель производительности для меня. Вместо того, чтобы переходить к каждому результату один за другим, это просто показывает Вам список результатов в Вашем всем проекте или решении. Это делает очень простым найти пример кода или видеть, используется ли функция где-нибудь.
Не сочетание клавиш, но с Вашей мышью, можно использовать вперед и назад кнопки на мыши, чтобы перейти к предыдущим местоположениям в коде и возвратиться в текущее местоположение.
Ctrl + BP (Предыдущая закладка), Ctrl + BN (Следующая закладка)
Вставить фрагмент:
Ctrl + K , Ctrl + S
Я часто использую if для try..catch
и #region
Я большой поклонник Ctrl + D + Q для открытия Quickwatch во время отладки.
Control + Apostrophe.
Ой, подождите, это было после того, как я переназначил его с этого дурацкого Alt + Shift + F10 или чего-то еще.
Когда вы переназначаете параметры , чтобы привязать этот к исходному ярлыку, который трудно использовать, он становится намного более полезным.
Ctrl + Shift + V несколько раз переключает кольцо буфера обмена.
Это просто, но
Ctrl + L
удаляет всю строку. Отлично подходит для быстрого редактирования кода.
Комбинация Ctrl + U и Ctrl + Shift + U ] для преобразования блока символов в верхний / нижний регистр.
Ctrl + K + C - установить текущий выбранный код в качестве комментариев {{1} } Ctrl + K + U - установить текущий выбранный комментарий как код
Я отобразил все команды расширения/свертывания так, чтобы их можно было использовать левой и только правой рукой, чтобы моя правая рука оставалась на мыши.
Ctrl + E, Ctrl + E переключает расширение, Ctrl + E, Ctrl + D сворачивает все к определениям, Ctrl + E, Ctrl + A переключает все выделения.
, Это работает оба в коде VB/C# (например, выйдите из строя/расширьте функцию), и на aspx странице (например, выходят из строя/расширяют определение GridView).
Одно очень хорошее использование этого должно сократить или скопировать большой блок разметки или кода: Например, для перемещения большого, обширного <table>
или <asp:gridview>
определение:
Ctrl + Сдвиг + F4 для закрытия всех окон. Необходимо отобразить его сами:
Инструкции:
Кредит к Kyle Baley по codebetter.com . Я изменил его пример для использования сдвига вместо высокого звука, потому что это было легче на моих руках.
Я имею два, что я использую много, первое является стандартным, вторым, необходимо отобразиться:
Ctrl + , Ctrl + E , F (Выбор Все, Выбор Формата)
Ctrl + E , R (Удаляют Неиспользованные Использования и Вид)
И справка платят наличными за "долг хлама" рано и часто
Ctrl + Сдвиг + S //Сохраняют
Ctrl + Сдвиг + B //Сборка
Hmmm, никто не сказал F1 для справки.
Мог он быть, что Google быстрее и лучше для достигания информации, в которой Вы нуждаетесь.
Простой. F8 : Пойдите для следующего создания ошибки.
Найденный, что теперь это будет работать в любом виде окна списка (те, что кластер вместе в нижней части обычно.
Что сказанный Ray. Ctrl + . .
мне действительно не нравились умные теги (те небольшие синие и красные подчеркивания, которые кажутся желающими для помощи Вам), пока я не узнал, что Вы не должны напрасно тратить время, пытаясь нависнуть мышь над точным пикселем, который заставляет меню показывать.
я думаю Ctrl + . для открытия умного меню тега сохраняет меня приблизительно пять минут каждый день и значительно уменьшает мое кровяное давление.
Ctrl + X
Это сокращает (к буферу обмена) текущую строку кода.