Android sdk java lang nullpointerexception

Как понять NullPointerException

Эта простая статья скорее для начинающих разработчиков Java, хотя я нередко вижу и опытных коллег, которые беспомощно глядят на stack trace, сообщающий о NullPointerException (сокращённо NPE), и не могут сделать никаких выводов без отладчика. Разумеется, до NPE своё приложение лучше не доводить: вам помогут null-аннотации, валидация входных параметров и другие способы. Но когда пациент уже болен, надо его лечить, а не капать на мозги, что он ходил зимой без шапки.

Итак, вы узнали, что ваше приложение упало с NPE, и у вас есть только stack trace. Возможно, вам прислал его клиент, или вы сами увидели его в логах. Давайте посмотрим, какие выводы из него можно сделать.

NPE может произойти в трёх случаях:

  1. Его кинули с помощью throw
  2. Кто-то кинул null с помощью throw
  3. Кто-то пытается обратиться по null-ссылке

Во втором и третьем случае message в объекте исключения всегда null, в первом может быть произвольным. К примеру, java.lang.System.setProperty кидает NPE с сообщением «key can’t be null», если вы передали в качестве key null. Если вы каждый входной параметр своих методов проверяете таким же образом и кидаете исключение с понятным сообщением, то вам остаток этой статьи не потребуется.

Обращение по null-ссылке может произойти в следующих случаях:

  1. Вызов нестатического метода класса
  2. Обращение (чтение или запись) к нестатическому полю
  3. Обращение (чтение или запись) к элементу массива
  4. Чтение length у массива
  5. Неявный вызов метода valueOf при анбоксинге (unboxing)

Важно понимать, что эти случаи должны произойти именно в той строчке, на которой заканчивается stack trace, а не где-либо ещё.

Рассмотрим такой код:

Откуда-то был вызван метод handle с какими-то параметрами, и вы получили:

В чём причина исключения — в f, d или d.val? Нетрудно заметить, что f в этой строке вообще не читается, так как метод format статический. Конечно, обращаться к статическому методу через экземпляр класса плохо, но такой код встречается (мог, например, появиться после рефакторинга). Так или иначе значение f не может быть причиной исключения. Если бы d был не null, а d.val — null, тогда бы исключение возникло уже внутри метода format (в девятой строчке). Аналогично проблема не могла быть внутри метода getValue, даже если бы он был сложнее. Раз исключение в пятнадцатой строчке, остаётся одна возможная причина: null в параметре d.

Вот другой пример:

Снова вызываем метод handle и получаем

Теперь метод format нестатический, и f вполне может быть источником ошибки. Зато s не может быть ни под каким соусом: в девятой строке уже было обращение к s. Если бы s было null, исключение бы случилось в девятой строке. Просмотр логики кода перед исключением довольно часто помогает отбросить некоторые варианты.

С логикой, конечно, надо быть внимательным. Предположим, условие в девятой строчке было бы написано так:

Читайте также:  Наэкранный геймпад для андроид

Теперь в самой строчке обращения к полям и методам s нету, а метод equals корректно обрабатывает null, возвращая false, поэтому в таком случае ошибку в двенадцатой строке мог вызвать как f, так и s. Анализируя вышестоящий код, уточняйте в документации или исходниках, как используемые методы и конструкции реагируют на null. Оператор конкатенации строк +, к примеру, никогда не вызывает NPE.

Вот такой код (здесь может играть роль версия Java, я использую Oracle JDK 1.7.0.45):

Вызываем метод dump, получаем такое исключение:

В параметре pw не может быть null, иначе нам не удалось бы войти в метод print. Возможно, null в obj? Легко проверить, что pw.print(null) выводит строку «null» без всяких исключений. Пойдём с конца. Исключение случилось здесь:

В строке 473 возможна только одна причина NPE: обращение к методу length строки s. Значит, s содержит null. Как так могло получиться? Поднимемся по стеку выше:

В метод write передаётся результат вызова метода String.valueOf. В каком случае он может вернуть null?

Единственный возможный вариант — obj не null, но obj.toString() вернул null. Значит, ошибку надо искать в переопределённом методе toString() нашего объекта MyObject. Заметьте, в stack trace MyObject вообще не фигурировал, но проблема именно там. Такой несложный анализ может сэкономить кучу времени на попытки воспроизвести ситуацию в отладчике.

