Android : Android VerifyError when catching an abstract exception in Java anonymous class

on Wednesday, September 3, 2014


I get some strange bug and I would like to understand what happens.


First of all, I am using reflection on fragment objects in Android. To do it, I must catch reflective exceptions.


THIS CODE WORKS:



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";
}


But since all the exceptions are subclasses of ReflectiveOperationException, I can just make one exception handler.


THIS CODE WORKS:



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


This code works when it is a part of a normal Java function. However, things get tricky when I try to use it in an anonymous class.


THIS CODE DOESN'T WORK:



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";
}
}
});


It compiles smoothly, but I get a VerifyError when the app reaches that line.


However, if I don't use ReflectiveOperationException and resort to concrete types, things work again!


THIS CODE WORKS AGAIN:



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";
}
}
});


My question: what is going on? Is it some kind of bug in Java or Android or am I doing something illegal?


0 comments:

Post a Comment