Хорошим местом для начала является 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 ).
Ваш браузер не заботится о расширении файла, только тип контента, о котором сообщает сервер. (Ну, если Вы не используете IE, потому что в Microsoft они думают, что знают больше о том, что Вы подаете, чем Вы делаете). Если Ваш сервер сообщает, что подаваемым содержанием является Тип контента: текст/HTML, затем Ваш браузер, как предполагается, рассматривает его как, он - HTML, каково имя файла.
Как правило, это реализовало использование схемы перезаписи URL некоторого описания. Основное понятие - то, что сеть должна перемещаться в обращение к ресурсам с надлежащим URIs, не классическим старым URL, которые пропускают деталь реализации, и которые уязвимы для будущих изменений в результате.
А, которыми полное обсуждение темы может быть найдено в статье Tim Berners-Lee's, Охлаждаются, URIs не Изменяются , который спорит в пользу сокращения несоответствующего хлама в URIs как средство помощи избежать проблем, которые происходят, когда реализации действительно изменяются, и когда ресурсы действительно перемещаются в другой URL. Сама статья содержит хорошие общие рекомендации по тому, чтобы распланировать схему URI и определенно стоит чтения.
Более конкретно, чем большинство этих ответов:
веб-контент не использует расширение файла для определения, какой файл подается (если Вы не Internet Explorer). Вместо этого они используют Content-type
HTTP-заголовок, который отправляется вниз провод, прежде чем содержание изображения, страницы HTML, загрузит, или что бы то ни было. Например:
Content-type: text/html
обозначает, что страница, которую Вы просматриваете, должна быть интерпретирована, поскольку HTML, и
Content-type: image/png
обозначает, что страница является изображением PNG.
веб-серверы часто используют расширение файла, если файл подается непосредственно от диска до , определяют , что Content-type
для присвоения но веб-приложения могут также генерировать страницы с любым Content-type
, они любят в ответ на запрос. Неважно, структура или расширение имени файла, пока фактическое содержание страницы соответствует заявленному Content-type
, рендеринг данных, как предназначено.
Для веб-сайтов, которые используют Apache, они, вероятно, используют mod_rewrite, который позволяет им переписать URL (и сделать их большим количеством пользователя и SEO дружественный)
, можно читать больше здесь http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html и здесь http://www.sitepoint.com/article/apache-mod_rewrite-examples/
РЕДАКТИРОВАНИЕ : Там переписывают модули для IIS также.
Традиционно расширение файла представляет файл, который подается.
, Например
Позже тот же самый подход использовался, чтобы позволить процессу сценария параметр
http://somerverser/somepath/script.php?param=1234&other=7890
В этом случае, файл был сценарием PHP, которые обрабатывают "запрос" и представили динамично созданный файл.
В наше время, приложения намного более сложны, чем это (а именно, амазонка, которую Вы упомянули)
Затем существует не единственный сценарий, который обрабатывает запрос (но остроумие намного более сложного приложения несколько файлов/методов/функций/объектов и т.д.), и URL больше похож на точку входа для веб-приложения (это может иметь сценарий позади, но что другая вещь), поэтому теперь веб-приложения как амазонка и да, который stackoverflow не показывают файлу в URL, но чем-либо прибытие, обрабатывается приложением в стороне сервера.
Здесь я вопросы представляют веб-приложение и 322747 параметр
, я надеюсь, что это небольшое объяснение помогает Вам понять лучше все другие ответы.
В зависимости от настроек Вашего сервера можно использовать (или не) любое расширение, которое Вы хотите. Вы могли даже установить расширения, чтобы быть ".JamesRocks", но это не будет очень полезно :)
Так или иначе на всякий случай Вы плохо знакомы с веб-программированием весь этот мусор на конце существуют аргументы ПОЛУЧИТЬ операции а не расширению страницы.
Много сообщений упомянули это, и я взвешусь. Это абсолютно - система перезаписи URL, и много платформ имеют способы реализовать это.
я работал на несколько более крупных сайтов электронной коммерции, и это - теперь очень важная часть веб-присутствия и предлагает много преимуществ.
я рекомендовал бы брать технологию, Вы хотите работать с, и образцы исследования механизма перезаписи URL для той платформы. Для.NET, например, там Google 'перезапись URL asp.net' или использование дополнительная платформа как MVC, который делает эту функциональность из поля.
Много людей использует больше" УСПОКОИТЕЛЬНЫЙ " архитектура типа... или по крайней мере, выглядящие словно REST URL.
Этот сайт (StackOverflow) dosn't показывает расширение файла... это использует ASP.NET MVC.
В Django (платформа веб-приложений для Python), Вы разрабатываете URL сами, независимый от любого имени файла или даже любого пути на сервере в этом отношении.
Вы просто говорите что-то как, "Я хочу /news/<number>/
URL быть обработанным этой функцией"