Bug 17145 - NPE while compiling
Summary: NPE while compiling
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 2.0   Edit
Hardware: PC Windows NT
: P3 normal (vote)
Target Milestone: 2.0 F2   Edit
Assignee: Philipe Mulet CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2002-05-23 04:46 EDT by Roel De Meester CLA
Modified: 2002-06-03 09:41 EDT (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Roel De Meester CLA 2002-05-23 04:46:08 EDT
I have following code
**********
1	public WedgeGenerator() 
{
2		super("Wedge");
3		setData((int) (2. + 10. * Math.random()));
4		//prt_buffers = 
THsys.getInstance().getNrOfPrintBuffers() - 1;
5		prt_buffers = 5		
6		pool = new 
short[prt_buffers][];
7		for (int i = 0; i < pool.length; i++) pool[i] = null;
9		read_pos = 
0;
10		write_pos = 0;
11		stop = false;
12		poolHasData = 
false;
13		start();
14		try {
15			sleep(100);
16		} catch (InterruptedException 
e) {
17		}
18	}
**********
I commented out line 4 and created line 5  but forgot to put a ';' 
at the end.
I press Ctrl+S to save, compilation starts and i get messagebox.
Save problems.. 
save could not be completed.. reason : Erros during build.
Details -> NPE encountered while 
running org.eclipse.jdt.internal.core.builder.JavaBuilder

Adding the ';' at the end  
and saving , solves this bug.

It can be repeated again by removing the ';' and saving. It is a 
persistent bug
Comment 1 DJ Houghton CLA 2002-05-23 08:45:18 EDT
Which build are you using?
Is there any information in the /.metadata/.log file?

Moving to JDT/Core for comment.
Comment 2 Roel De Meester CLA 2002-05-24 04:01:03 EDT
the whole .java file was..
***********************
package 
com.agfa.med.hermod.thsystem;
import java.io.FileInputStream;

import 
com.agfa.med.hermod.properties.Properties;
import 
com.agfa.med.hermod.thsystem.*;
import com.agfa.med.thor.thsystem.THsys;
import 
com.agfa.portex.Logbox;

public class WedgeGenerator extends BufferFiller 
{

	private short datamin, datanodes, datamax;
	int NrOfLines2Compensate, 
numberOfPixelsPerLine, numberOfLines;

	private boolean stop, poolHasData;
	private 
short[][] pool;
	private int read_pos, write_pos, buf_cnt;
	private int 
prt_buffers;
	private int banks;

	public WedgeGenerator() 
{
		super("Wedge");

		setData((int) (2. + 10. * Math.random()));

		//prt_buffers 
= THsys.getInstance().getNrOfPrintBuffers() - 1;
		prt_buffers = 5
		
		pool = new 
short[prt_buffers][];
		for (int i = 0; i < pool.length; i++)
			pool[i] = 
null;

		read_pos = 0;
		write_pos = 0;
		stop = false;
		poolHasData = 
false;

		start();
		try {
			sleep(100);
		} catch (InterruptedException e) 
{
		}
	}

	public WedgeGenerator(Logbox logbox) 
{
		this();
		setLogbox(logbox);
	}

	public WedgeGenerator(short 
numberOfNodes, Logbox logbox) {
		this(logbox);
	}

	public void setData(int 
numberOfNodes) {
		Properties prop = new Properties();
		try {
			FileInputStream fis = 
new FileInputStream("c:\\wedge.dat");
			prop.load(fis);
			fis.close();
		} 
catch (Exception ex) {
			String message =
				"If you want to use your own settings for 
printing the wedge. Make a properties file c:/wedge.dat";
			message += "\n data.minimum = 
4000";
			message += "\n data.maximum = 8200";
			message += "\n data.nodes = 
3";
			logTrace(message);
		}
		String str;
		//aantal lijnen dat op een blad kunnen 
.. ask Layout !!
		numberOfLines = 
THsys.getInstance().getNrOfLines();

		NrOfLines2Compensate = 
THsys.getInstance().getNrOfLines2Compensate();
		numberOfPixelsPerLine = 
THsys.getInstance().getNe();

		datamax = 
THsys.getInstance().getMaxTHdata();
		datamin = (short) (datamax / 2);
		datanodes = 
5;

		str = prop.getProperty("data.minimum");
		if (str != null) 
{
			logError("data.minumum provided " + str);
			datamin = (short) 
Integer.parseInt(str);
		}

		str = prop.getProperty("data.maximum");
		if (str != 
null) {
			logError("data.maximum provided " + str);
			datamax = (short) 
Integer.parseInt(str);
		}

		str = prop.getProperty("data.nodes");
		if (str != 
null) {
			logError("data.nodes provided " + str);
			datanodes = (short) 
Integer.parseInt(str);
		}

		if (numberOfNodes > 0)
			datanodes = (short) 
numberOfNodes;

		String message = "data.minimum = " + datamin;
		message += "\n 
data.maximum = " + datamax;
		message += "\n data.nodes = " + datanodes;
		logError("data ->" 
+ message);
	}

	public synchronized void stopFilling() {
		stop = 
true;

		synchronized (this) {
			this.notify();
		}
		logError(" 
WIP::stopFilling notifies ...");

		for (int i = 0; i < pool.length; i++)
			pool[i] = 
null;
		poolHasData = false;
	}

	public short[] getDataBuffer() {
		logError(" 
WIP::getDataBuffer Called");
		if (!poolHasData) {
			synchronized (this) 
{
				logError(" WIP::getDataBuffer pool has no data-> 
NOTIFY!!");
				this.notify();
			}
		}
		while (!poolHasData) 
{
			synchronized (this) {
				try {
					logError(
						" WIP::getDataBuffer 
waiting... poolHasData="
							+ poolHasData);
					wait(100);
				} catch 
(InterruptedException ie) {
					poolHasData = 
false;
					logError("WIP::getDataBuffer Interrupted while waiting for pool to get 
filled, Ex:"+ie.getMessage());
					
				}
			} // wait for all buffers to be filled 

		}

		short[] tmp = pool[read_pos];

		pool[read_pos] = null;
		read_pos = 
(read_pos + 1) % prt_buffers;
		// if test sneller dan modulo ?
		buf_cnt--;
		logError(" 
WIP:: data READ @ pos:" + read_pos + " buf_cnt=" + buf_cnt);

		return tmp;
	}

	public 
synchronized void run() {
		logError(" WIP::thread started ");

		do {
			try 
{
				logError(" WIP:: waiting to get kicked Off");
				wait();
				logError(" 
WIP::Start filling buffers");
				//drukt een trappenpatroon af over de hele breedte van het 
blad

				float increment =
					datanodes * (datamax - datamin) / (float) 
(numberOfLines);
				float currentdata = datamin;
				logError(
					" WIP::Start 
filling buffers : startvalue = "
						+ currentdata
						+ " -- increment = "
						+ 
increment);

				int currentLine = 0;
				buf_cnt = 0;

				do {
					while (!stop 
&& (pool[write_pos] != null)) {
						logError(" WIP::run waiting 
...");
						wait(10);
					}

					short[] tmp =
						new 
short[NrOfLines2Compensate * numberOfPixelsPerLine];
					//de pool_buffer bevat niet 1 
lijn, maar NrOfLines2Compensate lijnen achter elkaar
					for (int x = 0; x < 
NrOfLines2Compensate; x++) {
						//voeg 1 lijntje toe aan de reeks van 
NrOfLines2Compensate lijnen (alle pixels hebben waarde = data)
						for (short y = 0; y < 
numberOfPixelsPerLine; y++)
							tmp[x * numberOfPixelsPerLine + y] 
=
								(short) currentdata;
						//Check of we moeten verhogen of 
verlagen
						if (currentdata + increment > datamax
							|| currentdata + increment < 
datamin)
							increment = -increment;
						currentdata += 
increment;
						currentLine++;
					}
					logError(
						" 
WIP::CurrentLine/Numberoflines="
							+ currentLine
							+ "/"
							+ 
numberOfLines);
					pool[write_pos] = tmp;
					poolHasData = 
true;
					logError(
						" WIP::Filled pool["
							+ write_pos
							+ 
"][0]="
							+ pool[write_pos][0]);
					write_pos = (write_pos + 1) % 
prt_buffers;
					buf_cnt++;
					logError(
						" WIP:: data WRITE @ 
pos:"
							+ write_pos
							+ " buf_cnt="
							+ 
buf_cnt);

				}
				while (!stop);
			} catch (InterruptedException e) 
{
			}
		}
		while (true);

	}
}
******************
Comment 3 Roel De Meester CLA 2002-05-24 04:01:48 EDT
the .metadata/.log file 
**********************
!ENTRY org.eclipse.core.resources 4 2 
mei 24, 2002 10:06:13.599
!MESSAGE Problems occurred when invoking code from plug-in: 
org.eclipse.core.resources.
!STACK 0
java.lang.NullPointerException
	at 
org.eclipse.jdt.internal.compiler.problem.ProblemReporter.recursiveConstructorInvocation(ProblemReporter.java:1927)
	at 
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.analyseCode(TypeDeclaration.java:445)
	at 
org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.analyseCode(CompilationUnitDeclaration.java:77)
	at 
org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:536)
	at 
org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:337)
	at 
org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:218)
	at 
org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:165)
	at 
org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder.build(IncrementalImageBuilder.java:106)
	at 
org.eclipse.jdt.internal.core.builder.JavaBuilder.buildDeltas(JavaBuilder.java:185)
	at 
org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:109)
	at 
org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:383)
	at 
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:802)
	at 
org.eclipse.core.runtime.Platform.run(Platform.java:416)
	at 
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:119)
	at 
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:173)
	at 
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:183)
	at 
