Bug 162478 - NPE in MethodBinding#signature
Summary: NPE in MethodBinding#signature
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.3   Edit
Hardware: PC All
: P3 normal (vote)
Target Milestone: 3.2.2   Edit
Assignee: Kent Johnson CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-10-26 16:23 EDT by John Arthorne CLA
Modified: 2007-02-05 11:35 EST (History)
4 users (show)

See Also:


Attachments
Project to reproduce (154.59 KB, application/x-zip-compressed)
2007-01-05 14:02 EST, Markus Keller CLA
no flags Details
Current version of the patch against HEAD (2.58 KB, patch)
2007-01-08 15:30 EST, Kent Johnson CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description John Arthorne CLA 2006-10-26 16:23:01 EDT
Build: I20061017

I found a few copies of this NPE in my log file.  Unfortunately it happened awhile ago and I don't know what I was editing at the time.

java.lang.NullPointerException
	at org.eclipse.jdt.internal.compiler.lookup.MethodBinding.signature(MethodBinding.java:723)
	at org.eclipse.jdt.internal.compiler.lookup.MethodBinding.computeUniqueKey(MethodBinding.java:323)
	at org.eclipse.jdt.internal.compiler.lookup.Binding.computeUniqueKey(Binding.java:55)
	at org.eclipse.jdt.core.dom.MethodBinding.getKey(MethodBinding.java:326)
	at org.eclipse.jdt.core.dom.DefaultBindingResolver.resolveMethod(DefaultBindingResolver.java:682)
	at org.eclipse.jdt.core.dom.MethodDeclaration.resolveBinding(MethodDeclaration.java:880)
	at org.eclipse.jdt.core.dom.ASTConverter.convert(ASTConverter.java:568)
	at org.eclipse.jdt.core.dom.ASTConverter.buildBodyDeclarations(ASTConverter.java:179)
	at org.eclipse.jdt.core.dom.ASTConverter.convert(ASTConverter.java:2669)
	at org.eclipse.jdt.core.dom.ASTConverter.convert(ASTConverter.java:1249)
	at org.eclipse.jdt.core.dom.AST.convertCompilationUnit(AST.java:270)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.makeConsistent(ReconcileWorkingCopyOperation.java:180)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.executeOperation(ReconcileWorkingCopyOperation.java:85)
	at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:720)
	at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:779)
	at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1132)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy$1.run(JavaReconcilingStrategy.java:97)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:82)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:145)
	at org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy.reconcile(CompositeReconcilingStrategy.java:86)
	at org.eclipse.jdt.internal.ui.text.JavaCompositeReconcilingStrategy.reconcile(JavaCompositeReconcilingStrategy.java:94)
	at org.eclipse.jface.text.reconciler.MonoReconciler.process(MonoReconciler.java:75)
	at org.eclipse.jdt.internal.ui.text.JavaReconciler.process(JavaReconciler.java:343)
	at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:204)
Comment 1 Olivier Thomann CLA 2006-11-01 14:52:05 EST
We should add some tracing for this. This is not the first time it happens, but we have never been able to narrow it down.
Comment 2 Olivier Thomann CLA 2006-11-13 10:17:20 EST
I'll add tracing for this one.
Comment 3 Tod Creasey CLA 2006-11-27 09:52:11 EST
Is this a Vista specific issue?
Comment 4 Markus Keller CLA 2007-01-05 13:23:15 EST
> Is this a Vista specific issue?
No, I got this under XP too.

Trace from HEAD:

Daemon Thread [org.eclipse.jdt.internal.ui.text.JavaReconciler] (Suspended (exception NullPointerException))	
	owns: DefaultBindingResolver  (id=899)	
	owns: Object  (id=900)	
	MethodBinding.signature() line: 751	
	MethodBinding.computeUniqueKey(boolean) line: 324	
	MethodBinding(Binding).computeUniqueKey() line: 55	
	MethodBinding.getKey() line: 326	
	DefaultBindingResolver.resolveMethod(MethodDeclaration) line: 684	
	MethodDeclaration.resolveBinding() line: 880	
	ASTConverter.convert(AbstractMethodDeclaration) line: 568	
	ASTConverter.buildBodyDeclarations(TypeDeclaration, AbstractTypeDeclaration) line: 179	
	ASTConverter.convert(TypeDeclaration) line: 2665	
	ASTConverter.convert(CompilationUnitDeclaration, char[]) line: 1249	
	AST.convertCompilationUnit(int, CompilationUnitDeclaration, char[], Map, boolean, CompilationUnit, IProgressMonitor) line: 270	
	ReconcileWorkingCopyOperation.makeConsistent(CompilationUnit, IProblemRequestor) line: 180	
	ReconcileWorkingCopyOperation.executeOperation() line: 85	
	ReconcileWorkingCopyOperation(JavaModelOperation).run(IProgressMonitor) line: 720	
	ReconcileWorkingCopyOperation(JavaModelOperation).runOperation(IProgressMonitor) line: 779	
	CompilationUnit.reconcile(int, boolean, boolean, WorkingCopyOwner, IProgressMonitor) line: 1151	
	JavaReconcilingStrategy$1.run() line: 97	
	SafeRunner.run(ISafeRunnable) line: 37	
	JavaReconcilingStrategy.reconcile(boolean) line: 82	
	JavaReconcilingStrategy.initialReconcile() line: 172	
	JavaCompositeReconcilingStrategy(CompositeReconcilingStrategy).initialReconcile() line: 114	
	JavaCompositeReconcilingStrategy.initialReconcile() line: 122	
	JavaReconciler(MonoReconciler).initialProcess() line: 103	
	JavaReconciler.initialProcess() line: 332	
	AbstractReconciler$BackgroundThread.run() line: 170	

