Почему у меня есть NullPointerException на bufferedReader = new BufferedReader (новый InputStreamReader (file.getInputstream () [duplicate]

Что такое Null Pointer Exceptions (java.lang.NullPointerException) и что их вызывает?

Какие методы / инструменты можно использовать для определения причины, чтобы исключить исключение из-за преждевременного завершения программы?

211
задан 26 May 2016 в 19:15

10 ответов

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

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения будет отменен ; а именно, использовать .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));
}
247
ответ дан 15 August 2018 в 14:46

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

292
ответ дан 15 August 2018 в 14:46

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

Когда вы пытаетесь выполнить один объектный метод, ссылка запрашивает живой объект для выполнения этого метода. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. После этого runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки 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), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент виртуальная машина освободит память, используемую этим объектом, и выделит другую.

256
ответ дан 15 August 2018 в 14:46

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

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

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

315
ответ дан 15 August 2018 в 14:46

Исключение с нулевым указателем - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Ниже приведен код исключения null.

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 ");
        }
    }
}
277
ответ дан 15 August 2018 в 14:46

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: Хороший список лучшие практики

Я бы добавил, очень важно, хорошо использовать модификатор final. Хороший список лучших практик

best practices

Используйте модификатор final для обеспечения хорошей инициализации. Избегайте возвращать null в методах, например, возвращая пустые коллекции, если это применимо. Использовать аннотации @NotNull и @Nullable Быстрое сбой и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, если они не должны быть пустыми. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject) Предпочитают valueOf() поверх toString (). Использовать нулевые методы StringUtils StringUtils.isEmpty(null).
280
ответ дан 15 August 2018 в 14:46

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

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инстанцировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
365
ответ дан 15 August 2018 в 14:46

В Java все находится в форме класса.

Если вы хотите использовать любой объект, то у вас есть две фазы:

Объявить инициализацию

Пример:

Объявление: Object a; Инициализация: a=new Object();

То же самое для концепции массива

Объявление: Object a; Инициализация: i[0]=new Item();

Если вы не даете секцию инициализации, возникает NullpointerException.

269
ответ дан 15 August 2018 в 14:46

Что такое исключение NullPointerException?

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

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

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

SynchronizedStatement:
    synchronized ( Expression ) Block
Вызов метода экземпляра нулевого объекта. Доступ или изменение поля нулевого объекта. Принимая длину null, как если бы это был массив. Доступ или изменение слотов с нулевым значением, как если бы это был массив. Бросать нуль, как если бы это было значение Throwable.

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

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

Трассировка, где эти значения должны быть установлены [ ! d30]

Где this.name установлен? В методе setName(String). С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте отладчик , что эти методы вызывают, а метод set не вызывается stacktrace методом печати. ​​

Этого достаточно, чтобы дать нам решение: добавить вызов printer.setName() перед вызовом printer.print().

Другие исправления

Переменная может иметь значение по умолчанию (и setName может помешать ему установить значение null):

private String name = "";

Либо метод print, либо printString может по умолчанию , например:

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();
    }
}

Трассировка, где эти значения должны быть установлены

В противном случае, если значение выражения равно NULL, выдается NullPointerException.

Я все еще не могу найти проблему

Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но убедитесь, что чтобы включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE).

612
ответ дан 15 August 2018 в 14:46

NullPointerException s - это исключения, возникающие при попытке использовать ссылку, указывающую на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Это самые распространенные, но другие способы перечислены на странице NullPointerException javadoc.

Возможно, самым быстрым примером кода, который я мог бы придумать для иллюстрации NullPointerException, было бы:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что в местоположении, на которое указывает ссылка, нет кода.

(Это техничность, но я думаю, что она упоминает: ссылка, указывающая на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает нигде, что отличается от того, что указывает на то место, которое окажется недопустимым.)

757
ответ дан 15 August 2018 в 14:46

Другие вопросы по тегам:

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