org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:143)
	at 
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:802)
	at 
org.eclipse.core.runtime.Platform.run(Platform.java:416)
	at 
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:157)
	at 
org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:208)
	at 
org.eclipse.core.internal.resources.Workspace.endOperation(Workspace.java:733)
	at 
org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1366)
	at 
org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:78)
	at 
org.eclipse.ui.texteditor.AbstractTextEditor.performSaveOperation(AbstractTextEditor.java:2019)
	at 
org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor.performSaveOperation(CompilationUnitEditor.java:614)
	at 
org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor.doSave(CompilationUnitEditor.java:662)
	at 
org.eclipse.ui.internal.EditorManager$10.run(EditorManager.java:960)
	at 
org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:296)
	at 
org.eclipse.jface.operation.ModalContext.run(ModalContext.java:249)
	at 
org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:335)
	at 
org.eclipse.ui.internal.EditorManager.runProgressMonitorOperation(EditorManager.java:838)
	at 
org.eclipse.ui.internal.EditorManager.saveEditor(EditorManager.java:965)
	at 
org.eclipse.ui.internal.WorkbenchPage.saveEditor(WorkbenchPage.java:1945)
	at 
org.eclipse.ui.internal.SaveAction.run(SaveAction.java:32)
	at 
org.eclipse.jface.action.Action.runWithEvent(Action.java:590)
	at 
