Bug 213427 - EFS throws NullPointerException
Summary: EFS throws NullPointerException
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.4   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 3.4 M5   Edit
Assignee: Jerome Lanneluc CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-12-19 04:19 EST by Hans Meier CLA
Modified: 2008-02-05 05:07 EST (History)
5 users (show)

See Also:


Attachments
Proposed fix and regression test (11.24 KB, patch)
2008-01-10 12:53 EST, Jerome Lanneluc CLA
no flags Details | Diff
Simplified fix and same regression test (10.66 KB, patch)
2008-01-11 07:40 EST, Jerome Lanneluc CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Hans Meier CLA 2007-12-19 04:19:37 EST
Build ID: I20071213-1700

Steps To Reproduce:
I've installed 3.4M4 and pointed it to my old workspace (which I used for 3.4M3).
Upon startup of eclipse a NullPointerException is reported.


More information:
The log shows these NullPointers:
!ENTRY org.eclipse.core.resources 2 75 2007-12-19 09:49:41.171
!MESSAGE Errors during build.
!SUBENTRY 1 org.eclipse.jdt.core 2 75 2007-12-19 09:49:41.171
!MESSAGE Errors running builder 'Java Builder' on project 'bc-FrwkDev_stream'.
!SUBENTRY 1 org.eclipse.jdt.core 2 75 2007-12-19 09:49:41.171
!MESSAGE java.lang.NullPointerException encountered while running Java Builder.
!STACK 0
java.lang.NullPointerException
	at org.eclipse.core.internal.filesystem.InternalFileSystemCore.getStore(InternalFileSystemCore.java:104)
	at org.eclipse.core.filesystem.EFS.getStore(EFS.java:350)
	at org.eclipse.jdt.internal.core.util.Util.getResourceContentsAsCharArray(Util.java:1048)
	at org.eclipse.jdt.internal.core.util.Util.getResourceContentsAsCharArray(Util.java:1037)
	at org.eclipse.jdt.internal.core.builder.SourceFile.getContents(SourceFile.java:79)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9393)
	at org.eclipse.jdt.internal.compiler.parser.Parser.parse(Parser.java:9365)
	at org.eclipse.jdt.internal.compiler.parser.Parser.dietParse(Parser.java:8027)
	at org.eclipse.jdt.internal.compiler.Compiler.internalBeginToCompile(Compiler.java:587)
	at org.eclipse.jdt.internal.compiler.Compiler.beginToCompile(Compiler.java:357)
	at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:371)
	at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:362)
	at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:175)
	at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:326)
	at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:59)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:253)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:177)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:629)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:166)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:197)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:249)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:252)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:305)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:337)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:137)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:235)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)

