Resumen de excepciones comunes en el desarrollo de Android


En nuestro desarrollo, inevitablemente encontraremos varias Excepciones. Registre y resuma nuevamente, espero que sea de ayuda para ustedes que están de paso.

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

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

Análisis de código fuente : hay una variable miembro modCount en la clase principal AbstractList de ArrayList para registrar el número de modificaciones en la Lista, y un valor esperado de ModCount para registrar el valor esperado del número de modificaciones en ArrayList, modCount es su valor inicial.

Al comienzo del recorrido, tanto modCount como esperabaModCount son 0, y cuando agregamos o eliminamos la Lista durante el recorrido, modCount aumentará en 1 y el valor esperadoModCount permanece sin cambios.
Y List primero verificará si modCount ypectedModCount son iguales al obtener el siguiente valor a través del método next (). Si no son iguales, se lanzará una ConcurrentModificationException.

Solución de un solo subproceso : use Iterator para recorrer la colección, llame al método Remove de Iterator para eliminar elementos, y hay una operación de esperabaModCount = modCount dentro.

Solución de subprocesos múltiples : el uso del método anterior en subprocesos múltiples también arrojará esta excepción. Puede usar sincronizado o Bloquear para sincronizar cuando se usa la iteración del iterador, o usar CopyOnWriteArrayList para reemplazar ArrayList.

Resumen
La adición y eliminación de elementos de la colección en el bucle for requiere atención especial. Lo anterior proporciona dos soluciones para diferentes situaciones de subprocesos. Agregué que el uso del esquema de operación for-- también puede funcionar normalmente.

Excepción de Android

1. No se ha encontrado el SourceSet con el nombre "main"

En Android, quiero probar el código que se está ejecutando, usar el método principal para probar algunas llamadas al método y encontrar que no se puede usar e informar el siguiente error.
Inserte la descripción de la imagen aquí
Solución:
agregue un parámetro de configuración al archivo gradle.xml en la carpeta project.idea.

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

Inserte la descripción de la imagen aquí

2. IllegalStateException: esta actividad ya tiene una barra de acción proporcionada por la decoración de la ventana

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.
Inserte la descripción de la imagen aquí
La traducción del mensaje de error es que la ventana de la actividad le ha proporcionado una barra de acciones. Si desea utilizar la barra de herramientas, debe establecer windowActionBar = false en el tema.

La causa de la excepción

  1. Esta es la configuración de mi tema
    Inserte la descripción de la imagen aquí
  2. Esta es la

    barra de herramientas de diseño de mi actividad y actionBar no puede aparecer en la misma ventana, solo una de las dos

Solución
Como necesito utilizar Toobar, solo puedo eliminar ActionBar.
Utilice Theme.AppCompat.Light.NoActionBar
Inserte la descripción de la imagen aquí

3. java.io.IOException: final inesperado de la transmisión en Connection 196. *******

Este problema se encontró en Okhttp + retrofit. La excepción fue causada por el hecho de que la conexión entre el cliente y el servidor no se desconectó. Esta situación ocurrirá en la próxima solicitud. Hay dos soluciones para esta situación:

  1. Después de que el servidor configure correctamente la solicitud del cliente, desconecte la conexión TCP con él
  2. Configure addHeader ("Conexión", "cerrar"). Build (); en Retroift;
	OkhttpBuild .addNetworkInterceptor(getCacheIntercepter())
 
    private Interceptor getCacheIntercepter() {
    
    
        return chain -> {
    
    
//            Request request = chain.request();
			//上面的屏蔽化成下面一句
            Request request = chain.request().newBuilder().addHeader("Connection", "close").build();

Los dos métodos anteriores son los que encontré antes de la fecha límite. Si tiene una mejor solución, comuníquese conmigo.

4. El código no muestra valores variables en el modo de depuración de Android Studio

No olvide configurar debuggable = ture en el archivo build.gradle de la aplicación. De lo contrario, encontrará que no puede ver el valor de la variable del punto de interrupción cuando lo rompe.
Inserte la descripción de la imagen aquí

para resumir

En el desarrollo de Android, siempre encontraremos todo tipo de excepciones extrañas. La experiencia de desarrollo de Android se basa en la resolución de errores y la resolución de excepciones. Cuando dominas la localización de varios errores y excepciones, puedes conocer las causas y las excepciones. Tras la solución, enhorabuena, has dado otro gran paso hacia el altar del dios de la tecnología.

Escribir un blog no es fácil, si crees que el artículo está bien, ¡dale me gusta ^ _ ^!

Supongo que te gusta

Origin blog.csdn.net/luo_boke/article/details/106349481
Recomendado
Clasificación