Хорошим местом для начала является 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 ).
Это - просто предположение, но кажется, что они выбрали тот, что люди по всей вероятности не будут использование на имя. Таким образом, у Вас может быть имя, которое включает написанное через дефис слово, и все еще используйте underbar в качестве ограничителя слова, например, UseTwo-wayLinks мог быть преобразован в use_two-way_links.
В Вашем примере,/about-us был бы каталог, названный написанным через дефис словом "о - нас" (если бы такое слово существовало, и/about_us был бы каталогом, названным фразой с двумя словами "о нас" преобразованный в единственную строку цветных символов.
Я лично избежал бы всех тире и подчеркиваний и выбрал бы Camel-регистр или PascalCase если в коде.
статья Wikipedia о Camel-регистре объясняет немного обоснование позади, это - источники. Они составляют
, Если бы пользователь должен видеть строку тогда, я не сделал бы ни одного из вышеупомянутого и использования "О нас". или "AboutUs", если я имел к как Camel-регистр, распространился к общему использованию в некоторых областях, таких как названия продукта. т.е. ThinkPad, TiVo
Пробелы позволяются в URL, таким образом, можно просто использовать "/о нас" в ссылке (хотя это будет закодировано к "/about%20us". Но будьте честны, это всегда будет персональным предпочтением, таким образом, не будет никакого реального ответа, который будет дан здесь.
я пошел бы с соглашением, которое тире могут появиться в словах, таким образом, пробелы должны быть преобразованы в подчеркивания.
Лично, я избегал бы использования о - нас или about_us, и просто использовал бы о.
Некоторый более старый веб-хостинг и серверы DNS на самом деле имеют проблемы при парсинге подчеркиваний для URL, так, чтобы мог играть роль в соглашениях как они.
Поскольку конечный пользователь просматривает, я предпочитаю "о - нас" или "о нас" не "about_us"
Я предпочитаю тире на основании, что подчеркивание могло бы быть затенено до степени подчеркиванием ссылки. Текстовые URL, прежде всего, для того, чтобы быть распознанными сразу вместо того, чтобы быть грамматически корректными, таким образом, аргумент в пользу сохранения тире для использования в написанных через дефис словах ограничен.
то, Где точность текстового URL важна, при чтении вслух ее кому-то, в этом случае Вы не хотите путать подчеркивание для пространства (или наоборот).
я также нахожу тире более эстетически приятными, если это значит что-нибудь.
Подчеркивания заменяют пробелы, где пробел не позволяется. Тире (дефисы) могут быть частью слова, таким образом присоединившись к словам с дефисами, которые уже включают дефисы, ужасный/сбивает с толку.
Плохо:
/low-budget-movies
Хороший:
/low-budget_movies
Я думаю, что тире лучше с пользовательской точки зрения, и он не вмешается в SEO.
Не уверенный, где или почему запущенное соглашение подчеркивания.
Немного более хорошо осведомленный дебаты
Гуру SEO Jim Westergren протестировал этот назад в 2005 со строгой точки зрения SEO и пришел к выводу, что + (плюс) был на самом деле лучший ограничитель слова. Однако это не кажется разумным и может произойти из-за ошибки в алгоритмах поисковых систем. Он рекомендует - (тире) и для удобочитаемости и для SEO.
У Jeff есть некоторые мысли об этом: https://blog.codinghorror.com/of-spaces-underscores-and-dashes /
существуют недостатки обоим. Я предложил бы, чтобы Вы выбрали один и были последовательны.
Я раньше использовал подчеркивания все время, теперь я только использую их для частей веб-сайта, который я не хочу, чтобы любой непосредственно связал, js файлы, css... и т.д.
С точки зрения SEO, тире, кажется, предпочтительный способ обработать его, для подробного объяснения, из первых уст http://www.mattcutts.com/blog/dashes-vs-underscores/ .
другая проблема, которая, кажется, происходит, больше с широкой публикой, чем программисты, состоит в том, что, когда гиперссылка с подчеркиваниями подчеркивается, Вы не видите подчеркивание. Опытные пользователи разработают его, но Общественность Joe, вероятно, не будет.
Все еще использование подчеркивает в коде в предпочтении к тире, хотя - программисты понимают их, большинство других людей не делает.
Google не рассматривал подчеркивание как разделителя слов в прошлом, который я думал, было довольно сумасшедшим, но по-видимому это делает теперь. Из-за этой истории предпочтены тире. Даже при том, что подчеркивания теперь допустимы с точки зрения SEO, я все еще думаю, что тире являются лучшими.
Одно преимущество - то, что Ваше среднее число semi-computer-illiterate веб-пользователь, намного более вероятно, будет в состоянии ввести тире на клавиатуре, они даже не могут знать, каково подчеркивание.
Это не просто тире по сравнению с подчеркиванием:
Я более доволен подчеркиваниями. В первую очередь, они соответствуют в моему регулярному опыту программирования variable_names_are_not-subtraction
, второй из всех, и я полагаю, что это уже было упомянуто, слова могут иметь дефисы, но у них никогда нет подчеркиваний. Выбрать действительно глупый пример, "Страна Этнического государства" отличается от "страны национального государства". Первый переводит что-то как "земля этнических государств" (думайте, что "это вот - страна оружия! Лучше всего пройдите, y'hear?"), тогда как последние взгляды как список когда-то-синонимов. http://example.com/nation-state-country/
, кажется, не означает то же как http://example.com/nation-state_country/
, и все же, если дефисы являются разделителями / "располагают s с интервалами" в дополнение к символам в словах, это может. Последний кажется более ясным относительно фактической цели, тогда как первый больше походит на тот список, если что-либо.
Рассмотрите возможность использования пунктуации в ваших URL-адресах. URL-адрес. http://www.example.com/green-dress.html гораздо полезнее для нас, чем http://www.example.com/greendress.html. Мы рекомендуем вам использовать дефисы (-) вместо знаков подчеркивания (_) в ваших URL-адресах.