Android Sync SQLite Database с сервером с использованием PHP и MySQL [dубликат]

Пожалуйста, введите терминал:

sudo killall nautilus && (nautilus &)

Эта ошибка сообщается здесь: Nautilus не запускается

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 в 16:44
  • 1
    операция на неинициализированном объекте на уровне экземпляра (а не на уровне класса) приведет к исключению NullPointerException. операция должна быть конкретной. если операция находится на уровне класса, говоря о вызове статического метода на неинициализированном объекте, тогда он не будет генерировать исключение NullPointerException. Даже примитивные объекты класса-оболочки генерируют исключение NullPointerException. – Shailendra Singh 8 July 2016 в 18:20
  • 2
    1. NullPointerException - это RuntimeException, это означает, что появится, когда ваша программа запущена, вы не будете во время компиляции! :(, но большая часть IDE поможет вам обнаружить это. 2. Сведите к минимуму использование ключевого слова 'null' в операторах присваивания. :) Ссылка url: – tomj0101 4 December 2017 в 09:49
  • 3
    @ tomj0101 Я не совсем понимаю, почему вы сделали этот комментарий ... Но к вашему второму пункту шаблон перед Optional должен был вернуть значение null. Ключевое слово в порядке. Знать, как защищаться от него, крайне важно. Это предлагает одно общее его появление и способы его смягчения. – Makoto 4 December 2017 в 09:54
  • 4
    NullPointerException - это исключение run-time , которое не рекомендуется ловить его, но вместо этого избегать его. – Shomu 29 May 2018 в 13:14
  • 5
    @Shomu: В какой момент я даже предполагаю, что его нужно поймать? – Makoto 29 May 2018 в 16:25

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

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

292
ответ дан 15 August 2018 в 16:44
  • 1
    Создаем ли мы базу данных? - & GT; NULL записывается как null в java. И это дело чувствительное. – bvdb 25 April 2018 в 19:40

В 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 в 16:44

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

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

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

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

315
ответ дан 15 August 2018 в 16:44
  • 1
    Держите это просто, мне нравится этот ответ, добавьте это, если вы считаете правильным - доступ к неинициализированному атрибуту объекта – Emiliano 23 March 2016 в 17:06
  • 2
    @Emiliano - просто доступ к инициализированному атрибуту не вызывает NPE. Это то, что вы & gt; & gt; с неинициализированным значением атрибута, вызывающим NPE. – Stephen C 19 May 2016 в 09:57
  • 3
    Это из docs.oracle.com/javase/8/docs/api/java/lang/… . -1 для цитирования без ссылки. – Dominique Unruh 18 September 2016 в 20:07
  • 4
    Если вам нужно больше случаев: 1) используя null в качестве цели блока synchronized, 2), используя null в качестве цели для switch и unboxing null. – Stephen C 23 October 2017 в 13:16

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

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

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 в 16:44
  • 1
    Хотя это хороший пример, могу ли я спросить, что он добавляет к вопросу, который еще не охвачен всеми другими ответами? – Mysticial 24 September 2013 в 11:20
  • 2
    Просто нецелесообразно использовать слово «неинициализированный». Вот. Пример, который вы показали, фактически «инициализирован» и инициализирован нулевым значением. Для неинициализированных переменных компилятор вам будет жаловаться. – Adrian Shum 24 September 2013 в 11:32
  • 3
    NPE может быть индикатором того, что вы используете неинициализированное поле. Это может быть индикатором того, что вы делаете другие вещи. Упрощение к одной причине, подобной этой, не помогает кому-то решить проблемы NPE ... если фактическая причина не та. – Stephen C 27 May 2015 в 16:35

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

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

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

best practices

Используйте модификатор final для обеспечения хорошей инициализации. Избегайте возвращать null в методах, например, возвращая пустые коллекции, если это применимо. Использовать аннотации @NotNull и @Nullable Быстрое сбой и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, если они не должны быть пустыми. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject) Предпочитают valueOf() поверх toString (). Использовать нулевые методы StringUtils StringUtils.isEmpty(null).
280
ответ дан 15 August 2018 в 16:44
  • 1
    В проектах j2ee исключение Nullpointer очень распространено. Некоторые ссылочные переменные случаев получили нулевые значения. Поэтому вы должны проверить правильность инициализации правильно. И во время условного оператора вы всегда должны проверить, что флаг или ссылка содержит нуль или не нравится: - if (flag! = 0) {ur код, который использует флаг} – Amaresh Pattanayak 17 April 2015 в 15:58
  • 2
    Стоит отметить, что некоторые IDE (например, Eclipse) предлагают автоматический анализ неопределенности на основе настраиваемых аннотаций (например, @Nullable, как указано выше) и предупреждают о потенциальных ошибках. Также можно вывести и создать такие аннотации (например, IntelliJ может это сделать) на основе существующей структуры кода. – Jan Chimiak 5 March 2016 в 14:34
  • 3
    Прежде всего, нужно использовать объект с нулевым значением, вы должны проверить, является ли он нулевым, используя if (obj==null). Если он равен нулю, тогда вы также должны написать код для обработки. – Lakmal Vithanage 17 February 2017 в 10:52
  • 4
    IMO, предпочтительнее избегать возврата нулевых объектов в методах, когда это возможно, и использовать аннотацию, когда пустые входные параметры не разрешены, чтобы по контракту уменьшить количество'if (obj == null) 'в коде и улучшить читаемость кода. – L. G. 27 February 2017 в 13:43
  • 5
    Прочтите это ... прежде чем принимать эти «лучшие практики». как истина: satisfice.com/blog/archives/27 – Stephen C 21 May 2017 в 10:52

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