-------------------------------------
Variable values:
this= MethodBinding  (id=901)	
	declaringClass= SourceTypeBinding  (id=924)	
	modifiers= 33554441	
	parameters= TypeBinding[1]  (id=909)	
		[0]= null	
	returnType= null	
	selector= char[4]  (id=928)	
	signature= null	
	tagBits= 25769803776	
	thrownExceptions= ReferenceBinding[0]  (id=929)	
	typeVariables= TypeVariableBinding[0]  (id=930)	
buffer= StringBuffer  (id=908)	
targetParameters= TypeBinding[1]  (id=909)	
	[0]= null	
isConstructor= false	
needSynthetics= false	
i= 0	

declaringClass is junit.samples.AllTests and selector is "main"
Comment 5 Olivier Thomann CLA 2007-01-05 13:27:02 EST
Kent,

It looks like it is possible to get null in the parameter list.
Might be a timing issue.
Comment 6 Markus Keller CLA 2007-01-05 14:02:57 EST
Created attachment 56483 [details]
Project to reproduce

To reproduce in N20070105-0010, just import the attached project into a clean workspace and then open junit.samples.AllTests from the Package Explorer.

My %PATH% contains "C:\java\jdk1.5.0_10\bin;", therefore the project will not be able to resolve the JRE on its classpath.

I could NOT reproduce in I20061219-1300.

eclipse.buildId=N20070105-0010
java.version=1.5.0_10
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=de_CH
Framework arguments:  -showlocation
Command-line arguments:  -os win32 -ws win32 -arch x86 -data b162478 -clean -consolelog -console -showlocation

Error
Fri Jan 05 19:52:54 CET 2007
Error in JDT Core during reconcile

java.lang.NullPointerException
	at org.eclipse.jdt.internal.compiler.lookup.MethodBinding.signature(MethodBinding.java:751)
	at org.eclipse.jdt.internal.compiler.lookup.MethodBinding.computeUniqueKey(MethodBinding.java:324)
	at org.eclipse.jdt.internal.compiler.lookup.Binding.computeUniqueKey(Binding.java:55)
	at org.eclipse.jdt.core.dom.MethodBinding.getKey(MethodBinding.java:326)
	at org.eclipse.jdt.core.dom.DefaultBindingResolver.resolveMethod(DefaultBindingResolver.java:684)
	at org.eclipse.jdt.core.dom.MethodDeclaration.resolveBinding(MethodDeclaration.java:880)
	at org.eclipse.jdt.core.dom.ASTConverter.convert(ASTConverter.java:568)
	at org.eclipse.jdt.core.dom.ASTConverter.buildBodyDeclarations(ASTConverter.java:179)
	at org.eclipse.jdt.core.dom.ASTConverter.convert(ASTConverter.java:2665)
	at org.eclipse.jdt.core.dom.ASTConverter.convert(ASTConverter.java:1249)
	at org.eclipse.jdt.core.dom.AST.convertCompilationUnit(AST.java:270)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.makeConsistent(ReconcileWorkingCopyOperation.java:180)
	at org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.executeOperation(ReconcileWorkingCopyOperation.java:85)
	at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:720)
	at org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:779)
	at org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1151)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy$1.run(JavaReconcilingStrategy.java:97)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:82)
	at org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.initialReconcile(JavaReconcilingStrategy.java:172)
	at org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy.initialReconcile(CompositeReconcilingStrategy.java:114)
	at org.eclipse.jdt.internal.ui.text.JavaCompositeReconcilingStrategy.initialReconcile(JavaCompositeReconcilingStrategy.java:122)
	at org.eclipse.jface.text.reconciler.MonoReconciler.initialProcess(MonoReconciler.java:103)
	at org.eclipse.jdt.internal.ui.text.JavaReconciler.initialProcess(JavaReconciler.java:332)
	at org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:170)
Comment 7 Markus Keller CLA 2007-01-05 14:04:59 EST
Bug 125837 looks like a dup; bug 96306 and bug 106755 maybe too.
Comment 8 Tod Creasey CLA 2007-01-05 15:03:47 EST
Lets take the Vista OS off then.
Comment 9 Kent Johnson CLA 2007-01-08 15:30:19 EST
Created attachment 56585 [details]
Current version of the patch against HEAD

This bug has been around for quite a while, but does not show up in normal compilation.

From Markus's testcase, if java.lang.String cannot be found, then the reconciler has problems because the CompilationUnit being processed is unknown when String cannot be found (AbortCompilation is thrown and not caught when no unit is set).

The method's parameter[] has already been set to a new TypeBinding[1], which causes the null to pop up later when the binding is examined.

The proposed patch does 2 things to prevent this error:

1. It sets the method's parameter array if no problems are detected, otherwise its set to Binding.NO_PARAMETERS.

2. The patch also sets the compilation unit being processed by the reconciler in the Compiler method resolve(), so the AbortCompilation will not be thrown in this case.

This is a good candidate for 3.2.2.
Comment 10 Kent Johnson CLA 2007-01-08 15:31:35 EST
Philippe - should be release this fix for 3.2.2 ?
Comment 11 Philipe Mulet CLA 2007-01-09 03:47:48 EST
+1 for 3.2.2
Comment 12 Kent Johnson CLA 2007-01-09 10:52:37 EST
Added to ASTConverter15Test.test0197()

Released for 3.3 M5 in HEAD stream

Released for 3.2.2 in R3_2_maintenance stream
Comment 13 Frederic Fusier CLA 2007-01-16 04:57:32 EST
Verified for 3.2.2 using build M20070112-1200.
Comment 14 Olivier Thomann CLA 2007-02-05 11:35:02 EST
Verified for 3.3M5 using I20070205-0009.