Community
Participate
Working Groups
I met NullPointerException when weaving. Doesn't Aj support this situations? public class TestLib { private static int myInt; static { myInt = 1; } public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("myInt="+myInt); } } public aspect ThreadAspectLib { pointcut setThreadLocalsField():set(private int TestLib.myInt); Integer around():setThreadLocalsField() { try{ return new Integer(2); } catch(Exception e) { e.printStackTrace(); return null; } } } ---- AspectJ Properties --- AspectJ Compiler DEVELOPMENT built on Tuesday Jun 14, 2005 at 15:41:05 GMT ---- Dump Properties --- Dump file: ajcore.20051205.145247.250.txt Dump reason: java.lang.NullPointerException Dump on exception: true Dump at exit condition: abort ---- Exception Information --- java.lang.NullPointerException at org.aspectj.weaver.ResolvedTypeX$Primitive.isAssignableFrom(ResolvedTypeX.java:985) at org.aspectj.weaver.ResolvedTypeX.isAssignableFrom(ResolvedTypeX.java:96) at org.aspectj.weaver.Advice.match(Advice.java:143) at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java:1673) at org.aspectj.weaver.bcel.BcelClassWeaver.matchSetInstruction(BcelClassWeaver.java:1543) at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java(Compiled Code)) at org.aspectj.weaver.bcel.BcelClassWeaver.match(BcelClassWeaver.java(Compiled Code)) at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:377) at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:94) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1362) at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1327) at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1106) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:993) at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.weave(AjCompilerAdapter.java:286) at org.aspectj.ajdt.internal.compiler.AjCompilerAdapter.afterCompiling(AjCompilerAdapter.java:165) at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$afterReturning$org_aspectj_ajdt_internal_compiler_CompilerAdapter$2$f9cc9ca0(CompilerAdapter.aj:70) at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:368) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:727) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.doBuild(AjBuildManager.java:206) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:140) at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:112) at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60) at org.aspectj.tools.ajc.Main.run(Main.java:318) at org.aspectj.tools.ajc.Main.runMain(Main.java:228) at org.aspectj.tools.ant.taskdefs.AjcTask.executeInSameVM(AjcTask.java:1194) at org.aspectj.tools.ant.taskdefs.AjcTask.execute(AjcTask.java:985) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275) at org.apache.tools.ant.Task.perform(Task.java:364) at org.apache.tools.ant.Target.execute(Target.java:341) at org.apache.tools.ant.Target.performTasks(Target.java:369) at org.apache.tools.ant.Project.executeTarget(Project.java:1214) at org.apache.tools.ant.Project.executeTargets(Project.java:1062) at org.apache.tools.ant.Main.runBuild(Main.java:690) at org.apache.tools.ant.Main.startAnt(Main.java:200) at org.apache.tools.ant.launch.Launcher.run(Launcher.java:196) at org.apache.tools.ant.launch.Launcher.main(Launcher.java:55) ---- System Properties --- java.assistive=ON java.runtime.name=Java(TM) 2 Runtime Environment, Standard Edition sun.boot.library.path=C:\Program Files\IBM\Java141\jre\bin java.vm.version=1.4.1 java.vm.vendor=IBM Corporation java.vendor.url=http://www.ibm.com/ path.separator=; java.vm.name=Classic VM file.encoding.pkg=sun.io
You are running on quite an old version of AspectJ. If you compile this program on a more recent build, you won't get an NPE. However, I'm still investigating what does happen - thinking about what the right result is. Are you compiling with the -1.5 flag? Are you expecting autoboxing to allow transformation of int to Integer and vice versa?
through the magic of autoboxing, this probably ought to work ...
Hang on ... from the docs: http://eclipse.org/aspectj/doc/released/progguide/semantics-joinPoints.html Field set When a field is assigned to. Field set join points are considered to have one argument, the value the field is being set to. No value is returned from a field set join point, so its return type is considered to be void. so the advice doesn't match, correctly, with the right message: "incompatible return type applying to field-set(int TestLib.myInt)" However, I checked the related case, where around advice using the boxed form of a primitive matches on a join point returning the unboxed form, and that blew up! So, I've fixed this case and its reverse (the advice uses the unboxed form and join point returns the boxed form). fix checked in.
fix available in aj - will be in AJDT in a few days.