- Исключение IllegalArgumentException или исключение NullPointerException для параметра Null?
- 1. введение
- 2. Исключение IllegalArgumentException
- 2.1. Это то, Как Javadoc Говорит использовать Его
- 2.2. Он Соответствует Ожиданиям Разработчиков
- 2.3. Другие Аргументы
- 3. Исключение NullPointerException
- 3.1. Это то, Как Javadoc Говорит использовать Его
- 3.2. Это согласуется с API JDK
- 4. Заключение
- Русские Блоги
- Решение для Android «java.lang.IllegalArgumentException: вы не можете начать загрузку для уничтоженного действия»
- Интеллектуальная рекомендация
- Многослойная презентацияViewController Jap
- Распечатать список с конца до головы
- Типы данных и переменные
- Python Daily Practice (4) -идиомы заполняют музыку
- Android java.lang.IllegalArgumentException: служба не зарегистрирована
- 8 ответов
- Причина ?
- Соответствующая ссылка:
- Исправляем 7 распространенных ошибок обработки исключений в Java
- Ошибка 1: объявление java.lang.Exception или java.lang.Throwable
- Используйте конкретные классы
- Ошибка 2: перехват обобщенных исключений
- Ошибка 3: Логирование и проброс исключений
- Регистрируйте исключение там, где вы его обрабатываете
- Ошибка 4: использование исключений для управления потоком
- Ошибка 5: удалить причину возникновения исключения
- Ошибка 6: Обобщение исключений
- Будьте конкретны и сохраняйте причину возникновения исключения.
- Ошибка 7: добавление ненужных преобразований исключений
- Обязательно добавьте информацию
Исключение IllegalArgumentException или исключение NullPointerException для параметра Null?
Изучите вопрос о том, какое исключение следует создавать, когда кто-то передает нулевой параметр одному из наших методов: IllegalArgumentExcpetion или NullPointerException.
Автор: Amy DeGregorio
Дата записи
1. введение
Среди решений, которые мы принимаем при написании наших приложений, многие касаются того, когда создавать исключения и какой тип создавать.
В этом кратком руководстве мы рассмотрим вопрос о том, какое исключение следует создавать, когда кто-то передает параметр null одному из наших методов: IllegalArgumentException или NullPointerException .
Мы рассмотрим эту тему, изучив аргументы обеих сторон.
2. Исключение IllegalArgumentException
Во-первых, давайте рассмотрим аргументы для создания исключения IllegalArgumentException .
Давайте создадим простой метод, который вызывает исключение IllegalArgumentException при передаче null :
Теперь давайте перейдем к аргументам в пользу IllegalArgumentException .
2.1. Это то, Как Javadoc Говорит использовать Его
Когда мы читаем Javadoc для IllegalArgumentException , он говорит, что он предназначен для использования, когда незаконное или неподходящее значение передается методу . Мы можем считать объект null незаконным или неуместным, если наш метод его не ожидает, и это было бы подходящим исключением для нас.
2.2. Он Соответствует Ожиданиям Разработчиков
Далее давайте подумаем о том, как мы, разработчики, думаем, когда видим следы стека в наших приложениях. Очень распространенным сценарием, в котором мы получаем исключение NullPointerException , является случайная попытка доступа к объекту null . В этом случае мы собираемся проникнуть как можно глубже в стек, чтобы увидеть, на что мы ссылаемся, это null .
Когда мы получаем исключение IllegalArgumentException , мы, скорее всего, предположим, что передаем методу что-то неправильное. В этом случае мы поищем в стеке самый нижний метод, который мы вызываем, и начнем отладку оттуда. Если мы рассмотрим этот способ мышления, исключение IllegalArgumentException приведет нас в наш стек ближе к тому месту, где была допущена ошибка.
2.3. Другие Аргументы
Прежде чем перейти к аргументам в пользу NullPointerException , давайте рассмотрим несколько небольших моментов в пользу IllegalArgumentException . Некоторые разработчики считают, что только JDK должен выбрасывать NullPointerException . Как мы увидим в следующем разделе, Javadoc не поддерживает эту теорию. Другой аргумент заключается в том, что более последовательно использовать IllegalArgumentException , поскольку это то, что мы использовали бы для других незаконных значений параметров.
3. Исключение NullPointerException
Далее рассмотрим аргументы для NullPointerException .
Давайте создадим пример, который вызывает исключение NullPointerException :
3.1. Это то, Как Javadoc Говорит использовать Его
Согласно Javadoc для NullPointerException , NullPointerException предназначено для использования при попытке использовать null там, где требуется объект . Если наш параметр метода не предназначен для null , то мы могли бы разумно рассматривать это как требуемый объект и выбросить исключение NullPointerException .
3.2. Это согласуется с API JDK
Давайте на минутку задумаемся о многих распространенных методах JDK, которые мы вызываем во время разработки. Многие из них бросают NullPointerException , если мы предоставляем null . Кроме того, Objects.requireNonNull() вызывает исключение |/NullPointerException , если мы передаем null. Согласно документации Objects , он существует в основном для проверки параметров.
В дополнение к методам JDK , которые выбрасывают NullPointerException , мы можем найти другие примеры конкретных типов исключений, выбрасываемых из методов в API коллекций. ArrayList.addAll(индекс, коллекция) создает исключение IndexOutOfBoundsException , если индекс находится за пределами размера списка, и создает исключение NullPointerException , если коллекция null . Существует два очень специфических типа исключений, а не более общий IllegalArgumentException .
Мы могли бы рассмотреть IllegalArgumentException предназначен для случаев, когда у нас нет более конкретного типа исключения, доступного нам.
4. Заключение
Как мы видели в этом уроке, это вопрос, на который нет четкого ответа. Документация по этим двум исключениям, по-видимому, пересекается в том, что, когда они взяты отдельно, они оба звучат уместно. Существуют также дополнительные убедительные аргументы для обеих сторон, основанные на том, как разработчики выполняют отладку, и на шаблонах, наблюдаемых в самих методах JDK.
Какое бы исключение мы ни выбрали, мы должны быть последовательны на протяжении всего нашего приложения. Кроме того, мы можем сделать наши исключения более полезными, предоставив конструктору исключений значимую информацию. Например, наши приложения будет легче отлаживать, если мы предоставим имя параметра в сообщении об исключении.
Как всегда, пример кода доступен на GitHub .
Источник
Русские Блоги
Решение для Android «java.lang.IllegalArgumentException: вы не можете начать загрузку для уничтоженного действия»
Недавно в списке ошибок, собранном Youmeng, была проблема, которая вызвала сбой многих пользователей. Согласно сообщению об ошибке, это происходит из-за сбоя, который возникает, когда элемент управления каруселью изображений com.youth.banner использует Glide для асинхронной загрузки изображений. Во время разработки и тестирования эта проблема не возникала. Без лишних слов сообщение об ошибке было проанализировано напрямую.
1. Сначала посмотрите дневник аварии:
2. В соответствии с сообщением об ошибке найдите местоположение кода, в котором произошла флэшбэк:
3. Журнал трассировки находится в том месте, где вызывается Glide, и появляется в методе RequestManagerRetriever.assertNotDestroyed ():
4. Эта ошибка при использовании Glide для асинхронной загрузки изображений, действие было уничтожено.
5. Зная причину ошибки, давайте взглянем на решение ниже:
5.1) Перед использованием Glide для загрузки изображения определите, является ли действие уничтоженным:
5.2). Заменить не в том месте:
6. Здесь проблема решена.
Ниже приведена общедоступная учетная запись (longxuanzhigu), и статьи, опубликованные позже, будут синхронизированы с общедоступной учетной записью для облегчения общения и изучения знаний Android. Добро пожаловать, обратите внимание:
Интеллектуальная рекомендация
Многослойная презентацияViewController Jap
. Недавно, проект использует многоэтажные прыжки [A presentViewController: B animated: YES] [B presentViewController: C animated: YES] . Проблема в том, где: как это идет прямо к? Я не нашел ме.
Распечатать список с конца до головы
В случае, когда таблица цепи не может изменять дисплей, данные хранения стека могут рассматриваться с рекурсивным методом. Разрешить модификацию структуры ссылки.
Типы данных и переменные
тип данных Компьютерная программа может обрабатывать различные значения. Однако компьютеры могут обрабатывать гораздо больше, чем числовые значения. Они также могут обрабатывать различные данные, таки.
Python Daily Practice (4) -идиомы заполняют музыку
оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.
Источник
Android java.lang.IllegalArgumentException: служба не зарегистрирована
У меня есть установка, которая выглядит примерно так:
Однако время от времени я все еще вижу ошибку в заголовке: java.lang.IllegalArgumentException: Service not registered генерируется при вызове unbindService() . Я упустил что-то глупое или что-то еще происходит? Я должен отметить, что может существовать несколько таких фрагментов.
Поскольку на самом деле кажется, что никто не читает код, позвольте мне объяснить. unbindService() не вызывает Context.unbindService(ServiceConnection) , если служба не привязана ( mBound ) и она не вызывалась ранее до того, как обратный вызов onServiceDisconnected(. ) был получен из возможный предыдущий вызов unbindService() .
Имея это в виду, есть ли случаи, когда Android отвяжет вашу службу для вас так, что служба станет несвязанной, но onServiceDisconnected не будет вызываться, что оставит меня в устаревшем состоянии?
Кроме того, я использую контекст своего приложения для начальной привязки. Предположим что-то вроде:
8 ответов
Я понимаю, что на этот вопрос уже дан ответ. Но я думаю, что есть причина выяснить, почему люди совершают эту ошибку.
Проблема действительно в учебной документации. http://developer.android.com/reference/android/app/Service.html показывает правильную реализацию, а https://developer.android.com/ guide / components / bound-services.html в ActivityMessenger показывает очень НЕПРАВИЛЬНУЮ реализацию.
В примере ActivityMessenger onStop () потенциально может быть вызван до фактического связывания службы.
Причина этой путаницы в том, что они используют логическое значение связанной службы для обозначения разных вещей в разных примерах. (в основном, был вызван bindService () ИЛИ действительно ли служба подключена)
В правильных примерах, где unbind () выполняется на основе значения связанного логического значения, связанное логическое значение указывает, что была вызвана bindService () . Поскольку он поставлен в очередь для выполнения основного потока, необходимо вызвать unbindService () (поэтому он поставлен в очередь для выполнения), независимо от того, когда (если когда-либо) произойдет onServiceConnected ().
В других примерах, например, в http://developer.android.com/ ссылка / android / app / Service.html. Граница указывает, что Службы фактически связаны, так что вы можете использовать их и не получать исключение NullPointerException. Обратите внимание, что в этом примере вызов unbindService () все еще выполняется, а связанное логическое значение не определяет, следует ли отменять привязку .
Используйте mIsBound внутри doBindService() и doUnbindService() вместо экземпляра ServiceConnection .
java.lang.IllegalArgumentException: Service not registered означает, что вы не были привязаны к обслуживанию, когда был вызван unbindService() .
Итак, в вашем случае onSomeEvent() никогда не вызывался до вызова unbindService() в onPause()
Другой возможной причиной этого исключения может быть то, что unbindService вызывается неправильным Context . Поскольку службы могут быть связаны не только действиями, но и другими экземплярами, унаследованными от Context (за исключением BroadcastReceivers), даже другими службами, убедитесь, что unbindService вызывается контекстом, имеющим ограничивает Service , а не саму границу Service . Это приведет непосредственно к вышеуказанному исключению «Служба не зарегистрирована».
Причина ?
Если в вашей деятельности unbindService () вызывается перед bindService (), вы получите это IllegalArgumentException .
Как этого избежать?
Это просто. Вам не понадобится логический флаг, если вы привязываете и отключаете службу в этом порядке.
Привязать onStart() и отвязать onStop()
Решение 2.
Привязать onCreate() и отвязать onDestroy()
Соответствующая ссылка:
Официальная документация Android предполагает, что
Если вам нужно взаимодействовать со службой только тогда, когда ваша активность видна , выберите Решение1 .
Если вы хотите, чтобы на ваше действие приходили ответы, даже когда оно остановлено в фоновом режиме , выберите Решение2 .
В моем случае я вызвал bindService с помощью Activity Context и попытался отвязать его с помощью ApplicationContext . Не делай этого.
У меня точно такая же проблема с моим приложением. Время от времени я получаю IllegalArgumentException . Я предполагаю, что особый случай возникает, когда служба не связана и onPause вызывается до onServiceDisconnected . Так что я бы попробовал Synchronized кое-что, чтобы гарантировать правильное выполнение.
Источник
Исправляем 7 распространенных ошибок обработки исключений в Java
Привет, Хабр! Представляю вашему вниманию перевод статьи Fixing 7 Common Java Exception Handling Mistakes автора Thorben Janssen.
Обработка исключения является одной из наиболее распространенных, но не обязательно одной из самых простых задач. Это все еще одна из часто обсуждаемых тем в опытных командах, и есть несколько передовых методов и распространенных ошибок, о которых вы должны знать.
Вот несколько вещей, которые следует избегать при обработке исключений в вашем приложении.
Ошибка 1: объявление java.lang.Exception или java.lang.Throwable
Как вы уже знаете, вам нужно либо объявить, либо обработать проверяемое исключение. Но проверяемые исключения — это не единственные, которые вы можете указать. Вы можете использовать любой подкласс java.lang.Throwable в предложении throws. Таким образом, вместо указания двух разных исключений, которые выбрасывает следующий фрагмент кода, вы можете просто использовать исключение java.lang.Exception в предложении throws.
Но это не значит, что вы должны это сделать. Указание Exeption или Throwable делает почти невозможным правильное обращение с ними при вызове вашего метода.Единственная информация, которую получает вызывающий вами метод, заключается в том, что что-то может пойти не так. Но вы не делитесь какой-либо информацией о каких-либо исключительных событиях, которые могут произойти. Вы скрываете эту информацию за обобщенными причинами выброса исключений.Становится еще хуже, когда ваше приложение меняется со временем. Выброс обобщенных исключений скрывает все изменения исключений, которые вызывающий должен ожидать и обрабатывать. Это может привести к нескольким непредвиденным ошибкам, которые необходимо найти в тестовом примере вместо ошибки компилятора.
Используйте конкретные классы
Гораздо лучше указать наиболее конкретные классы исключений, даже если вам приходится использовать несколько из них. Это сообщает вызывающему устройству, какие исключительные событий нужно обрабатывать. Это также позволяет вам обновить предложение throw, когда ваш метод выдает дополнительное исключение. Таким образом, ваши клиенты знают об изменениях и даже получают ошибку, если вы изменяете выбрасываемые исключения. Такое исключение намного проще найти и обработать, чем исключение, которое появляется только при запуске конкретного тестового примера.
Ошибка 2: перехват обобщенных исключений
Серьезность этой ошибки зависит от того, какой программный компонент вы реализуете, и где вы обнаруживаете исключение. Возможно, было бы хорошо поймать java.lang.Exception в основном методе вашего приложения Java SE. Но вы должны предпочесть поймать определенные исключения, если вы реализуете библиотеку или работаете над более глубокими слоями вашего приложения.
Это дает несколько преимуществ. Такой подход позволяет обрабатывать каждый класс исключений по-разному и не позволяет вам перехватывать исключения, которых вы не ожидали.
Но имейте в виду, что первый блок catch, который обрабатывает класс исключения или один из его супер-классов, поймает его. Поэтому сначала обязательно поймайте наиболее специфический класс. В противном случае ваши IDE покажут сообщение об ошибке или предупреждении о недостижимом блоке кода.
Ошибка 3: Логирование и проброс исключений
Это одна из самых популярных ошибок при обработке исключений Java. Может показаться логичным регистрировать исключение там, где оно было брошено, а затем пробросить его вызывающему объекту, который может реализовать конкретную обработку для конкретного случая использования. Но вы не должны делать это по трем причинам:
1. У вас недостаточно информации о прецеденте, который хочет реализовать вызывающий объект вашего метода. Исключение может быть частью ожидаемого поведения и обрабатываться клиентом. В этом случае нет необходимости регистрировать его. Это добавит ложное сообщение об ошибке в файл журнала, который должен быть отфильтрован вашей операционной группой.
2. Сообщение журнала не предоставляет никакой информации, которая еще не является частью самого исключения. Его трассировка и трассировка стека должны содержать всю необходимую информацию об исключительном событии. Сообщение описывает это, а трассировка стека содержит подробную информацию о классе, методе и строке, в которой она произошла.
3. Вы можете регистрировать одно и то же исключение несколько раз, когда вы регистрируете его в каждом блоке catch, который его ловит. Это испортит статистику в вашем инструменте мониторинга и затрудняет чтение файла журнала для ваших операций и команды разработчиков.
Регистрируйте исключение там, где вы его обрабатываете
Таким образом, лучше всего регистрировать исключение тогда, когда вы его обрабатываете. Как в следующем фрагменте кода. Метод doSomething генерирует исключение. Метод doMore просто указывает его, потому что у разработчика недостаточно информации для его обработки. Затем он обрабатывается в методе doEvenMore, который также записывает сообщение журнала.
Ошибка 4: использование исключений для управления потоком
Использование исключений для управления потоком вашего приложения считается анти-шаблоном по двум основным причинам:
Они в основном работают как оператор Go To, потому что они отменяют выполнение блока кода и переходят к первому блоку catch, который обрабатывает исключение. Это делает код очень трудным для чтения.
Они не так эффективны, как общие структуры управления Java. Как видно из названия, вы должны использовать их только для исключительных событий, а JVM не оптимизирует их так же, как и другой код.Таким образом, лучше использовать правильные условия, чтобы разбить свои циклы или инструкции if-else, чтобы решить, какие блоки кода должны быть выполнены.
Ошибка 5: удалить причину возникновения исключения
Иногда вам может понадобиться обернуть одно исключение в другое. Возможно, ваша команда решила использовать специальное исключение для бизнеса с кодами ошибок и единой обработкой. Нет ничего плохого в этом подходе, если вы не устраните причину.
Когда вы создаете новое исключение, вы всегда должны устанавливать первоначальное исключение в качестве причины. В противном случае вы потеряете трассировку сообщения и стека, которые описывают исключительное событие, вызвавшее ваше исключение. Класс Exception и все его подклассы предоставляют несколько методов-конструкторов, которые принимают исходное исключение в качестве параметра и задают его как причину.
Ошибка 6: Обобщение исключений
Когда вы обобщаете исключение, вы ловите конкретный, например, NumberFormatException, и вместо этого генерируете неспецифическое java.lang.Exception. Это похоже, но даже хуже, чем первая ошибка, которую я описал в этой статье. Он не только скрывает информацию о конкретном случае ошибки на вашем API, но также затрудняет доступ.
Как вы можете видеть в следующем фрагменте кода, даже если вы знаете, какие исключения может вызвать метод, вы не можете просто их поймать. Вам нужно поймать общий класс Exception и затем проверить тип его причины. Этот код не только громоздкий для реализации, но его также трудно читать. Становится еще хуже, если вы сочетаете этот подход с ошибкой 5. Это удаляет всю информацию об исключительном событии.
Итак, какой подход лучший?
Будьте конкретны и сохраняйте причину возникновения исключения.
Исключения, которые вы бросаете, должны всегда быть максимально конкретными. И если вы оборачиваете исключение, вы также должны установить исходный исключение в качестве причины, чтобы не потерять трассировку стека и другую информацию, описывающую исключительное событие.
Ошибка 7: добавление ненужных преобразований исключений
Как я уже объяснял ранее, может быть полезно обернуть исключения в пользовательские, если вы установите исходное исключение в качестве причины. Но некоторые архитекторы переусердствуют и вводят специальный класс исключений для каждого архитектурного уровня. Таким образом, они улавливают исключение в уровне персистентности и переносят его в MyPersistenceException. Бизнес-уровень ловит и обертывает его в MyBusinessException, и это продолжается до тех пор, пока оно не достигнет уровня API или не будет обработано.
Легко видеть, что эти дополнительные классы исключений не дают никаких преимуществ. Они просто вводят дополнительные слои, которые оборачивают исключение. И хотя было бы забавно обернуть подарок во множестве красочной бумаги, это не очень хороший подход к разработке программного обеспечения.
Обязательно добавьте информацию
Просто подумайте о коде, который должен обрабатывать исключение или о самом себе, когда вам нужно найти проблему, вызвавшую исключение. Сначала вам нужно прорваться через несколько уровней исключений, чтобы найти исходную причину. И до сегодняшнего дня я никогда не видел приложение, которое использовало этот подход, и добавляло полезную информацию с каждым слоем исключения. Они либо обобщают сообщение об ошибке и код, либо предоставляют избыточную информацию.
Поэтому будьте осторожны с количеством настраиваемых классов исключений, которые вы вводите. Вы всегда должны спрашивать себя, дает ли новый класс исключений дополнительную информацию или другие преимущества. В большинстве случаев для достижения этого вам не требуется более одного уровня пользовательских исключений.
Источник