java.lang.NoClassDefFoundError(这只是其中的两种情况)

第一种

[crash修复]NoClassDefFoundError:原因:由于导包的时候包名大小写和自己在类里面的时候不一致导致的,找不到,
类com.txznet.music.image.imageLoader.ImageLoaderUtils但是这里面的包是Imageloader(大小写不一致)在release的时候可以正确release出来,但是使用到的时候就出现这样的问题。


java.lang.NoClassDefFoundError: Failed resolution of: Lcom/txznet/music/image/c/a;
    at com.txznet.music.image.ImageFactory.init(Proguard:33)
    at com.txznet.music.image.ImageFactory.(Proguard:25)
    at com.txznet.music.image.ImageFactory.getInstance(Proguard:45)
    at com.txznet.music.utils.PlayerCommunicationManager.sendPlayItemChanged(Proguard:219)
    at com.txznet.music.utils.SyncOtherAppBroadcastListener.onPlayerPreparing(Proguard:22)
    at com.txznet.music.playerModule.logic.PlayerControlManager.notifyOnPreparedListener(Proguard:76)
    at com.txznet.audio.player.RemoteTestAudioPlayer$5.handleMessage(Proguard:504)
    at android.os.Handler.dispatchMessage(Handler.java:111)
    at android.os.Looper.loop(Looper.java:207)
    at android.app.ActivityThread.main(ActivityThread.java:5737)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:834)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:724)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.txznet.music.image.c.a" on path: DexPathList[[zip file "/data/app/com.txznet.music-1/base.apk"],nativeLibraryDirectories=[/data/user/0/com.txznet.music/solibs, /data/user/0/com.txznet.music/solibs, /data/user/0/com.txznet.music/solibs, /data/app/com.txznet.music-1/lib/arm, /data/app/com.txznet.music-1/base.apk!/lib/armeabi-v7a, /data/user/0/com.txznet.music/solibs, /data/user/0/com.txznet.music/solibs, /data/user/0/com.txznet.music/solibs, /vendor/lib, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    ... 13 more
    Suppressed: java.lang.ClassNotFoundException: com.txznet.music.image.c.a
        at java.lang.Class.classForName(Native Method)
        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
        ... 14 more
    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

java.lang.NoClassDefFoundError(这只是其中的两种情况)_第1张图片

在AndroidStudio里面报的错误时:

Error:Error converting bytecode to dex:
Cause: java.lang.RuntimeException: Exception parsing classes
Error:Error converting bytecode to dex:
Cause: java.lang.RuntimeException: Exception parsing classes
Error:Error converting bytecode to dex:
Cause: java.lang.RuntimeException: Exception parsing classes
Error:3 errors; aborting
Error:Execution failed for task ':TXZMusic4.0:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: Return code 1 for dex process

但是使用gradle的assembleRelease的时候,可以正常编译通过,这个让人匪夷所思。

同时如果改掉package的包名为ImageLoder的时候
AndroidStudio才会认为这里出现了异常并提示找不到类

F:\workspace\java\android\projects\rearview_mirror_steady\TXZMusic4.0\src\com\txznet\music\image\ImageFactory.java
Error:(9, 42) 错误: 程序包com.txznet.music.image.imageLoader不存在
Error:(33, 32) 错误: 找不到符号
符号:   类 ImageLoaderUtils
位置: 类 ImageFactory
Error:Execution failed for task ':TXZMusic4.0:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.

此时release也是不可以的也是提示找不到符号。

改成
package com.txznet.music.image.Imageloader;
和包名一致则可以。

第二种

类加载失败

测试代码::::
public class Undef1 {
    public static Undef1 instance = new Undef1();
    private Undef1()
    { 
        throw new NullPointerException(); 
    }
    public static Undef1 getInstance(){
         return instance; 
    }
    public void print(){}
}
public class Undef {
    public static void print(){
        //System.out.println("thread id 0 : " + Thread.currentThread());
        try
        { 
            Undef1.getInstance().print(); 
        }catch(Exception e){ 
            System.out.println("thread id 0 : " + e.toString()); 
        }catch(Error e1){ 
            System.out.println("thread id 0 : " + e1.toString()); 
        }
        try{ 
            Undef1.getInstance().print(); 
        }catch(Exception e){ 
            System.out.println("thread id 1: " + e.toString()); 
        }
    }
}
输出为::
thread id 0 : java.lang.ExceptionInInitializerError
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class com.txznet.testapi.Undef1
at com.txznet.testapi.Undef.print(Undef.java:16)
at com.txznet.testapi.Main.main(Main.java:30)

分析后可得:
第一次调用的时候发生了异常又被捕获了,第二次在调用该类的时候发生的。
猜测在类装载的时候将符号表进行进行存放,第一次调用的时候,尝试进行加载(此时发生错误),则装载器从符号表中删除错误的索引,第二次在调用的时候则会先在符号表中查找,没有则直接抛出这个异常。

你可能感兴趣的:(自己的话)