NullPointerException in setMaxStack()

"Eduardo Guerra" <[email protected]> Fri, 18 Apr 2008 14:37:43 -0300
Newsgroups gmane.comp.jakarta.bcel.user
Message-ID <[email protected]>
Hi!

I'm trying to put some code for log each line of code: There is the code:

ClassParser cp = new ClassParser(new
ByteArrayInputStream(classFileBuffer),className+".java");
			
JavaClass jc = cp.parse();
ClassGen cg = new ClassGen(jc);
InstructionFactory factory = new InstructionFactory(cg);
ConstantPoolGen cpg = new ConstantPoolGen(jc.getConstantPool());
		
ObjectType pStream = new ObjectType("java.io.PrintStream");
		
for(int i = 0; i < cg.getMethods().length; i++){
		MethodGen mg = new MethodGen(cg.getMethods()[i], jc.getClassName(), cpg);
		InstructionList il = mg.getInstructionList();
				
		for(LineNumberGen lng : mg.getLineNumbers()){
			InstructionHandle ih = lng.getInstruction();
			ih = il.append(ih,factory.createFieldAccess("java.lang.System",
"out", pStream, Constants.GETSTATIC));
			ih = il.append(ih,new PUSH(cpg,"Classe "+jc.getClassName()+ "
metodo " + cg.getMethods()[i].getName() +  " linha " +
lng.getSourceLine()));
			ih = il.append(ih,factory.createInvoke("java.io.PrintStream",
"println", Type.VOID, new Type[]{Type.STRING},
Constants.INVOKEVIRTUAL));
		}
				
		mg.setInstructionList(il);
		mg.setMaxStack();
		mg.setMaxLocals();
		cg.replaceMethod(cg.getMethods()[i], mg.getMethod());
	}
			
cg.setConstantPool(cpg);	
JavaClass newClass = cg.getJavaClass();
			
return newClass.getBytes();


For some methods, the setMaxStack() throws NullPointerException with
this stacktrace:

java.lang.NullPointerException
	at org.apache.bcel.generic.FieldOrMethod.getSignature(FieldOrMethod.java:54)
	at org.apache.bcel.generic.FieldInstruction.getFieldType(FieldInstruction.java:71)
	at org.apache.bcel.generic.FieldInstruction.getType(FieldInstruction.java:64)
	at org.apache.bcel.generic.FieldInstruction.getFieldSize(FieldInstruction.java:57)
	at org.apache.bcel.generic.GETSTATIC.produceStack(GETSTATIC.java:47)
	at org.apache.bcel.generic.MethodGen.getMaxStack(MethodGen.java:928)
	at org.apache.bcel.generic.MethodGen.setMaxStack(MethodGen.java:814)
	at teste.IntrumentatorAdaptor.transform(IntrumentatorAdaptor.java:54)
	at sun.instrument.TransformerManager.transform(TransformerManager.java:169)
	at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:365)
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
	at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
	at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)


Thanks in advance for any help!!!

Eduardo Guerra