Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 70002

Summary: [implementation] NPE while opening the first java editor
Product: [Eclipse Project] Platform Reporter: Sebastian Davids <sdavids>
Component: TextAssignee: Dani Megert <daniel_megert>
Status: VERIFIED FIXED QA Contact:
Severity: critical    
Priority: P2 CC: alexfo2003, cfmdobbie, juergen
Version: 3.0   
Target Milestone: 3.0.1   
Hardware: PC   
OS: Windows 98   
Whiteboard:
Bug Depends on: 70838, 70853    
Bug Blocks:    

Description Sebastian Davids CLA 2004-07-14 06:13:27 EDT
Created an empty class with only a main method in the default package.

!ENTRY org.eclipse.core.runtime 4 2 Jul 14, 2004 12:08:48.540
!MESSAGE Problems occurred when invoking code from plug-in:
"org.eclipse.core.runtime".
!STACK 0
java.lang.NullPointerException
	at
org.eclipse.ui.texteditor.ConfigurationElementSorter$ConfigurationElementComparator.initialize(ConfigurationElementSorter.java:151)
	at
org.eclipse.ui.texteditor.ConfigurationElementSorter$ConfigurationElementComparator.<init>(ConfigurationElementSorter.java:73)
	at
org.eclipse.ui.texteditor.ConfigurationElementSorter.sort(ConfigurationElementSorter.java:51)
	at
org.eclipse.jdt.internal.ui.JavaPlugin.getJavaEditorTextHoverDescriptors(JavaPlugin.java:589)
	at
org.eclipse.jdt.ui.text.JavaSourceViewerConfiguration.getConfiguredTextHoverStateMasks(JavaSourceViewerConfiguration.java:528)
	at org.eclipse.jface.text.source.SourceViewer.configure(SourceViewer.java:351)
	at
org.eclipse.jdt.internal.ui.javaeditor.JavaSourceViewer.configure(JavaSourceViewer.java:173)
	at
org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor$AdaptedSourceViewer.configure(CompilationUnitEditor.java:289)
	at
org.eclipse.ui.texteditor.AbstractTextEditor.createPartControl(AbstractTextEditor.java:2378)
	at
org.eclipse.ui.texteditor.StatusTextEditor.createPartControl(StatusTextEditor.java:53)
	at
org.eclipse.ui.texteditor.AbstractDecoratedTextEditor.createPartControl(AbstractDecoratedTextEditor.java:275)
	at
org.eclipse.jdt.internal.ui.javaeditor.JavaEditor.createPartControl(JavaEditor.java:3314)
	at
org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor.createPartControl(CompilationUnitEditor.java:1604)
	at org.eclipse.ui.internal.PartPane$2.run(PartPane.java:137)
	at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:615)
	at org.eclipse.core.runtime.Platform.run(Platform.java:747)
	at org.eclipse.ui.internal.PartPane.createChildControl(PartPane.java:133)
	at org.eclipse.ui.internal.PartPane.createControl(PartPane.java:205)
	at
org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:939)
	at org.eclipse.ui.internal.PartStack.setSelection(PartStack.java:921)
	at org.eclipse.ui.internal.PartStack.showPart(PartStack.java:1020)
	at org.eclipse.ui.internal.PartStack.add(PartStack.java:290)
	at org.eclipse.ui.internal.EditorStack.add(EditorStack.java:110)
	at
org.eclipse.ui.internal.EditorSashContainer.addEditor(EditorSashContainer.java:59)
	at org.eclipse.ui.internal.EditorAreaHelper.openEditor(EditorAreaHelper.java:266)
	at org.eclipse.ui.internal.EditorManager$4.run(EditorManager.java:697)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
	at org.eclipse.ui.internal.EditorManager.createEditorTab(EditorManager.java:686)
	at org.eclipse.ui.internal.EditorManager.openInternalEditor(EditorManager.java:782)
	at
org.eclipse.ui.internal.EditorManager.openEditorFromDescriptor(EditorManager.java:585)
	at org.eclipse.ui.internal.EditorManager.openEditor(EditorManager.java:573)
	at
org.eclipse.ui.internal.WorkbenchPage.busyOpenEditorBatched(WorkbenchPage.java:2201)
	at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2134)
	at org.eclipse.ui.internal.WorkbenchPage.access$6(WorkbenchPage.java:2126)
	at org.eclipse.ui.internal.WorkbenchPage$9.run(WorkbenchPage.java:2113)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2108)
	at org.eclipse.ui.ide.IDE.openEditor(IDE.java:299)
	at
org.eclipse.jdt.internal.ui.wizards.NewElementWizard$1.run(NewElementWizard.java:63)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:106)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:2749)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2434)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1377)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1348)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:254)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:141)
	at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:96)
	at
org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:335)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:273)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:129)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.core.launcher.Main.basicRun(Main.java:183)
	at org.eclipse.core.launcher.Main.run(Main.java:644)
	at org.eclipse.core.launcher.Main.main(Main.java:628)