TypeA objA;

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

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

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

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

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

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

Пример:

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

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

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

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

269
ответ дан 15 August 2018 в 16:44
  • 1
    Объявление примитивной переменной, такой как int, в Java не создает объект. – Michael Krause 16 November 2016 в 01:44
  • 2
    Исключение NullPointerException часто возникает при вызове метода экземпляра. Например, если вы объявляете ссылку, но не указываете на какой-либо экземпляр, исключение NullPointerException произойдет, когда вы вызовете его метод. например: YourClass ref = null; // или ref = anotherRef; // но anotherRef не указал ни одного экземпляра ref.someMethod (); // он будет вызывать исключение NullPointerException. Обычно исправляйте это следующим образом: перед вызовом метода определите, является ли ссылка нулевой. например: if (yourRef! = null) {yourRef.someMethod (); } – sunhang 28 July 2017 в 13:25
  • 3
    Или используйте захват исключений, например: try {yourRef.someMethod (); } catch (NullPointerException e) {// TODO} – sunhang 28 July 2017 в 13:25

Что такое исключение 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 в 16:44
  • 1
    +1 Приятно иметь пример, который включает в себя переход через стек; важно показать , почему чтение важно для отладки NPE. (и почему мы почти всегда ищем стек, когда кто-то задает вопрос об ошибке) – Dennis Meng 8 June 2014 в 06:30
  • 2
    Вы упомянули об отладке ... Как это работает? Я уже некоторое время изучаю эту тему, но ничего не могу найти. Я уверен, что такой потрясающий учитель, как вы, может научить меня через секунду! Спасибо! :-) – Ruchir Baronia 10 December 2015 в 11:07
  • 3
    @RuchirBaronia Отладчик позволяет вам переходить через программу по очереди, чтобы узнать, какие методы вызывают и как изменяются переменные. В IDE должны быть некоторые инструменты для этого. См. [D0] vogella.com/tutorials/EclipseDebugging/article.html , например. – fgb 10 December 2015 в 14:22
  • 4
    @RuchirBaronia Вы устанавливаете точки останова для методов вокруг любых NullPointerExceptions, как видно из stacktrace, и проверяете значения переменных на то, что вы ожидаете от них. Если вы знаете, что переменная имеет значение null, когда ее не должно быть, вы можете установить точки останова вокруг любого кода, который изменит значение. Существуют также условные точки останова, которые вы можете использовать, которые скажут вам, когда значение изменится. – fgb 10 December 2015 в 15:33
  • 5
    Установка объектов String в пустую строку в качестве значения по умолчанию считается плохой практикой. – Tiny 27 February 2016 в 06:05

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 в 16:44
  • 1
    Я понял все, что вы там написали, но только потому, что я некоторое время программировал и знаю, что такое «указатель» и «ссылка» (и что такое нуль, если на то пошло). Когда я пытаюсь погрузиться прямо в такие объяснения, мои ученики смотрят на меня, потому что не хватает фона. – mmr 20 February 2009 в 08:06
  • 2
    @mmr: Спасибо за отзывы, вы действуете правильно. В Интернете сложно судить, где кто-то, и на каком уровне можно начать объяснение. Я попробую пересмотреть это снова. – Bill the Lizard 20 February 2009 в 08:32
  • 3
    Более распространенный способ получить исключение NullPointerException на практике - это забыть явно инициализировать переменную-член чем-то, отличное от null, прежде чем использовать его, , как это . С локальными переменными компилятор поймал бы эту ошибку, но в этом случае это не так. Может быть, это послужит полезным дополнением к вашему ответу? – Ilmari Karonen 18 January 2014 в 15:28
  • 4
    @EJP "Нулевой указатель буквально не указывает нигде ... & quot; – Bill the Lizard 13 June 2015 в 06:06
  • 5
    @EJP Это именно то, что указывает этот параграф. – Bill the Lizard 11 August 2015 в 13:59

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

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