!ENTRY org.eclipse.jface 4 2 2007-12-19 09:51:26.000
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.jface".
!STACK 0
java.lang.NullPointerException
	at org.eclipse.core.internal.filesystem.InternalFileSystemCore.getStore(InternalFileSystemCore.java:104)
	at org.eclipse.core.filesystem.EFS.getStore(EFS.java:350)
	at org.eclipse.jdt.internal.core.util.Util.getResourceContentsAsCharArray(Util.java:1048)
	at org.eclipse.jdt.internal.core.util.Util.getResourceContentsAsCharArray(Util.java:1037)
	at org.eclipse.jdt.internal.core.CompilationUnit.openBuffer(CompilationUnit.java:1067)
	at org.eclipse.jdt.internal.core.CompilationUnit.buildStructure(CompilationUnit.java:84)
	at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:252)
	at org.eclipse.jdt.internal.core.SourceRefElement.generateInfos(SourceRefElement.java:107)
	at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:510)
	at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:251)
	at org.eclipse.jdt.internal.core.JavaElement.getElementInfo(JavaElement.java:237)
	at org.eclipse.jdt.internal.core.JavaElement.exists(JavaElement.java:155)
	at org.eclipse.jdt.internal.debug.ui.BreakpointUtils.getMember(BreakpointUtils.java:137)
	at org.eclipse.jdt.internal.debug.ui.JDIModelPresentation.getLineBreakpointText(JDIModelPresentation.java:1549)
	at org.eclipse.jdt.internal.debug.ui.JDIModelPresentation.getBreakpointText(JDIModelPresentation.java:1463)
	at org.eclipse.jdt.internal.debug.ui.JDIModelPresentation.getText(JDIModelPresentation.java:218)
	at org.eclipse.debug.internal.ui.LazyModelPresentation.getText(LazyModelPresentation.java:180)
	at org.eclipse.debug.internal.ui.DelegatingModelPresentation.getText(DelegatingModelPresentation.java:162)
	at org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsLabelProvider.getText(BreakpointsLabelProvider.java:86)
	at org.eclipse.jface.viewers.WrappedViewerLabelProvider.getText(WrappedViewerLabelProvider.java:108)
	at org.eclipse.jface.viewers.WrappedViewerLabelProvider.update(WrappedViewerLabelProvider.java:164)
	at org.eclipse.jface.viewers.ViewerColumn.refresh(ViewerColumn.java:135)
	at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:929)
	at org.eclipse.jface.viewers.AbstractTreeViewer$UpdateItemSafeRunnable.run(AbstractTreeViewer.java:99)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.core.runtime.Platform.run(Platform.java:857)
	at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:46)
	at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:199)
	at org.eclipse.jface.viewers.AbstractTreeViewer.doUpdateItem(AbstractTreeViewer.java:1009)
	at org.eclipse.jface.viewers.StructuredViewer$UpdateItemSafeRunnable.run(StructuredViewer.java:466)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
	at org.eclipse.core.runtime.Platform.run(Platform.java:857)
	at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:46)
	at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:199)
	at org.eclipse.jface.viewers.StructuredViewer.updateItem(StructuredViewer.java:2023)
	at org.eclipse.jface.viewers.AbstractTreeViewer.updateChildren(AbstractTreeViewer.java:2632)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefreshStruct(AbstractTreeViewer.java:1853)
	at org.eclipse.jface.viewers.TreeViewer.internalRefreshStruct(TreeViewer.java:704)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1828)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1784)
	at org.eclipse.jface.viewers.AbstractTreeViewer.internalRefresh(AbstractTreeViewer.java:1770)
	at org.eclipse.jface.viewers.StructuredViewer$7.run(StructuredViewer.java:1430)
	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1365)
	at org.eclipse.jface.viewers.TreeViewer.preservingSelection(TreeViewer.java:390)
	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1328)
	at org.eclipse.jface.viewers.CheckboxTreeViewer.preservingSelection(CheckboxTreeViewer.java:371)
	at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1428)
	at org.eclipse.jface.viewers.ColumnViewer.refresh(ColumnViewer.java:515)
	at org.eclipse.jface.viewers.StructuredViewer.refresh(StructuredViewer.java:1387)
	at org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsViewer.refresh(BreakpointsViewer.java:341)
	at org.eclipse.jface.viewers.ContentViewer.setLabelProvider(ContentViewer.java:282)
	at org.eclipse.jface.viewers.StructuredViewer.setLabelProvider(StructuredViewer.java:2071)
	at org.eclipse.jface.viewers.ColumnViewer.setLabelProvider(ColumnViewer.java:355)
	at org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView.createViewer(BreakpointsView.java:153)
	at org.eclipse.debug.ui.AbstractDebugView$ViewerPage.createControl(AbstractDebugView.java:270)
	at org.eclipse.debug.ui.AbstractDebugView.createDefaultPage(AbstractDebugView.java:358)
	at org.eclipse.ui.part.PageBookView.createPartControl(PageBookView.java:473)
	at org.eclipse.debug.ui.AbstractDebugView.createPartControl(AbstractDebugView.java:319)
	at org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView.createPartControl(BreakpointsView.java:129)
	at org.eclipse.ui.internal.ViewReference.createPartHelper(ViewReference.java:371)
	at org.eclipse.ui.internal.ViewReference.createPart(ViewReference.java:230)
	at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:594)
	at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:300)
	at org.eclipse.ui.internal.ViewPane.setVisible(ViewPane.java:531)
	at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:180)
	at org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:270)
	at org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:65)
	at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:473)
	at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1256)
	at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:668)
	at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:576)
	at org.eclipse.ui.internal.PartSashContainer.createControl(PartSashContainer.java:564)
	at org.eclipse.ui.internal.PerspectiveHelper.activate(PerspectiveHelper.java:270)
	at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:931)
	at org.eclipse.ui.internal.WorkbenchPage.setPerspective(WorkbenchPage.java:3461)
	at org.eclipse.ui.internal.WorkbenchPage.busySetPerspective(WorkbenchPage.java:988)
	at org.eclipse.ui.internal.WorkbenchPage.access$17(WorkbenchPage.java:972)
	at org.eclipse.ui.internal.WorkbenchPage$18.run(WorkbenchPage.java:3560)
	at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:67)
	at org.eclipse.ui.internal.WorkbenchPage.setPerspective(WorkbenchPage.java:3558)
	at org.eclipse.ui.internal.PerspectiveBarContributionItem.select(PerspectiveBarContributionItem.java:123)
	at org.eclipse.ui.internal.PerspectiveBarContributionItem$1.widgetSelected(PerspectiveBarContributionItem.java:92)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:227)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:952)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3750)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3361)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2381)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2345)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2211)
	at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:473)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:288)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:468)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:106)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:193)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:362)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:175)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:561)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:501)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1239)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1215)