!ENTRY org.eclipse.core.runtime 4 2 Jul 14, 2004 12:08:50.20
!MESSAGE Problems occurred when invoking code from plug-in:
"org.eclipse.core.runtime".
!STACK 0
java.lang.ClassCastException
	at
org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.activeJavaEditorChanged(ASTProvider.java:220)
	at
org.eclipse.jdt.internal.ui.javaeditor.ASTProvider.access$0(ASTProvider.java:215)
	at
org.eclipse.jdt.internal.ui.javaeditor.ASTProvider$ActivationListener.partOpened(ASTProvider.java:100)
	at org.eclipse.ui.internal.PartListenerList2$5.run(PartListenerList2.java:101)
	at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:615)
	at org.eclipse.core.runtime.Platform.run(Platform.java:747)
	at
org.eclipse.ui.internal.PartListenerList2.firePartOpened(PartListenerList2.java:99)
	at org.eclipse.ui.internal.WWinPartService$1.partOpened(WWinPartService.java:62)
	at org.eclipse.ui.internal.PartListenerList2$5.run(PartListenerList2.java:101)
	at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:615)
	at org.eclipse.core.runtime.Platform.run(Platform.java:747)
	at
org.eclipse.ui.internal.PartListenerList2.firePartOpened(PartListenerList2.java:99)
	at org.eclipse.ui.internal.WorkbenchPage.firePartOpened(WorkbenchPage.java:1431)
	at org.eclipse.ui.internal.PartPane.createChildControl(PartPane.java:174)
	at org.eclipse.ui.internal.PartPane.createControl(PartPane.java:205)
	at
org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:939)
	at org.eclipse.ui.internal.PartStack.setSelection(PartStack.java:921)
	at org.eclipse.ui.internal.PartStack.showPart(PartStack.java:1020)
	at org.eclipse.ui.internal.PartStack.add(PartStack.java:290)
	at org.eclipse.ui.internal.EditorStack.add(EditorStack.java:110)
	at
org.eclipse.ui.internal.EditorSashContainer.addEditor(EditorSashContainer.java:59)
	at org.eclipse.ui.internal.EditorAreaHelper.openEditor(EditorAreaHelper.java:266)
	at org.eclipse.ui.internal.EditorManager$4.run(EditorManager.java:697)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
	at org.eclipse.ui.internal.EditorManager.createEditorTab(EditorManager.java:686)
	at org.eclipse.ui.internal.EditorManager.openInternalEditor(EditorManager.java:782)
	at
org.eclipse.ui.internal.EditorManager.openEditorFromDescriptor(EditorManager.java:585)
	at org.eclipse.ui.internal.EditorManager.openEditor(EditorManager.java:573)
	at
org.eclipse.ui.internal.WorkbenchPage.busyOpenEditorBatched(WorkbenchPage.java:2201)
	at org.eclipse.ui.internal.WorkbenchPage.busyOpenEditor(WorkbenchPage.java:2134)
	at org.eclipse.ui.internal.WorkbenchPage.access$6(WorkbenchPage.java:2126)
	at org.eclipse.ui.internal.WorkbenchPage$9.run(WorkbenchPage.java:2113)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)
	at org.eclipse.ui.internal.WorkbenchPage.openEditor(WorkbenchPage.java:2108)
	at org.eclipse.ui.ide.IDE.openEditor(IDE.java:299)
	at
org.eclipse.jdt.internal.ui.wizards.NewElementWizard$1.run(NewElementWizard.java:63)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:106)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:2749)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2434)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1377)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1348)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:254)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:141)
	at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:96)
	at
org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:335)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:273)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:129)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.core.launcher.Main.basicRun(Main.java:183)
	at org.eclipse.core.launcher.Main.run(Main.java:644)
	at org.eclipse.core.launcher.Main.main(Main.java:628)

@@@@

Version: 3.0.0
Build id: 200406251208
Comment 1 Dani Megert CLA 2004-07-15 05:11:57 EDT
Which VM do you use? Use -consoleLog -vmargs -showversion
Any additional plug-ins installed?
  If so, which ones? Do you see the error on plain Eclipse SDK?

Is this reproducable?
How did you create the empty class?
Comment 2 Dani Megert CLA 2004-07-15 05:14:01 EDT
Probably related to bug 70004
Comment 3 Sebastian Davids CLA 2004-07-15 07:08:39 EDT
Found the problem :)

@@@@

java version "1.4.2_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-b02)
Java HotSpot(TM) Client VM (build 1.4.2_03-b02, mixed mode)

eclipse.buildId=I200406251208
java.version=1.4.2_03
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=de_DE

@@@@

I installed the eclipse platform SDK.

Afterwards I used the update manager:

Thu Jul 15 12:47:16 CEST 2004 	 file:/c:/WINDOWS/Desktop/x/eclipse/ 
site-install 	success

