Немного больше о XPath axes
Допустим, что мы имеем структуру ниже HTML
:
//span/parent::*
- возвращает любой элемент , который является прямым родителем. В этом случае вывод Выход: Выход: Выход: Выход: Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа В этом примере переменная x является Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код: Первая строка объявляет переменную с именем Во второй строке ключевое слово Например, вы можете имеют следующий метод: В этом случае вы не создаете объект В этом случае Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, Наконец, Как определить исключение & amp; причина использования Трассировки стека Другое событие Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы Вы должны инициализировать элементы в массиве перед доступом или разыменованием их. Указатель В общем, это потому, что что-то не было правильно инициализировано. В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами. При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException. Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer». Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки И в другом месте вашего кода: Это важно знать - когда больше нет ссылок на объект (в пример выше, когда Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся: Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его. Например, ниже - класс ученика, который будет использовать его в нашем коде. Приведенный ниже код дает вам исключение с нулевым указателем. Поскольку вы используете Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать См. также: A хороший список лучших практик Я бы добавил, очень важно, хорошо использовать модификатор Сводка: Как будто вы пытаетесь получить доступ к объекту, который является . В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать См. Также этот пример: В Java все находится в форме класса. Если вы хотите использовать любой объект, тогда у вас есть две фазы: Пример: То же самое для концепции массива Если вы не дают секцию инициализации, тогда возникает Хорошим местом для начала является JavaDocs . Они охватывают это: Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся: Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта. Также, если вы попытаетесь использовать нулевую ссылку с Итак, у вас есть Идентифицирует нулевые значения . Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение: Здесь мы видим, что исключение выбрано в строке 13 (в методе Трассировка, где эти значения взяты из Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что Трассировка, где эти значения должны быть установлены Где установлен Этого достаточно, чтобы дать нам решение: добавить вызов Переменная может иметь значение по умолчанию (и Либо метод Или вы можете создать класс, чтобы См. также: Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ). Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации В первой строке внутри (Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.) //span/parent::div[@class="parent"]
- возвращает родительский элемент только точного типа узла и только , если указанный предикат - True. //span/ancestor::*
- возвращает всех предков (включая родителя). ,
//span/ancestor-or-self::*
- возвращает все предков и . Child
, ,
//span/ancestor::div[2]
- возвращает второго предка (начиная с родителя) типа div
. 12 ответов
int
: int x;
x = 10;
int
, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x. Integer num;
num = new Integer(10);
num
, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer
является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю». new
используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num
присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования .
(точка). Exception
, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num
. Перед созданием объекта вы получите NullPointerException
. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект. public void doSomething(SomeObject obj) {
//do something to obj
}
obj
, скорее предполагая, что он был создан до вызова метода doSomething
. К сожалению, этот метод можно вызвать следующим образом: doSomething(null);
obj
имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException
, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки. doSomething
может быть записано как: /**
* @param obj An optional foo for ____. May be null, in which case
* the result will be ____.
*/
public void doSomething(SomeObject obj) {
if(obj != null) {
//do something
} else {
//do something else
}
}
NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри. String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
.equals
для гарантированного непустого объекта. null
. String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Optional
должен был вернуть значение null. Ключевое слово в порядке. Знать, как защищаться от него, крайне важно. Это предлагает одно общее его появление и способы его смягчения.
– Makoto
4 December 2017 в 06:54
NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
NULL
записывается как null
в java. И это дело чувствительное.
– bvdb
25 April 2018 в 16:40
this
. Возьмем этот пример: public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. null
.
null
в качестве цели блока synchronized
, 2), используя null
в качестве цели для switch
и unboxing null
.
– Stephen C
23 October 2017 в 10:16
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже: public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
NullPointerException
вообще. final
. Использование "окончательной" модификатор, когда это применимо в Java
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
.
@Nullable
, как указано выше) и предупреждают о возможных ошибках. Также можно вывести и создать такие аннотации (например, IntelliJ может это сделать) на основе существующей структуры кода.
– Jan Chimiak
5 March 2016 в 11:34
if (obj==null)
. Если он равен нулю, тогда вы также должны написать код для обработки.
– Lakmal Vithanage
17 February 2017 в 07:52
null
. Рассмотрим ниже пример: TypeA objA;
NullPointerException
, что имеет смысл. String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Object a;
a=new Object();
Item i[]=new Item[5];
i[0]=new Item();
NullpointerException
.
Что такое NullPointerException?
synchronized
, который также выдаст это исключение, за JLS :
SynchronizedStatement:
synchronized ( Expression ) Block
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();
}
}
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)
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();
}
}
Я все еще не могу найти проблему
NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc. NullPointerException
, be: public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
null
, прежде чем использовать его, , как это . С локальными переменными компилятор поймал бы эту ошибку, но в этом случае это не так. Может быть, это послужит полезным дополнением к вашему ответу?
– Ilmari Karonen
18 January 2014 в 11:28
Похожие вопросы:
int a=b
может вызывать NPE, если b являетсяInteger
. Бывают случаи, когда это запутывает для отладки. – Simon Fischer 26 September 2014 в 20:45NullPointerException
проблем в вашем коде является использование аннотаций@Nullable
и@NotNull
. Следующий ответ содержит дополнительную информацию об этом. Хотя этот ответ является специфическим для IntelliJ IDE, он также применим и к другим инструментам, как это показано в комментариях. (BTW Мне не разрешено напрямую редактировать этот ответ, возможно, автор может добавить его?) – Arjan Mels 3 January 2016 в 19:17