Хорошим местом для начала является 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 ).
Модификации к Вашему оригиналу:
, реальные противные -
, И это все предполагает, что взломщик не осуществляет выполнение произвольного кода
Некоторая дополнительная информация, которая могла бы представлять интерес:
JavaScript может получить больше информации, чем только время. Например, разрешение экрана (+ глубина цвета) быть одним из них.
Видят Получать Разрешение экрана с JS
Все, что JS может получить, может быть передан с помощью Ajax без пользователя, выполняющего любое взаимодействие. Другие примеры (не, все будут работать в каждом браузере):
Это может изучить Вашу историю браузера, например, какой URL Ваш браузер пошел бы, если Вы защищаетесь или передаете.
язык Вашего браузера ( Примечание : обычно Запрос HTTP будет также содержать список предпочтительных языков для страницы, которую Вы запрашиваете. Однако этот список является пользователем, доступным для редактирования в prefs многих браузер, в то время как JS может на самом деле узнать то, что языковой перевод Ваш браузер использует в интерфейсе)
, Если Ваш браузер, автоматические заливки формируют поля (например, электронная почта, имя пользователя, и т.д.), JS, может на самом деле уже считать то, что Ваш браузер ввел в поля перед представлением формы (таким образом, это может даже считать то, что браузер, предварительно заполненный там, даже если Вы никогда не отправляете форму вообще).
апплет Java А мог также собрать некоторую информацию и передать ее, хотя нет большой информации, которую Вы уже не получили бы в другом месте. Так как легко получить IP посетителя, возможно узнать, какой онлайн-сервис он использует (поиск IP в сервисах адреса как IANA для США или ГОТОВЫЙ к Европе и так далее) и существуют сервисы, которые переводят дюйм/с в страну, таким образом, возможно узнать, где пользователь, скорее всего, в настоящее время располагается.
. СЕТЕВЫЕ версии платформы передаются в IE в Агенте пользователя.
Flash может дать Вам список шрифтов на машине пользователя среди прочего. JavaScript может отправить информацию, когда мышь делает остановку реклама, не нажимая его. Можно также получить размер окна, открыт ли сайт в кадре, если всплывающие окна или определенные плагины были заблокированы, искание функций Javascript может сказать, корректен ли заголовок агента пользователя или фальшив...
Если Вы обеспокоены своей персональной безопасностью (я не уверен, является ли это тем, что Вы действительно получаете после, таким образом, мои извинения, если это дезинформировано), можно всегда использовать сеть Tor. При использовании Firefox можно использовать Torbutton для одного включения щелчка. Это обладает преимуществом (недостаток, некоторым), отключения Flash, потому что в других отношениях невозможно защитить от утечек информации о Flash.
Accept-Language
HTTP-заголовок. Accept
HTTP-заголовок. User-Agent
HTTP-заголовок. Я должен вскопать ссылку, но если пользователь использует IE с установленными заголовками стандартного программного обеспечения, определяя, которые установлены, возможно.
Насколько я знаю, возможно получить данные буфера обмена с помощью JavaScript. Не уверенный, насколько возможный это по умолчанию в эти дни, но это был весь гнев недавно. Я действительно полагаю, что IE все еще позволяет его.
у Человек есть привычка к отъезду очень важных данных в их буфере обмена, таким образом, это довольно плохо.