在除Android L之外的所有Android版本上获取TypeNotPresentException,然后是ClassNotFoundException或NoClassDefFoundError

时间:2015-02-27 04:21:21

标签: android android-5.0-lollipop noclassdeffounderror classnotfoundexception retrofit

我在其中一个应用中遇到了非常有趣的错误。我的应用程序在android L上工作正常,但是一旦我尝试在其他Android版本上运行它,我在尝试使用Retrofit调用Web服务时得到 ClassNotFoundException或NoClassDefFoundError ,即使所有这些类在我的Android L设备上存在且工作正常。我不知道现在发生了什么,app在其他版本中运行,只要我没有提出网络请求,但只要我去网络请求,它就会给我ClassNotFoundException或NoClassDefFoundError。我也在使用Android Studio,所以如果有人早些时候遇到过这类问题,那么请帮忙,我非常需要。

注意:应用程序在Android L上工作正常,而且我得到ClassNotFoundException或NoClassDefFoundError的类不是特定于版本的,即它们在android L左右不支持它们。我收到这些错误的所有类都是一般的自定义/模型类,并且没有链接到更高版本的Android版本。

这些是我的Logcat错误

这是登录api时的例外

java.lang.TypeNotPresentException: Type com.codebrew.embazaar.pojo.UserLoginPojo not present
            at libcore.reflect.ParameterizedTypeImpl.getRawType(ParameterizedTypeImpl.java:63)
            at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:72)
            at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
            at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
            at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:71)
            at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
            at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
            at libcore.reflect.Types.getTypeArray(Types.java:50)
            at java.lang.reflect.Method.getGenericParameterTypes(Method.java:216)
            at retrofit.RestMethodInfo.parseResponseType(RestMethodInfo.java:250)
            at retrofit.RestMethodInfo.<init>(RestMethodInfo.java:97)
            at retrofit.RestAdapter.getMethodInfo(RestAdapter.java:213)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:236)
            at $Proxy0.userLogin(Native Method)
            at com.codebrew.embazaar.MainActivity.loginUser(MainActivity.java:529)
            at com.codebrew.embazaar.MainActivity.onClick(MainActivity.java:324)
            at android.view.View.performClick(View.java:4748)
            at android.view.View$PerformClick.run(View.java:19535)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5679)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassNotFoundException: com.codebrew.embazaar.pojo.UserLoginPojo
            at java.lang.Class.classForName(Native Method)
            at java.lang.Class.forName(Class.java:251)
            at libcore.reflect.ParameterizedTypeImpl.getRawType(ParameterizedTypeImpl.java:61)
            at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:72)
            at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
            at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
            at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:71)
            at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
            at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
            at libcore.reflect.Types.getTypeArray(Types.java:50)
            at java.lang.reflect.Method.getGenericParameterTypes(Method.java:216)
            at retrofit.RestMethodInfo.parseResponseType(RestMethodInfo.java:250)
            at retrofit.RestMethodInfo.<init>(RestMethodInfo.java:97)
            at retrofit.RestAdapter.getMethodInfo(RestAdapter.java:213)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:236)
            at $Proxy0.userLogin(Native Method)
            at com.codebrew.embazaar.MainActivity.loginUser(MainActivity.java:529)
            at com.codebrew.embazaar.MainActivity.onClick(MainActivity.java:324)
            at android.view.View.performClick(View.java:4748)
            at android.view.View$PerformClick.run(View.java:19535)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5679)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NoClassDefFoundError: com/codebrew/embazaar/pojo/UserLoginPojo
            at java.lang.Class.classForName(Native Method)
            at java.lang.Class.forName(Class.java:251)
            at libcore.reflect.ParameterizedTypeImpl.getRawType(ParameterizedTypeImpl.java:61)
            at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:72)
            at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
            at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
            at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:71)
            at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
            at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
            at libcore.reflect.Types.getTypeArray(Types.java:50)
            at java.lang.reflect.Method.getGenericParameterTypes(Method.java:216)
            at retrofit.RestMethodInfo.parseResponseType(RestMethodInfo.java:250)
            at retrofit.RestMethodInfo.<init>(RestMethodInfo.java:97)
            at retrofit.RestAdapter.getMethodInfo(RestAdapter.java:213)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:236)
            at $Proxy0.userLogin(Native Method)
            at com.codebrew.embazaar.MainActivity.loginUser(MainActivity.java:529)
            at com.codebrew.embazaar.MainActivity.onClick(MainActivity.java:324)
            at android.view.View.performClick(View.java:4748)
            at android.view.View$PerformClick.run(View.java:19535)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5679)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.codebrew.embazaar.pojo.UserLoginPojo" on path: DexPathList[[zip file "/data/app/com.codebrew.embazaar-11.apk"],nativeLibraryDirectories=[/data/app-lib/com.codebrew.embazaar-11, /vendor/lib, /system/lib]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
            at java.lang.Class.classForName(Native Method)
            at java.lang.Class.forName(Class.java:251)
            at libcore.reflect.ParameterizedTypeImpl.getRawType(ParameterizedTypeImpl.java:61)
            at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:72)
            at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
            at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
            at libcore.reflect.ParameterizedTypeImpl.getResolvedType(ParameterizedTypeImpl.java:71)
            at libcore.reflect.ListOfTypes.resolveTypes(ListOfTypes.java:70)
            at libcore.reflect.ListOfTypes.getResolvedTypes(ListOfTypes.java:55)
            at libcore.reflect.Types.getTypeArray(Types.java:50)
            at java.lang.reflect.Method.getGenericParameterTypes(Method.java:216)
            at retrofit.RestMethodInfo.parseResponseType(RestMethodInfo.java:250)
            at retrofit.RestMethodInfo.<init>(RestMethodInfo.java:97)
            at retrofit.RestAdapter.getMethodInfo(RestAdapter.java:213)
            at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:236)
            at $Proxy0.userLogin(Native Method)
            at com.codebrew.embazaar.MainActivity.loginUser(MainActivity.java:529)
            at com.codebrew.embazaar.MainActivity.onClick(MainActivity.java:324)
            at android.view.View.performClick(View.java:4748)
            at android.view.View$PerformClick.run(View.java:19535)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5679)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
            at dalvik.system.NativeStart.main(Native Method)

