Сводка распространенных исключений в разработке под Android


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

Exception子子孙孙无穷尽也,我会不断新增内容补充完整,欢迎收藏,不断回顾

Исключение Java

1. ConcurrentModificationException

List<String> list = new ArrayList<>();
    list.add("di");
    String str = new String("da");
    list.add(str);
    list.add("paint");
    for(String temp : list){
    
    
        if(temp == "di" || temp == "da"){
    
    
            list.remove(temp);
        }
    }
System.out.print(list.toString());

会抛出ConcurrentModificationException异常,List不可在进行遍历时添加或移除其中的元素。

Анализ исходного кода : в родительском классе AbstractList объекта ArrayList имеется переменная-член modCount для записи количества изменений в списке и объект expectedModCount для записи ожидаемого значения количества изменений в ArrayList, modCount - его начальное значение.

В начале обхода как modCount, так и expectedModCount равны 0, и когда мы добавляем или удаляем список во время обхода, modCount увеличивается на 1, а expectedModCount остается неизменным.
И List сначала проверит, равны ли modCount и expectedModCount при получении следующего значения с помощью метода next (). Если они не равны, будет сгенерировано исключение ConcurrentModificationException.

Однопоточное решение : используйте Iterator для обхода коллекции, вызовите метод Remove Iterator для удаления элементов, и внутри будет операция expectedModCount = modCount.

Многопоточное решение : использование вышеупомянутого метода в многопоточности также вызовет это исключение. Вы можете использовать synchronized или Lock для синхронизации при использовании итерации итератора или использовать CopyOnWriteArrayList для замены ArrayList.

Резюме
Добавление и удаление элементов коллекции в цикле for требует особого внимания. Выше приведены два решения для различных ситуаций с потоками. Я добавил, что использование схемы операции for - также может работать нормально.

Исключение Android

1. SourceSet с именем main не найден.

В Android я хочу протестировать запущенный код, использовать основной метод для проверки вызовов некоторых методов и обнаружить, что его нельзя использовать, и сообщить о следующей ошибке.
Вставьте описание изображения сюда
Решение:
добавьте параметр конфигурации в файл gradle.xml в папке project.idea.

   <option name="delegatedBuild" value="false" />

Вставьте описание изображения сюда

2. IllegalStateException: у этого действия уже есть панель действий, предоставленная оформлением окна.

Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
Вставьте описание изображения сюда
Перевод сообщения об ошибке заключается в том, что Window of the Activity предоставил вам ActionBar. Если вы хотите использовать панель инструментов, вам необходимо установить windowActionBar = false в теме.

Причина исключения

  1. Это моя конфигурация темы
    Вставьте описание изображения сюда
  2. Это

    панель инструментов макета моего действия, и панель действий не может отображаться в одном окне, только одно из двух

Решение
Поскольку мне нужно использовать Toobar, я могу удалить только ActionBar.
Используйте Theme.AppCompat.Light.NoActionBar
Вставьте описание изображения сюда

3. java.io.IOException: неожиданный конец потока в соединении 196. *******

Эта проблема возникла при модернизации Okhttp +. Исключение было вызвано тем, что соединение между клиентом и сервером не было разорвано. Эта ситуация возникнет в следующем запросе. Есть два решения этой ситуации:

  1. После того, как сервер успешно настроит клиентский запрос, отключите от него TCP-соединение.
  2. Настройте addHeader («Соединение», «закрыть»). Build (); в Retroift;
	OkhttpBuild .addNetworkInterceptor(getCacheIntercepter())
 
    private Interceptor getCacheIntercepter() {
    
    
        return chain -> {
    
    
//            Request request = chain.request();
			//上面的屏蔽化成下面一句
            Request request = chain.request().newBuilder().addHeader("Connection", "close").build();

Я нашел два указанных выше метода к установленному сроку. Если у вас есть лучшее решение, свяжитесь со мной.

4. Код не отображает значения переменных в режиме отладки Android Studio.

Не забудьте настроить debuggable = ture в файле build.gradle приложения. В противном случае вы обнаружите, что не сможете увидеть значение переменной точки останова, когда нарушите ее.
Вставьте описание изображения сюда

подводить итоги

В разработке под Android мы всегда будем сталкиваться со всевозможными странными исключениями. Опыт разработки под Android основан на устранении ошибок и устранении исключений. Если вы хорошо разбираетесь в поиске различных ошибок и исключений, вы можете знать причины и эффективные После решения, поздравляю, вы сделали еще один большой шаг к алтарю бога технологий.

Писать блог непросто, если вы думаете, что статья хорошая, пожалуйста, понравитесь ^ _ ^!

рекомендация

отblog.csdn.net/luo_boke/article/details/106349481