attempt to get length of null array как исправить
Простенький файловый менеджер. Он исправно работает на других апи. А на апи 27 ошибка. Вот кусочек лога, где указывается на ошибку.
И сам кусок кода: ругается на первую строку
Вот весь метод целиком, тут инициализируется files
я ошибся, не работает так же и на апи 24. На 19 работает. Продебажил, посмотрел в чем разница и вот результат.
здесь files получается null.
здесь files: File[33]@831435427480.
Я подумал, что может директория «/» в новых апи не воспринимается как корневая. И создал
но f.listFiles() мне снова вернул null. Теперь думаю, я должен быть убежден, что дело не в отсутствии такой директории или доступа к ней. Разрешение на запись на флешку в манифесте есть. На запись в внутреннюю память или на её чтение, разрешения не требуются.
1 ответ 1
Теперь разрешения написанные в манифесте, требуются не перед установкой, а во время работы приложения. Нужно какое то разрешение, спрашиваешь у пользователя (его ответ запоминается, но он в настройках приложения может отозвать разрешение в любой момент, т.е. теперь стоит учитывать это и менять поведение приложения, быть готовым к отказу). Так же и для ваших приложений написанных ранее, для Api ниже 23: пользователь андроид 6 уже может отозвать любое разрешение и у таких приложений. В общем это всё грамотно расписано в документации.
Парочку таких методов:
и в нужный мне момент вызываю
и теперь listFiles(); мне больше не возвращает null, так как я получил разрешение, но надо менять код и подготовить к тому, что делать если разрешение не будет получено.
Как исправить ошибку java.lang.nullpointerexception?
В этом посте я покажу наглядный пример того, как исправить ошибку исключения Null Pointer (java.lang.nullpointerexception). В Java особое значение null может быть назначено для ссылки на объект и означает, что объект в данный момент указывает неизвестную область данных.
NullPointerException появляется, если программа обращается или получает доступ к объекту, а ссылка на него равна нулю (null).
Это исключение возникает следующих случаях:
NullPointerException является RuntimeException, и, таким образом, компилятор Javac не заставляет вас использовать блок try-catch для соответствующей обработки.
Зачем нам нужно значение null?
Как уже упоминалось, null — это специальное значение, используемое в Java. Это чрезвычайно полезно при кодировании некоторых шаблонов проектирования, таких как Null Object pattern и шаблон Singleton pattern.
Шаблон Singleton обеспечивает создание только одного экземпляра класса, а также направлен на предоставление глобального доступа к объекту.
Например, простой способ создания не более одного экземпляра класса — объявить все его конструкторы как частные, а затем создать открытый метод, который возвращает уникальный экземпляр класса:
В этом примере мы объявляем статический экземпляр класса Singleton. Этот экземпляр инициализируется не более одного раза внутри метода getInstance.
Обратите внимание на использование нулевого значения, которое разрешает создание уникального экземпляра.
Как избежать исключения Null Pointer
Чтобы решить и избежать исключения NullPointerException, убедитесь, что все ваши объекты инициализированы должным образом, прежде чем использовать их.
Когда вы объявляете ссылочную переменную, вы должны создать указатель на объект и убедиться, что указатель не является нулевым, прежде чем запрашивать метод или поле у объекта.
Кроме того, если выдается исключение, используйте информацию, находящуюся в трассировке стека исключения. Трассировка стека выполнения обеспечивается JVM, чтобы включить отладку. Найдите метод и строку, в которой было обнаружено исключение, а затем выясните, какая ссылка равна нулю в этой конкретной строке.
Опишем некоторые методы, которые имеют дело с вышеупомянутым исключением. Однако они не устраняют проблему, и программист всегда должен быть осторожен.
Очень распространенный случай, выполнения программы включает сравнение между строковой переменной и литералом. Литерал может быть строкой или элементом Enum.
Вместо того, чтобы вызывать метод из нулевого объекта, рассмотрите возможность вызова его из литерала. Например:
Приведенный выше фрагмент кода вызовет исключение NullPointerException. Однако, если мы вызываем метод из литерала, поток выполнения продолжается нормально:
Перед выполнением вашего собственного метода обязательно проверьте его аргументы на наличие нулевых значений.
В противном случае вы можете вызвать исключение IllegalArgumentException.
Когда код вашей программы требует строковое представление объекта, избегайте использования метода toString объекта. Если ссылка вашего объекта равна нулю, генерируется исключение NullPointerException.
Вместо этого рассмотрите возможность использования статического метода String.valueOf, который не выдает никаких исключений и «ноль», если аргумент функции равен нулю.
Ternary Operator — может быть очень полезным. Оператор имеет вид:
Сначала вычисляется логическое выражение. Если выражение true, то возвращается значение1, в противном случае возвращается значение2. Мы можем использовать Ternary Operator для обработки нулевых указателей следующим образом:
Переменная message будет пустой, если ссылка str равна нулю. В противном случае, если str указывает на фактические данные, в сообщении будут первые 10 символов.
Очень хорошая техника — создавать методы, которые возвращают пустую коллекцию вместо нулевого значения. Код вашего приложения может перебирать пустую коллекцию и использовать ее методы и поля. Например:
Apache’s Commons Lang – это библиотека, которая предоставляет вспомогательные утилиты для API java.lang, такие как методы манипулирования строками.
Примером класса, который обеспечивает манипулирование String, является StringUtils.java, который спокойно обрабатывает входные строки с нулевым значением.
Вы можете воспользоваться методами: StringUtils.isNotEmpty, StringUtils.IsEmpty и StringUtils.equals, чтобы избежать NullPointerException. Например:
Если в коде вашего приложения используется Maps, рассмотрите возможность использования методов contains, containsKey и containsValue. Например, получить значение определенного ключа после того, как вы проверили его существование на карте:
System.out.println(value.toString()); // В приведенном выше фрагменте мы не проверяем, существует ли на самом деле ключ внутри карты, и поэтому возвращаемое значение может быть нулевым. Самый безопасный способ следующий:
На практике очень часто используются внешние библиотеки. Эти библиотеки содержат методы, которые возвращают ссылку. Убедитесь, что возвращаемая ссылка не пуста.
Утверждения очень полезны при тестировании вашего кода и могут использоваться, чтобы избежать выполнения фрагментов кода. Утверждения Java реализуются с помощью ключевого слова assert и выдают AssertionError.
Примером использования утверждений Java является такая версия кода:
Если вы выполните приведенный выше фрагмент кода и передадите пустой аргумент getLength, появится следующее сообщение об ошибке:
Exception in thread «main» java.lang.AssertionError
Также вы можете использовать класс Assert предоставленный средой тестирования jUnit.
Модульные тесты могут быть чрезвычайно полезны при тестировании функциональности и правильности вашего кода. Уделите некоторое время написанию пары тестовых примеров, которые подтверждают, что исключение NullPointerException не возникает.
Существующие безопасные методы NullPointerException
Доступ к статическим членам или методам класса
Когда ваш вы пытаетесь получить доступ к статической переменной или методу класса, даже если ссылка на объект равна нулю, JVM не выдает исключение.
Это связано с тем, что компилятор Java хранит статические методы и поля в специальном месте во время процедуры компиляции. Статические поля и методы связаны не с объектами, а с именем класса.
Несмотря на тот факт, что экземпляр SampleClass равен нулю, метод будет выполнен правильно. Однако, когда речь идет о статических методах или полях, лучше обращаться к ним статическим способом, например, SampleClass.printMessage ().
Оператор instanceof
Оператор instanceof может использоваться, даже если ссылка на объект равна нулю.
Оператор instanceof возвращает false, когда ссылка равна нулю.
В результате, как и ожидалось:
Not an instance of the String class!
Смотрите видео, чтобы стало понятнее.
Средняя оценка / 5. Количество голосов:
Или поделись статьей
Видим, что вы не нашли ответ на свой вопрос.
java.lang.NullPointerException: Attempt to get length of null array on some Huawei devices #1505
Comments
coolguy001tv commented Jan 22, 2019
Steps to Reproduce
1.crash log shows this error
Expected Behavior
Actual Behavior
crashed, here’s the log:
Environment
react-native-code-push version:4.0.0-beta
react-native version:0.46.0 (I know it’s so old, we’re trying updating)
iOS/Android/Windows version: android
Does this reproduce on a debug build or release build? release
Does this reproduce on a simulator, or only on a physical device? physical device
Other Info
Actually there is a similar issue here #1458
which is not solved but closed.
This happens on a HuaWei Mate20 phone.
It is occasionally happened and I got no such a cellphone, so I cann’t reproduct it.
According to the log above, it seems that the deleteFileOrFolderSilently should be responsible for the crash.
https://github.com/Microsoft/react-native-code-push/blob/3144c916018fab077231e88d8718ad3a1cb0a7d8/android/app/src/main/java/com/microsoft/codepush/react/FileUtils.java#L74-L75
It seems that files is null? According to file.listFiles doc, this func should return An array of abstract pathnames denoting the files and directories in the directory denoted by this abstract pathname. The array will be empty if the directory is empty. Returns null if this abstract pathname does not denote a directory, or if an I/O error occurs.
So, an I/O error occurs?
The text was updated successfully, but these errors were encountered:
We are unable to convert the task to an issue at this time. Please try again.
The issue was successfully created but we are unable to update the comment at this time.