Не стоит забывать и про коварный автобоксинг. Пусть у нас такой код:

И такое исключение:

На первый взгляд единственный вариант — это null в параметре obj. Но следует взглянуть на класс MyContainer:

Мы видим, что getCount() возвращает Integer, который автоматически превращается в int именно в третьей строке TestNPE.java, а значит, если getCount() вернул null, произойдёт именно такое исключение, которое мы видим. Обнаружив класс, подобный классу MyContainer, посмотрите в истории системы контроля версий, кто его автор, и насыпьте ему крошек под одеяло.

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

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

Источник

Null Pointer Exception Class

Definition

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Thrown when an application attempts to use null in a case where an object is required.

Remarks

Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.

Constructors

Constructs a NullPointerException with no detail message.

A constructor used when creating managed representations of JNI objects; called by the runtime.

Constructs a NullPointerException with no detail message.

Fields

Properties

Returns the cause of this throwable or null if the cause is nonexistent or unknown.

(Inherited from Throwable) Class (Inherited from Throwable) Handle

The handle to the underlying Android instance.

(Inherited from Throwable) JniIdentityHashCode (Inherited from Throwable) JniPeerMembers LocalizedMessage

Creates a localized description of this throwable.

(Inherited from Throwable) Message

Returns the detail message string of this throwable.

Читайте также:  Виджет битрикс 24 андроид

(Inherited from Throwable) PeerReference (Inherited from Throwable) StackTrace (Inherited from Throwable) ThresholdClass

This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.

This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.

Methods

Appends the specified exception to the exceptions that were suppressed in order to deliver this exception.

(Inherited from Throwable) Dispose() (Inherited from Throwable) Dispose(Boolean) (Inherited from Throwable) FillInStackTrace()

Fills in the execution stack trace.

(Inherited from Throwable) GetStackTrace()

Provides programmatic access to the stack trace information printed by #printStackTrace() .

(Inherited from Throwable) GetSuppressed()

Returns an array containing all of the exceptions that were suppressed, typically by the try -with-resources statement, in order to deliver this exception.

(Inherited from Throwable) InitCause(Throwable)

Initializes the cause of this throwable to the specified value.

(Inherited from Throwable) PrintStackTrace()

Prints this throwable and its backtrace to the standard error stream.

(Inherited from Throwable) PrintStackTrace(PrintStream)

Prints this throwable and its backtrace to the standard error stream.

(Inherited from Throwable) PrintStackTrace(PrintWriter)

Prints this throwable and its backtrace to the standard error stream.

(Inherited from Throwable) SetHandle(IntPtr, JniHandleOwnership)

Sets the Handle property.

(Inherited from Throwable) SetStackTrace(StackTraceElement[])

Sets the stack trace elements that will be returned by #getStackTrace() and printed by #printStackTrace() and related methods.

(Inherited from Throwable) ToString() (Inherited from Throwable) UnregisterFromRuntime() (Inherited from Throwable)

Explicit Interface Implementations

IJavaPeerable.Disposed() (Inherited from Throwable)
IJavaPeerable.DisposeUnlessReferenced() (Inherited from Throwable)
IJavaPeerable.Finalized() (Inherited from Throwable)
IJavaPeerable.JniManagedPeerState (Inherited from Throwable)
IJavaPeerable.SetJniIdentityHashCode(Int32) (Inherited from Throwable)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) (Inherited from Throwable)
IJavaPeerable.SetPeerReference(JniObjectReference) (Inherited from Throwable)

Extension Methods

Performs an Android runtime-checked type conversion.

Источник

Gradle sync failed: java.lang.NullPointerException when syncing in Android Studio #656

Comments

quarryman commented Sep 6, 2019 •

  • [x ] @sentry/react-native
  • react-native-sentry

react-native version: 0.59.3

I have following issue:

Description goes here .

Steps to reproduce:

  • add @sentry/react-native to package.json
  • npm i
  • npx jetify (for AndroidX support)
  • generate sentry.properties for android and add credentials
  • add next code to settings.gradle
    include ‘:@sentry/react-native’ project(‘:@sentry/react-native’).projectDir = new File(rootProject.projectDir, ‘../node_modules/@sentry/react-native/android’)

