URL: тире по сравнению с [закрытым] подчеркиванием

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

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

blockquote>

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.
blockquote>

Как это исправить?

Итак, у вас есть 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 = "";

Либо метод print, либо 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 ).

177
задан 6 revs, 4 users 100% 30 August 2012 в 19:09
поделиться

16 ответов

Это - просто предположение, но кажется, что они выбрали тот, что люди по всей вероятности не будут использование на имя. Таким образом, у Вас может быть имя, которое включает написанное через дефис слово, и все еще используйте underbar в качестве ограничителя слова, например, UseTwo-wayLinks мог быть преобразован в use_two-way_links.

В Вашем примере,/about-us был бы каталог, названный написанным через дефис словом "о - нас" (если бы такое слово существовало, и/about_us был бы каталогом, названным фразой с двумя словами "о нас" преобразованный в единственную строку цветных символов.

31
ответ дан billjamesdev 23 November 2019 в 20:17
поделиться

Я лично избежал бы всех тире и подчеркиваний и выбрал бы Camel-регистр или PascalCase если в коде.

статья Wikipedia о Camel-регистре объясняет немного обоснование позади, это - источники. Они составляют

  1. Ленивые программисты, которым не нравилось достигать _ ключ
  2. Потенциальный беспорядок об удобочитаемости
  3. клавиатура "Альта" в ксероксе PARC, который не имел никакого ключа подчеркивания.

, Если бы пользователь должен видеть строку тогда, я не сделал бы ни одного из вышеупомянутого и использования "О нас". или "AboutUs", если я имел к как Camel-регистр, распространился к общему использованию в некоторых областях, таких как названия продукта. т.е. ThinkPad, TiVo

0
ответ дан 23 November 2019 в 20:17
поделиться

Пробелы позволяются в URL, таким образом, можно просто использовать "/о нас" в ссылке (хотя это будет закодировано к "/about%20us". Но будьте честны, это всегда будет персональным предпочтением, таким образом, не будет никакого реального ответа, который будет дан здесь.

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

0
ответ дан 23 November 2019 в 20:17
поделиться

Лично, я избегал бы использования о - нас или about_us, и просто использовал бы о.

1
ответ дан RodgerB 23 November 2019 в 20:17
поделиться

Некоторый более старый веб-хостинг и серверы DNS на самом деле имеют проблемы при парсинге подчеркиваний для URL, так, чтобы мог играть роль в соглашениях как они.

1
ответ дан Jon Limjap 23 November 2019 в 20:17
поделиться

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

2
ответ дан Krirk 23 November 2019 в 20:17
поделиться

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

то, Где точность текстового URL важна, при чтении вслух ее кому-то, в этом случае Вы не хотите путать подчеркивание для пространства (или наоборот).

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

3
ответ дан Aberrant 23 November 2019 в 20:17
поделиться

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

Плохо:

/low-budget-movies

Хороший:

/low-budget_movies
4
ответ дан jpeacock 23 November 2019 в 20:17
поделиться

Я думаю, что тире лучше с пользовательской точки зрения, и он не вмешается в SEO.

Не уверенный, где или почему запущенное соглашение подчеркивания.

Немного более хорошо осведомленный дебаты

3
ответ дан Geoff 23 November 2019 в 20:17
поделиться

Гуру SEO Jim Westergren протестировал этот назад в 2005 со строгой точки зрения SEO и пришел к выводу, что + (плюс) был на самом деле лучший ограничитель слова. Однако это не кажется разумным и может произойти из-за ошибки в алгоритмах поисковых систем. Он рекомендует - (тире) и для удобочитаемости и для SEO.

8
ответ дан Christian Davén 23 November 2019 в 20:17
поделиться

У Jeff есть некоторые мысли об этом: https://blog.codinghorror.com/of-spaces-underscores-and-dashes /

существуют недостатки обоим. Я предложил бы, чтобы Вы выбрали один и были последовательны.

11
ответ дан deppfx 23 November 2019 в 20:17
поделиться

Я раньше использовал подчеркивания все время, теперь я только использую их для частей веб-сайта, который я не хочу, чтобы любой непосредственно связал, js файлы, css... и т.д.

С точки зрения SEO, тире, кажется, предпочтительный способ обработать его, для подробного объяснения, из первых уст http://www.mattcutts.com/blog/dashes-vs-underscores/ .

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

Все еще использование подчеркивает в коде в предпочтении к тире, хотя - программисты понимают их, большинство других людей не делает.

14
ответ дан seanb 23 November 2019 в 20:17
поделиться

Google не рассматривал подчеркивание как разделителя слов в прошлом, который я думал, было довольно сумасшедшим, но по-видимому это делает теперь. Из-за этой истории предпочтены тире. Даже при том, что подчеркивания теперь допустимы с точки зрения SEO, я все еще думаю, что тире являются лучшими.

Одно преимущество - то, что Ваше среднее число semi-computer-illiterate веб-пользователь, намного более вероятно, будет в состоянии ввести тире на клавиатуре, они даже не могут знать, каково подчеркивание.

36
ответ дан MrZebra 23 November 2019 в 20:17
поделиться

Это не просто тире по сравнению с подчеркиванием:

  • текст с пробелами
  • пространство средств тире textwithoutspaces
  • encoded%20spaces%20in%20URL
  • underscore_means_space
  • Camel-регистр plus+means+space
  • PascalCase
  • " заключил текст в кавычки с пробелами" (и одинарная кавычка по сравнению с двойной кавычкой)
  • наклонная черта/средства/пространство
  • dot.means.space
52
ответ дан Mark Stock 23 November 2019 в 20:17
поделиться

Я более доволен подчеркиваниями. В первую очередь, они соответствуют в моему регулярному опыту программирования variable_names_are_not-subtraction, второй из всех, и я полагаю, что это уже было упомянуто, слова могут иметь дефисы, но у них никогда нет подчеркиваний. Выбрать действительно глупый пример, "Страна Этнического государства" отличается от "страны национального государства". Первый переводит что-то как "земля этнических государств" (думайте, что "это вот - страна оружия! Лучше всего пройдите, y'hear?"), тогда как последние взгляды как список когда-то-синонимов. http://example.com/nation-state-country/, кажется, не означает то же как http://example.com/nation-state_country/, и все же, если дефисы являются разделителями / "располагают s с интервалами" в дополнение к символам в словах, это может. Последний кажется более ясным относительно фактической цели, тогда как первый больше походит на тот список, если что-либо.

7
ответ дан Devin Jeanpierre 23 November 2019 в 20:17
поделиться

Из Google Webmaster Central

Рассмотрите возможность использования пунктуации в ваших URL-адресах. URL-адрес. http://www.example.com/green-dress.html гораздо полезнее для нас, чем http://www.example.com/greendress.html. Мы рекомендуем вам использовать дефисы (-) вместо знаков подчеркивания (_) в ваших URL-адресах.

184
ответ дан 23 November 2019 в 20:17
поделиться
Другие вопросы по тегам:

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