Comment 1 Szymon Brandys CLA 2007-12-19 08:31:07 EST
This seems to be a JDT issue.

In org.eclipse.core.internal.filesystem.InternalFileSystemCore#getStore(URI) line 104, null URI is the only thing that can cause NPE.

The real issue seems to be in org.eclipse.jdt.internal.core.util.Util#getResourceContentsAsCharArray(...) line 1048, where EFS#getStore(URI) is called. The uri seems to be null what is not allowed as API states.

The file, which is used in the line mentioned right above, probably doesn't exist and getLocationURI() returns null. 

So if you can pass a non-existing file to Util#getResourceContentsAsCharArray(...) you should add an extra check inside of the method, if not there is an issue above that.
Comment 2 Frederic Fusier CLA 2007-12-21 10:17:02 EST
(In reply to comment #1)
> This seems to be a JDT issue.
> 
> In org.eclipse.core.internal.filesystem.InternalFileSystemCore#getStore(URI)
> line 104, null URI is the only thing that can cause NPE.
> 
> The real issue seems to be in
> org.eclipse.jdt.internal.core.util.Util#getResourceContentsAsCharArray(...)
> line 1048, where EFS#getStore(URI) is called. The uri seems to be null what is
> not allowed as API states.
> 
> The file, which is used in the line mentioned right above, probably doesn't
> exist and getLocationURI() returns null. 
> 
> So if you can pass a non-existing file to
> Util#getResourceContentsAsCharArray(...) you should add an extra check inside
> of the method, if not there is an issue above that.
> 

The EFS#getStore(URI) Javadoc comment says:
/**
 * Returns the file store corresponding to the provided URI.
 * 
 * @param uri The URI of the file store to return
 * @return The file store
 * @exception CoreException if this method fails. Reasons include:
 * <ul>
 * <li>There is no registered file system for the given URI scheme.</li>
 * <li>The URI syntax was not in the appropriate form for that scheme.</li>
 * <li>There was a failure initializing the file system.</li>
 * </ul>
 */

As I do not see clearly that the 'uri' parameter is not supposed to be null, I would expect a CoreException if the method does not like this value.

So, back to Platform/Resources...
Comment 3 John Arthorne CLA 2007-12-21 11:35:01 EST
If there is no mention of null in the javadoc, then you can assume that null is not a valid value. See:

http://www.eclipse.org/articles/article.php?file=Article-API-Use/index.html

"Do not pass null as a parameter to an API method unless the parameter is explicitly documented as allowing null. This is perhaps the most frequently made programming error."
Comment 4 Jerome Lanneluc CLA 2008-01-10 12:53:47 EST
Created attachment 86577 [details]
Proposed fix and regression test
Comment 5 Jerome Lanneluc CLA 2008-01-11 07:40:34 EST
Created attachment 86665 [details]
Simplified fix and same regression test
Comment 6 Jerome Lanneluc CLA 2008-01-11 07:43:15 EST
Fix and test released for 3.4M5
Comment 7 Eric Jodet CLA 2008-02-05 05:07:49 EST
Verified for 3.4M5 using build I20080204-0010