无法捕获java.lang.VerifyError

时间:2010-01-06 15:44:10

标签: android

我收到此错误: “未捕获的处理程序:由于未捕获的异常java.lang.VerifyError”而导致线程主要退出“

这只发生在1.6。 Android 2.0及以上版本没有任何问题,但这是最重要的一点。

我无法捕获错误/异常(VerifyError),并且我知道它是由调用isInitialStickyBroadcast()引起的,这在SDK 4中不可用,这就是为什么它包含在SDK检查中。我只需要这个BroadcastReceiver工作在2.0+并且不打破1.6,它是市场上的应用程序,对于2.0+以上的用户需要UNDOCK功能,但显然不是1.6,但仍有相当数量的用户仍然在1.6。

如何解决?

谢谢!

private BroadcastReceiver mUndockedReceiver = new BroadcastReceiver()
{
      @Override
      public void onReceive(Context context, Intent intent) 
      {
          //FROM ECLAIR FORWARD, BEFORE DONUT THIS INTENT WAS NOT IMPLEMENTED
          if (Build.VERSION.SDK_INT >= 5)
          {
              if (!isInitialStickyBroadcast()) {
                  int dockState = intent.getExtras().getInt("android.intent.extra.DOCK_STATE", 1);
                  if (dockState == 0)
                  {
                      finish();
                  }
              }
          }           
      }
};  

4 个答案:

答案 0 :(得分:4)

Intent.EXTRA_DOCK_STATE仅存在于API级别5及更高版本中,因此仅适用于Android 2.0设备(或更高版本)。

即使您在API级别检查中包装调用,在Android 1.6运行时运行代码时代码也会失败,因此VerifyError

解决方案是将Intent.EXTRA_DOCK_STATE的调用替换为常量值:android.intent.extra.DOCK_STATE


作为一般规则,在浏览API文档时勾选“按API级别过滤”复选框是个好主意,并在您的情况下将其设置为4。这样,Android 1.6不可用的任何类,方法或常量都会变灰。

答案 1 :(得分:2)

我遇到了类似的问题,但位图缩放在1.5和1.6之间。结束使用与this blog post中提供的解决方案类似的内容,创建一个实用程序类,根据API编号切换代码路径。

在该示例中需要注意的一点是,因为它支持1.5,所以使用android.os.Build.VERSION.SDK已被弃用,但根据Dianne Hackborn(谷歌工程师)的说法,它将在未来的SDK版本中not be removed。如果您只支持1.6及更高版本,则可以使用android.os.Build.VERSION.SDK_INT,但不会弃用。

此外,由于您的目标是1.6,如果您不依赖于该版本的框架,您可能也希望看一下支持1.5,在撰写本文时,1.5 31% of Android devices访问Android Market。

答案 2 :(得分:0)

由于这是一个错误而不是一个例外,它不会扩展Exception。相反,它会扩展Throwable,所以你必须抓住它:

try {

....

} catch ( Throwable e ) {
}

答案 3 :(得分:0)

要捕获错误,您可以执行以下操作。

try {

  // write your code here

    } catch (VerifyError e) {
        // TODO: handle exception
    }