Thu Jul 15 12:47:44 CEST 2004 	org.eclipse.jdt_3.0.0 	feature-install 	success
Thu Jul 15 12:51:51 CEST 2004 	org.eclipse.jdt_3.0.0 	feature-enable 	success

@@@@

Start with a new -- default -- workspace.

Window/Preferences/Java/Editor/Hovers

Select "Enable anotation roll-over when opening a new editor"

OK.

Close Eclipse

Restart.

Create new Java project.

Create a new Class.

@@@@

The first editor opened will produce the NPE ... all editors afterwards will not.
Comment 4 Sebastian Davids CLA 2004-07-15 07:44:10 EDT
This bug is not reproducible with the complete SDK 3.0 drop.
Comment 5 Sebastian Davids CLA 2004-07-15 07:50:10 EDT
Looking at the source code:

ManifestElement[] manifestElements;
try {
	manifestElements = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE, requires);
} catch (BundleException e) {
	continue;
}
                
int i= 0;
while (i < manifestElements.length && !toTest.isEmpty()) {

@@@@

It is not checked whether manifestElements is null.
ManifestElement.parseHeader() has several cases where it returns null.

so the following lineLooking at the source code:

ManifestElement[] manifestElements;
try {
	manifestElements = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE, requires);
} catch (BundleException e) {
	continue;
}
                
int i= 0;
while (i < manifestElements.length && !toTest.isEmpty()) {

@@@@

It is not checked whether manifestElements is null.
ManifestElement.parseHeader() has several cases where it returns null.

A possible fix would be:



ManifestElement[] manifestElements;
try {
	manifestElements = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE, requires);
} catch (BundleException e) {
	continue;
}

if (manifestElements == null) continue;
                
int i= 0;
while (i < manifestElements.length && !toTest.isEmpty()) {
Comment 6 Sebastian Davids CLA 2004-07-15 07:51:42 EDT
Damn cut'n'paste demon :/
Comment 7 Dani Megert CLA 2004-07-15 11:03:42 EDT
good catch - will try to reproduce
Comment 8 Dani Megert CLA 2004-07-15 11:04:24 EDT
*** Bug 70004 has been marked as a duplicate of this bug. ***
Comment 9 Dani Megert CLA 2004-07-26 13:13:51 EDT
The ClassCastException is a follow-up of the NPE and happens due to bug 70838.

The NPE is caused because manifestElements is null after this code as already
outlined in comment 5:
  try {
    manifestElements = ManifestElement.parseHeader(Constants.REQUIRE_BUNDLE,
requires);
  } catch (BundleException e) {
    continue;
  }

In contrast to other Eclipse APIs this one is specified to return null instead
of an empty array and hence we later fail with the NPE. The code which follows
has to handle null. And we should log the exception.

However, this does still not explain why it fails when using Update/Install but
not when using the Eclipse SDK drop.

Test Case for full Eclipse SDK drop:
Add a org.eclipse.jdt.ui.javaEditorTextHovers extension to a plug-in which has
no prereqs (e.g. org.eclipse.text) and start Eclipse.
Comment 10 Dani Megert CLA 2004-07-26 13:14:12 EDT
OK to fix for 3.0.1
Comment 11 Dani Megert CLA 2004-07-26 15:16:19 EDT
Reproduced the bug using Install/Update. I instrumented
ConfigurationElementSorter to write log info and what I found is that the
following code returns null:

String requires= (String)bundle.getHeaders().get(Constants.REQUIRE_BUNDLE);

i.e. does not find the required plug-ins for the bundles who contribute to the
extension point "org.eclipse.jdt.ui.javaEditorTextHovers":
- org.eclipse.jdt.ui (symbolic bundle name)
- org.eclipse.jdt.debug.ui (symbolic bundle name)

Those plug-ins are there after using Install/Update and also the code can be run
e.g. to open the preferences or create a Java project. 

In my development workspace I then set the PDE target platform to that install
and for some strange reason PDE only lists the Eclipse Platform SDK plug-ins.
Comment 12 Dani Megert CLA 2004-07-27 12:15:17 EDT
Fix in R3_0_maintenance branch.
Will be released into M200407280800
Comment 13 Tom Hofmann CLA 2004-08-10 06:54:35 EDT
*** Bug 71346 has been marked as a duplicate of this bug. ***
Comment 14 Tom Hofmann CLA 2004-08-11 11:31:29 EDT
starting to verify for 3.1
Comment 15 Tom Hofmann CLA 2004-08-11 12:20:10 EDT
verified for 3.1 that the NPE does not occur.
Comment 16 Dani Megert CLA 2004-09-02 04:22:32 EDT
Verified in M200409010800.
Comment 17 Charlie Dobbie CLA 2004-09-04 13:36:59 EDT
Looks good to me as well - 3.1.0 (200408122000)
Comment 18 Dani Megert CLA 2004-09-20 03:09:41 EDT
*** Bug 74179 has been marked as a duplicate of this bug. ***