为什么我的Android应用程序强制从java.lang.ExceptionInInitializerError关闭,并且它';What’没有被try/catch块捕获?

为什么我的Android应用程序强制从java.lang.ExceptionInInitializerError关闭,并且它';What’没有被try/catch块捕获?,android,exception,reflection,Android,Exception,Reflection,我使用反射来查看均衡器类是否适用于Android OS 2.3及更高版本,然后使用该类(如果可用)。不过,我会定期收到带有“ExceptionInInitializeError”的崩溃报告。以下是stacktrace: java.lang.ExceptionInInitializerError at java.lang.Class.classForName(Native Method) at java.lang.Class.forName(Class.java:234) at java.lang

我使用反射来查看均衡器类是否适用于Android OS 2.3及更高版本,然后使用该类(如果可用)。不过,我会定期收到带有“ExceptionInInitializeError”的崩溃报告。以下是stacktrace:

java.lang.ExceptionInInitializerError
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:234)
at java.lang.Class.forName(Class.java:181)
at com.myapp.EQ.<init>(SourceFile:16)
at com.myapp.mainAct.onCreate(SourceFile:209)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
at android.app.ActivityThread.access$1500(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1312]: 277 cannot locate '_ZN7android11AudioEffect25queryDefaultPreProcessingEiP19effect_descriptor_sPj'...

at java.lang.Runtime.loadLibrary(Runtime.java:455)
at java.lang.System.loadLibrary(System.java:554)
at android.media.audiofx.AudioEffect.<clinit>(AudioEffect.java:63)
java.lang.ExceptionInInitializeError
位于java.lang.Class.classForName(本机方法)
位于java.lang.Class.forName(Class.java:234)
位于java.lang.Class.forName(Class.java:181)
在com.myapp.EQ(源文件:16)
在com.myapp.mainAct.onCreate上(源文件:209)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)上
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)上
在android.app.ActivityThread.access,售价1500美元(ActivityThread.java:117)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)上
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:130)
位于android.app.ActivityThread.main(ActivityThread.java:3687)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:507)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:842)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
在dalvik.system.NativeStart.main(本机方法)
原因:java.lang.UnsatifiedLink错误:无法加载库:reloc_library[1312]:277找不到“\u zn7android11AudioEffect25QueryDefaultPrefingEIP19Effect_描述符\u sPj”。。。
位于java.lang.Runtime.loadLibrary(Runtime.java:455)
位于java.lang.System.loadLibrary(System.java:554)
在android.media.audiofx.AudioEffect.(AudioEffect.java:63)
下面是引发错误的自定义类:

public class EQ{
    private Class<?> eqClass = null;

    public EQ(){
        if(Build.VERSION.SDK_INT >= 9){
            try {
                eqClass = Class.forName("android.media.audiofx.Equalizer"); 
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
公共类EQ{
私有类eqClass=null;
公共情商(){
如果(Build.VERSION.SDK_INT>=9){
试一试{
eqClass=Class.forName(“android.media.audiofx.Equalizer”);
}捕获(例外e){
e、 printStackTrace();
}
}
}
}
因此,崩溃发生在“Class.forName”行,任何异常都应该被
Catch
块捕获。为什么不是呢


这种情况偶尔发生,在过去的两个月里,我收到了5份不同的车祸报告

java.lang.ExceptionInInitializeError
不是
异常
,因此无法使用
try-catch
块捕获

说它是
错误的子项

相反,尝试捕捉特定类型的错误,如下所示:

catch (java.lang.ExceptionInInitializerError er)

好的,那么我没有办法强制关闭吗?
catch(初始化错误除外)
no-don-catch
Throwable t
这是通用的方法。当捕捉错误时,您实际上应该只捕捉您预测将发生的特定错误。如果由于未知的原因发生了不同的错误,你不能假设一切都正常,无论如何都要抓住它。@slayton我知道,他在开一个(糟糕的)玩笑。嗯。。。我一定是疯了,以为抓住一个例外就能抓住每一个被扔掉的东西!谢谢