org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:407)
	at 
org.eclipse.jface.action.ActionContributionItem.handleWidgetEvent(ActionContributionItem.java:361)
	at 
org.eclipse.jface.action.ActionContributionItem.access$0(ActionContributionItem.java:352)
	at 
org.eclipse.jface.action.ActionContributionItem$ActionListener.handleEvent(ActionContributionItem.java:47)
	at 
org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:75)
	at 
org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:825)
	at 
org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:1527)
	at 
org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:1289)
	at 
org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1085)
	at 
org.eclipse.ui.internal.Workbench.run(Workbench.java:1068)
	at 
org.eclipse.core.internal.boot.InternalBootLoader.run(InternalBootLoader.java:739)
	at 
org.eclipse.core.boot.BootLoader.run(BootLoader.java:462)
	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:324)
	at 
org.eclipse.core.launcher.Main.basicRun(Main.java:200)
	at 
org.eclipse.core.launcher.Main.run(Main.java:643)
	at 
org.eclipse.core.launcher.Main.main(Main.java:476)
************
Comment 4 Olivier Thomann CLA 2002-05-24 15:18:24 EDT
Here is a small test case that shows the problem:

public class Test {

	private int i;

	public Test() {
		i = 5
	}

	public Test(String s) {
		this();
	}

	public Test(short numberOfNodes, String s) {
		this(s);
	}
}

The compiler tries to report a cycle between constructors even if there is none.
Comment 5 Philipe Mulet CLA 2002-05-24 18:40:45 EDT
Good find. This bug is a consequence of no longer recreating constructor call 
during parsing recovery (if parse error was in same constructor).

Fixed
Comment 6 Philipe Mulet CLA 2002-05-25 08:31:08 EDT
Fixed
Comment 7 Philipe Mulet CLA 2002-06-03 09:41:48 EDT
Verified