Actual result:

  • Gradle sync failed: java.lang.NullPointerException when syncing in Android Studio

Expected result:

  • Successful sync in Android studio

If I implement full linking process, result is the same. It breaks after adding those lines and never changes further

The text was updated successfully, but these errors were encountered:

bhollander-root commented Sep 30, 2019

I believe I am having this issue as well. I am on react-native version 0.59.9 and I have not been able to successfully sync Gradle since we updated from react-native-sentry .

I found the following NullPointerException stacktrace in the Android Studio logs:

HazAT commented Oct 2, 2019

I am not entirely sure this has to do with our SDK, starting a clean react-native init project doesn’t have this error, therefore, it most likely has something to do with your project setup.
Can you provide a minimal repro case for this since I suppose you cannot share you project to debug it?!

Читайте также:  Getsee для андроид apk

bhollander-root commented Oct 2, 2019 •

@HazAT Thank you for taking the time to troubleshoot this with me.

I was able to reproduce this issue by making the following changes after running react-native init in order to recreate our project’s configuration:

  1. In package.json , set the react version to 16.8.3 and react-native to 0.59.9
  2. On the command line, run yarn add @sentry/react-native
  3. Open the Android project in Android Studio
  4. Open settings.gradle and replace the lines below rootProject.name with the following:
  1. Open File -> Project Structure in Android Studio
  2. Set Gradle Plugin Version to 3.3.1 and Gradle Version to 4.10.3
  3. Click File -> Sync Project with Gradle Files

HazAT commented Oct 8, 2019 •

@bhollander-root Thanks for the repro.
Why are you replacing these lines in the first place in settings.gradle ?
For a react-native init app the content looks something like this:

Our docs might be completly out of sync here.

Источник

Устранение неполадок java.lang.NullPointerException в упражнении для Android SDK

В настоящее время я просматриваю Sams, изучая Android SDK в течение 24 часов и не могу пройти первый час из-за проблем.

Как я уже упоминал ранее, я прочитал все предложения, которые я смог найти в папке с ошибкой папки, и я сделал чистую версию без сборки, я удалил ген, а затем сделал сборку, я установил разрешения для этого чтобы он был доступен только для чтения и удостоверился, что версия SDK отмечена в соответствии с параметром пути Java Build на свойствах проектов.

Это чистая установка eclipse и Androids SDK, и я внимательно следил за инструкциями.

В дополнение к этому, я нахожу, что Eclipse/Androids SDK нестабилен, например, двойной щелчок на файле strings.xml заставляет затмение блокироваться, а затем я должен перезагрузиться или завершить работу. Когда и когда я доберусь до экрана Android Resources для файла strings.xml, я получаю эту ошибку:

Пожалуйста, помогите кому-нибудь помочь, поскольку я действительно хочу выучить этот язык, но на данный момент не получаю больше, чем привет мир!.

Райан благодарит за ваш ответ. Когда я впервые установил eclipse, он был на 3.5. С помощью adk это не устанавливается через eclipse для установки нового программного обеспечения через меню окна в eclipse?

Книга довольно актуальна, поскольку она говорит об 2.1 Android, и я следил за googles и инструкциями из книги и не вижу различий. Когда я впервые установил это все, я выполнил инструкции googles, и я ударил проблему сборки. Java и заблокировал ее. Затем я решил установить его снова с нуля и, следуя книге, загрузил eclipse IDE java ee разработчиков

Майку – не то, что я заметил, ты не считаешь, что это вирус?

Последний вопрос по этому вопросу – я установил версию 3.5 non EE, и, хотя я больше не получаю ошибки в построении, я по-прежнему обнаруживаю, что интерфейс eclipse иногда зависает.

Я думаю, что проблема, с которой я столкнулась с eclipse и т.д., была моей программой A/V Kaspersky, так как смена этого, похоже, не вызывает никаких проблем.

Спасибо за каждый вклад в это.

Если вы импортируете проекты make файла напрямую, произойдет ошибка “NullPoint Exception”, правильным способом будет: сначала создать проект make файла, а затем скопировать ваши файлы во вновь созданный проект. Постройте его.

Источник

Оцените статью