CheckClassAdapter requires non-null ClassVisitor that returns non-null MethodVisitor
Given
CheckClassAdapter adapter = new CheckClassAdapter(null);
exactly as in CheckClassAdapterTest
adapter.visit(Opcodes.V1_8, 0, "class", null, "java/lang/Object", null);
adapter.visitField(0, "field", "I", null, null);
works, however
MethodVisitor mv = adapter.visitMethod(0, "method", "()V", null, null);
mv.visitCode();
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(0, 1);
mv.visitEnd();
throws
java.lang.NullPointerException
at org.objectweb.asm.tree.MethodNode.accept(MethodNode.java:783)
at org.objectweb.asm.util.CheckMethodAdapter$1.visitEnd(CheckMethodAdapter.java:460)
at org.objectweb.asm.MethodVisitor.visitEnd(MethodVisitor.java:778)
at org.objectweb.asm.util.CheckMethodAdapter.visitEnd(CheckMethodAdapter.java:1059)
same happens with
CheckClassAdapter adapter = new CheckClassAdapter(new ClassVisitor(Opcodes.ASM7, null) { });
I'm not sure if first usage (null
ClassVisitor
) is valid, however second one seems valid - according to javadoc of ClassVisitor.visitMethod
@return an object to visit the byte code of the method, or {@literal null} if this class visitor is not interested in visiting the code of this method.
ClassVisitor.visitField
also can return null
@return a visitor to visit field annotations and attributes, or {@literal null} if this class visitor is not interested in visiting these annotations and attributes.
So at least there is inconsistency in CheckClassAdapter
in handling of null
s from visitField
and visitMethod
.