Сводка исключения
В процессе разработки мы неизбежно встретим различные исключения. Записывайте и резюмируйте еще раз, надеюсь, это будет полезно для вас, проходящих мимо.
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 в теме.
Причина исключения
- Это моя конфигурация темы
- Это
панель инструментов макета моего действия, и панель действий не может отображаться в одном окне, только одно из двух
Решение
Поскольку мне нужно использовать Toobar, я могу удалить только ActionBar.
Используйте Theme.AppCompat.Light.NoActionBar
3. java.io.IOException: неожиданный конец потока в соединении 196. *******
Эта проблема возникла при модернизации Okhttp +. Исключение было вызвано тем, что соединение между клиентом и сервером не было разорвано. Эта ситуация возникнет в следующем запросе. Есть два решения этой ситуации:
- После того, как сервер успешно настроит клиентский запрос, отключите от него TCP-соединение.
- Настройте 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 основан на устранении ошибок и устранении исключений. Если вы хорошо разбираетесь в поиске различных ошибок и исключений, вы можете знать причины и эффективные После решения, поздравляю, вы сделали еще один большой шаг к алтарю бога технологий.
Писать блог непросто, если вы думаете, что статья хорошая, пожалуйста, понравитесь ^ _ ^!