Résumé des exceptions courantes dans le développement Android


Dans notre développement, nous rencontrerons inévitablement diverses exceptions. Enregistrez et résumez à nouveau, j'espère que cela vous sera utile qui vous passera.

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

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不可在进行遍历时添加或移除其中的元素。

Analyse du code source : il existe une variable membre modCount dans la classe parent AbstractList de ArrayList pour enregistrer le nombre de modifications apportées à la liste, et un expectedModCount pour enregistrer la valeur attendue du nombre de modifications apportées à ArrayList, modCount est sa valeur initiale.

Au début de la traversée, modCount et expectedModCount sont à 0, et lorsque nous ajoutons ou supprimons la liste pendant la traversée, modCount augmentera de 1, et le expectedModCount restera inchangé.
Et List vérifiera d'abord si modCount et expectedModCount sont égaux lors de l'extraction de la valeur suivante via la méthode next (). S'ils ne sont pas égaux, une exception ConcurrentModificationException sera lancée.

Solution monothread: utilisez Iterator pour parcourir la collection, appelez la méthode Remove d'Iterator pour supprimer des éléments, et il y a une opération attendueModCount = modCount à l'intérieur.

Solution multithread : l'utilisation de la méthode ci-dessus en multithread lèvera également cette exception. Vous pouvez utiliser synchronized ou Lock pour synchroniser lors de l'utilisation de l'itération d'itérateur, ou utiliser CopyOnWriteArrayList pour remplacer ArrayList.

Résumé
L'ajout et la suppression d'éléments de collection dans la boucle for nécessitent une attention particulière. Ce qui précède fournit deux solutions pour différentes situations de thread. J'ai ajouté que l'utilisation du schéma d'opération for-- peut également fonctionner normalement.

Exception Android

1. SourceSet avec le nom «main» introuvable

Sous Android, je souhaite tester le code en cours d'exécution, utiliser la méthode principale pour tester certains appels de méthode, constater qu'il ne peut pas être utilisé et signaler l'erreur suivante.
Insérez la description de l'image ici
Solution:
ajoutez un paramètre de configuration au fichier gradle.xml dans le dossier project.idea.

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

Insérez la description de l'image ici

2. IllegalStateException: cette activité a déjà une barre d'action fournie par le décor de la fenêtre

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.
Insérez la description de l'image ici
La traduction du message d'erreur est que la fenêtre de l'activité vous a fourni une ActionBar. Si vous souhaitez utiliser la barre d'outils, vous devez définir windowActionBar = false dans le thème.

La cause de l'exception

  1. Ceci est ma configuration de thème
    Insérez la description de l'image ici
  2. Ceci est la

    barre d’outils de mise en page de mon activité et la barre d’action ne peut pas apparaître dans la même fenêtre, une seule des deux

Solution
Parce que j'ai besoin d'utiliser Toobar, je ne peux supprimer ActionBar.
Utilisez Theme.AppCompat.Light.NoActionBar
Insérez la description de l'image ici

3. java.io.IOException: fin de flux inattendue sur la connexion 196. *******

Ce problème s'est produit lors de la mise à niveau d'Okhttp +. L'exception était due au fait que la connexion entre le client et le serveur n'était pas déconnectée. Cette situation se produira lors de la prochaine demande. Il existe deux solutions à cette situation:

  1. Une fois que le serveur a configuré la demande client avec succès, déconnectez la connexion TCP avec celui-ci
  2. Configurez addHeader ("Connexion", "fermer"). Build (); dans Retroift;
	OkhttpBuild .addNetworkInterceptor(getCacheIntercepter())
 
    private Interceptor getCacheIntercepter() {
    
    
        return chain -> {
    
    
//            Request request = chain.request();
			//上面的屏蔽化成下面一句
            Request request = chain.request().newBuilder().addHeader("Connection", "close").build();

Les deux méthodes ci-dessus sont les méthodes que j'ai trouvées avant la date limite. Si vous avez une meilleure solution, veuillez me contacter.

4. Le code n'affiche pas les valeurs de variable en mode de débogage Android Studio

N'oubliez pas de configurer debuggable = ture dans le fichier build.gradle de l'application. Sinon, vous constaterez que vous ne pouvez pas voir la valeur de variable du point d'arrêt lorsque vous le cassez.
Insérez la description de l'image ici

Pour résumer

Dans le développement Android, nous rencontrerons toujours toutes sortes d'exceptions étranges. L'expérience de développement Android est basée sur la résolution de bogues et la résolution d'exceptions. Lorsque vous maîtrisez la localisation de divers bogues et exceptions, vous pouvez connaître les causes et être efficace Après la solution, félicitations, vous avez fait un autre grand pas vers l'autel du dieu de la technologie.

La rédaction d'un blog n'est pas facile, si vous pensez que l'article est correct, veuillez l'aimer ^ _ ^!

Je suppose que tu aimes

Origine blog.csdn.net/luo_boke/article/details/106349481
conseillé
Classement