这是我在忘记密码网络请求时得到的

java.lang.NoClassDefFoundError: com.codebrew.embazaar.MainActivity$7$1
            at com.codebrew.embazaar.MainActivity$7.onClick(MainActivity.java:392)
            at android.view.View.performClick(View.java:4748)
            at android.view.View$PerformClick.run(View.java:19535)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:146)
            at android.app.ActivityThread.main(ActivityThread.java:5679)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
            at dalvik.system.NativeStart.main(Native Method)

**重要提示:当我调试我的代码时,我得到的是TypeNotPresentException,这是一个未经检查的异常,后跟这些ClassNotFoundException或NoClassDefFoundError。我在这里提到这个是因为我认为可能这个问题可以让我对问题/问题有所了解。

以下是我的MainActivity CommonPojogradle file

1 个答案:

答案 0 :(得分:7)

这是因为你有

multiDexEnabled = true
你的gradle文件上的

启用multidex时,必须确保在应用程序启动时加载所有classes.dex文件。否则,它将无法加载不在第一个classes.dex文件中的类。

在Android L中不需要这样做,因为它支持在启动时加载多个dex文件,而不仅仅是一个。

为了实现此目的,您可以尝试以下方法之一:

  • 删除multiDexEnabled = true,但您可能超过65K方法限制。
  • 按照https://developer.android.com/tools/building/multidex.html上的说明操作,特别是添加

    compile 'com.android.support:multidex:1.0.0'
    

    依赖关系,并使您的应用程序对象继承或从MultiDexApplication开始。