在Java匿名类中捕获抽象异常时的Android VerifyError

时间:2014-09-03 09:20:59

标签: java android reflection anonymous-class verifyerror

我得到一些奇怪的错误,我想了解会发生什么。

首先,我在Android中使用片段对象的反射。要做到这一点,我必须抓住反思异常。

此代码的工作原理:

try
{
    return (String) MyFragment.class.getMethod("aStaticMethod", new Class[]{MyActivity.class} ).invoke(null, myActivity);
}
catch(NoSuchMethodException e)
{
    return "fail";
}
catch(IllegalAccessException e)
{
    return "fail";
}
catch(InvocationTargetException e)
{
    return "fail";
}

但由于所有异常都是ReflectiveOperationException的子类,我只能创建一个异常处理程序。

此代码的工作原理:

try
{
    return (String) MyFragment.class.getMethod("aStaticMethod", new Class[]{MyActivity.class} ).invoke(null, myActivity);
}
catch(ReflectiveOperationException e)
{
    return "fail";
}

此代码在正常Java函数的一部分时有效。但是,当我尝试在匿名类中使用它时,事情变得棘手。

此代码无效:

viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager())
{
    @Override
    public CharSequence getPageTitle(int i)
    {
        try
        {
            return (String) MyFragment.class.getMethod("aStaticMethod", new Class[]{MyActivity.class} ).invoke(null, myActivity);
        }
        catch(ReflectiveOperationException e)
        {
            return "fail";
        }
    }
});

它可以顺利编译,但是当应用程序到达该行时,我会收到VerifyError。

但是,如果我不使用ReflectiveOperationException并求助于具体类型,那么事情就会再次发挥作用!

此代码再次工作:

viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager())
{
    @Override
    public CharSequence getPageTitle(int i)
    {
        try
        {
            return (String) MyFragment.class.getMethod("aStaticMethod", new Class[]{MyActivity.class} ).invoke(null, myActivity);
        }
        catch(NoSuchMethodException e)
        {
            return "fail";
        }
        catch(IllegalAccessException e)
        {
            return "fail";
        }
        catch(InvocationTargetException e)
        {
            return "fail";
        }
    }
});

我的问题:发生了什么事?是Java或Android中的某种错误还是我做了非法的事情?

1 个答案:

答案 0 :(得分:0)

在API 19(KitKat)中添加了

ReflectiveOperationException,在API 19之前使用它会导致VerifyError,因为该类不存在