为什么 try-catch 无法捕获 NoClassDefFoundError

为什么 try-catch 无法捕获 NoClassDefFoundError public void start(Context context) { try { this.mContext context; QQMusicSDK.INSTANCE.init(context, new QQMusicSDK.SDKConfig()); //播放状态变化 QQMusicSDK.INSTANCE.getService().subscribePlayStatus(playStatusListener); }catch (Exception e){ e.printStackTrace(); LogUtils.e(TAG, e.getMessage()); } }2026-08-24 16:41:26.116 10542-10542 AndroidRuntime pid-10542 E FATAL EXCEPTION: main Process: com.zhx.chaanapp, PID: 10542 java.lang.NoClassDefFoundError: Failed resolution of: Lcom/incall/apps/component/calog/CALog; at com.ca.hmi.qqmusic.opensdk.QQMusicSDK.init(QQMusicSDK.kt:46) at com.zhx.chaanapp.monitor.MusicMonitor.start(MusicMonitor.java:34) at com.zhx.chaanapp.services.CarSignalMonitorService.registerMonitor(CarSignalMonitorService.java:108) at com.zhx.chaanapp.services.CarSignalMonitorService.onCreate(CarSignalMonitorService.java:94) at android.app.ActivityThread.handleCreateService(ActivityThread.java:4692) at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2305) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8226) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:573) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049) Caused by: java.lang.ClassNotFoundException: Didnt find class com.incall.apps.component.calog.CALog on path: DexPathList[[zip file /system/app/ChaanApp/ChaAnApp_1.0.apk],nativeLibraryDirectories[/system/app/ChaanApp/lib/arm64, /system/app/ChaanApp/ChaAnApp_1.0.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64, /system/lib64, /system_ext/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at com.ca.hmi.qqmusic.opensdk.QQMusicSDK.init(QQMusicSDK.kt:46) at com.zhx.chaanapp.monitor.MusicMonitor.start(MusicMonitor.java:34) at com.zhx.chaanapp.services.CarSignalMonitorService.registerMonitor(CarSignalMonitorService.java:108) at com.zhx.chaanapp.services.CarSignalMonitorService.onCreate(CarSignalMonitorService.java:94) at android.app.ActivityThread.handleCreateService(ActivityThread.java:4692) at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2305) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8226) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:573) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)try-catch无法捕获这个异常是因为NoClassDefFoundError是Error的子类而不是Exception的子类。在 Java 中try-catch默认只捕获Exception及其子类包括RuntimeException而Error通常代表严重的系统级问题如类缺失、内存溢出等一般不期望应用层去捕获。修改方法很简单将catch (Exception e)改为catch (Throwable e)因为Throwable是Exception和Error的共同父类这样就能捕获到NoClassDefFoundError了。javapublic void start(Context context) { try { this.mContext context; QQMusicSDK.INSTANCE.init(context, new QQMusicSDK.SDKConfig()); //播放状态变化 QQMusicSDK.INSTANCE.getService().subscribePlayStatus(playStatusListener); } catch (Throwable e) { // 改为 Throwable e.printStackTrace(); LogUtils.e(TAG, e.getMessage()); } }