Menu

#658 DynamicJava throws NullPointerException

closed
9
2014-12-28
2008-03-27
No

At the end of the following interactions, DynamicJava throws a NullPointerException (see Stack Trace 1 below), even though it should print "null".

Example 1:

Welcome to DrJava. Working directory is /Users/Shared/drjava
> import java.lang.ref.WeakReference;
> WeakReference<String> wref
> String s = "foo"
> wref = new WeakReference<String>(s);
> wref.get()
"foo"
> wref.clear()
> wref.get()

After clearing the weak reference, WeakReference.get() returns null. The return value of wref.get() is null; therefore, the second call to wref.get(), the one that throws the exception, should produce the same result as

Welcome to DrJava. Working directory is /Users/Shared/drjava
> null
null

Furthermore, I have noticed additional strange behavior after wref.clear(). For example:

Example 2:

Welcome to DrJava. Working directory is /Users/Shared/drjava
> import java.lang.ref.WeakReference;
> WeakReference<String> wref
> String s = "foo"
> wref = new WeakReference<String>(s)
java.lang.ref.WeakReference@8523a0
> wref.get()
"foo"
> wref.clear()
> Boolean boo = new Boolean(wref.get()==null)
> boo
Static Error: Undefined name 'boo'

Why is 'boo' not recognized?

When I ran the example 2 on a "fresh" DrJava, one that had not experienced the NullPointerException from example 1, I got another NullPointerException, the one shown in Stack Trace 2 below. Apparently "Reset Interactions Pane" is not enough to completely reset DynamicJava; the InteractionsPane never recuperated from the NullPointerException in example 1.

Another example:

Example 3:

Welcome to DrJava. Working directory is /Users/Shared/drjava
> import java.lang.ref.WeakReference;
> WeakReference<String> wref
> String s = "foo"
> wref = new WeakReference<String>(s)
java.lang.ref.WeakReference@8523a0
> wref.get()
"foo"
> wref.clear()
> (wref.get()==null)
>

Why does the comparison not produce any output? It should produce

> (wref.get()==null)
true
>

Again, if I ran this on a "fresh" DrJava, I got the NullPointerException shown in Stack Trace 2.

A final example:

Example 4:

Welcome to DrJava. Working directory is /Users/mgricken/Documents/Java
> import java.lang.ref.WeakReference;
> String s = "foo"
> WeakReference<String> wref = new WeakReference<String>(s)
> wref.get()
"foo"
> wref.clear()
> boolean b = true
> b
true
> b = (wref.get()!=null)
> b
true
>

The value of b did not change. The result at the end, of course, should have been

> b = (wref.get()!=null)
> b
false
>

Again, if run on a "fresh" DrJava, I got the NullPointerException in Stack Trace 2.

------------------------------

Stack Trace 1:

edu.rice.cs.util.UnexpectedException: java.lang.NullPointerException
at edu.rice.cs.drjava.model.repl.newjvm.MainJVM$ResultHandler.forUnexpectedException(MainJVM.java:790)
at edu.rice.cs.drjava.model.repl.newjvm.MainJVM$ResultHandler.forUnexpectedException(MainJVM.java:744)
at edu.rice.cs.drjava.model.repl.newjvm.InterpretResult$UnexpectedExceptionResult.apply(InterpretResult.java:95)
at edu.rice.cs.drjava.model.repl.newjvm.MainJVM.interpret(MainJVM.java:190)
at edu.rice.cs.drjava.model.repl.RMIInteractionsModel._interpret(RMIInteractionsModel.java:72)
at edu.rice.cs.drjava.model.repl.InteractionsModel.interpret(InteractionsModel.java:181)
at edu.rice.cs.drjava.model.repl.InteractionsModel.interpretCurrentInteraction(InteractionsModel.java:164)
at edu.rice.cs.drjava.ui.InteractionsController$10$1.run(InteractionsController.java:455)
Caused by: java.lang.NullPointerException
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:44)
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:103)
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:29)
at koala.dynamicjava.tree.ExpressionStatement.acceptVisitor(ExpressionStatement.java:106)
at edu.rice.cs.dynamicjava.interpreter.Interpreter.evaluate(Interpreter.java:87)
at edu.rice.cs.dynamicjava.interpreter.Interpreter.interpret(Interpreter.java:48)
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:253)
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:229)
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:585)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
at java.lang.Thread.run(Thread.java:613)

Caused by:
java.lang.NullPointerException
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:44)
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:103)
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:29)
at koala.dynamicjava.tree.ExpressionStatement.acceptVisitor(ExpressionStatement.java:106)
at edu.rice.cs.dynamicjava.interpreter.Interpreter.evaluate(Interpreter.java:87)
at edu.rice.cs.dynamicjava.interpreter.Interpreter.interpret(Interpreter.java:48)
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:253)
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:229)
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:585)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
at java.lang.Thread.run(Thread.java:613)

------------------------------

Stack Trace 2:

edu.rice.cs.util.UnexpectedException: java.lang.NullPointerException
at edu.rice.cs.drjava.model.repl.newjvm.MainJVM$ResultHandler.forUnexpectedException(MainJVM.java:787)
at edu.rice.cs.drjava.model.repl.newjvm.MainJVM$ResultHandler.forUnexpectedException(MainJVM.java:741)
at edu.rice.cs.drjava.model.repl.newjvm.InterpretResult$UnexpectedExceptionResult.apply(InterpretResult.java:95)
at edu.rice.cs.drjava.model.repl.newjvm.MainJVM.interpret(MainJVM.java:190)
at edu.rice.cs.drjava.model.repl.RMIInteractionsModel._interpret(RMIInteractionsModel.java:73)
at edu.rice.cs.drjava.model.repl.InteractionsModel.interpret(InteractionsModel.java:212)
at edu.rice.cs.drjava.model.repl.InteractionsModel.interpretCurrentInteraction(InteractionsModel.java:193)
at edu.rice.cs.drjava.ui.InteractionsController$10$1.run(InteractionsController.java:459)
Caused by: java.lang.NullPointerException
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:44)
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.visit(ExpressionEvaluator.java:227)
at koala.dynamicjava.tree.EqualExpression.acceptVisitor(EqualExpression.java:72)
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:39)
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:103)
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:29)
at koala.dynamicjava.tree.ExpressionStatement.acceptVisitor(ExpressionStatement.java:106)
at edu.rice.cs.dynamicjava.interpreter.Interpreter.evaluate(Interpreter.java:87)
at edu.rice.cs.dynamicjava.interpreter.Interpreter.interpret(Interpreter.java:48)
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:250)
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:227)
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:585)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
at java.lang.Thread.run(Thread.java:613)

Caused by:
java.lang.NullPointerException
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:44)
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.visit(ExpressionEvaluator.java:227)
at koala.dynamicjava.tree.EqualExpression.acceptVisitor(EqualExpression.java:72)
at edu.rice.cs.dynamicjava.interpreter.ExpressionEvaluator.value(ExpressionEvaluator.java:39)
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:103)
at edu.rice.cs.dynamicjava.interpreter.StatementEvaluator.visit(StatementEvaluator.java:29)
at koala.dynamicjava.tree.ExpressionStatement.acceptVisitor(ExpressionStatement.java:106)
at edu.rice.cs.dynamicjava.interpreter.Interpreter.evaluate(Interpreter.java:87)
at edu.rice.cs.dynamicjava.interpreter.Interpreter.interpret(Interpreter.java:48)
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:250)
at edu.rice.cs.drjava.model.repl.newjvm.InterpreterJVM.interpret(InterpreterJVM.java:227)
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:585)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
at java.lang.Thread.run(Thread.java:613)

System Properties:
DrJava Version 20080327-0151
DrJava Revision 4418

drjava.debug.port = 55787
java.runtime.name = Java(TM) 2 Runtime Environment, Standard Edition
sun.boot.library.path = /Applications/Dev/YourKit Java Profiler 6.0.12.app/bin/mac:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries
java.vm.version = 1.5.0_13-121
awt.nativeDoubleBuffering = true
gopherProxySet = false
java.vm.vendor = "Apple Computer, Inc."
java.vendor.url = http://apple.com/
path.separator = :
java.vm.name = Java HotSpot(TM) Client VM
file.encoding.pkg = sun.io
sun.java.launcher = SUN_STANDARD
user.country = US
sun.os.patch.level = unknown
java.vm.specification.name = Java Virtual Machine Specification
user.dir = <anonymized user.dir>
java.runtime.version = 1.5.0_13-b05-241
java.awt.graphicsenv = apple.awt.CGraphicsEnvironment
java.endorsed.dirs = /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/endorsed
os.arch = i386
java.io.tmpdir = /tmp
line.separator = "\u000a"
java.vm.specification.vendor = Sun Microsystems Inc.
os.name = Mac OS X
apple.laf.useScreenMenuBar = true
sun.jnu.encoding = MacRoman
java.library.path = /Applications/Dev/YourKit Java Profiler 6.0.12.app/bin/mac:.:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
java.specification.name = Java Platform API Specification
java.class.version = 49.0
sun.management.compiler = HotSpot Client Compiler
os.version = 10.4.11
user.home = <anonymized user.home>
user.timezone = America/Chicago
java.awt.printerjob = apple.awt.CPrinterJob
file.encoding = MacRoman
java.specification.version = 1.5
java.class.path = drjava-15.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/.compatibility/14compatibility.jar
user.name = <anonymized user.name>
apple.awt.graphics.UseQuartz = true
java.vm.specification.version = 1.0
java.home = /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home
sun.arch.data.model = 32
user.language = en
java.specification.vendor = Sun Microsystems Inc.
awt.toolkit = apple.awt.CToolkit
java.vm.info = mixed mode, sharing
java.version = 1.5.0_13
java.ext.dirs = /Library/Java/Extensions:/System/Library/Java/Extensions:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home/lib/ext
sun.boot.class.path = /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/sunrsasign.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar:/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar
java.vendor = Apple Computer, Inc.
file.separator = /
java.vendor.url.bug = http://developer.apple.com/java/
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
java.rmi.server.hostname = 127.0.0.1
mrj.version = 1040.1.5.0_13-241
sun.awt.exception.handler = edu.rice.cs.drjava.ui.DrJavaErrorHandler
sun.cpu.isalist =

#DrJava configuration file
#Wed Mar 26 22:33:23 CDT 2008
font.line.numbers = Monaco-10
lineenum.enabled = true
key.delete.next = shift DELETE
key.delete.previous = shift BACK_SPACE
find.replace.match.case = false
interactions.exit.prompt = false
open.folder.recursive = true
recent.files = [<anonymized user.home>/Documents/Java/WeakRef.java,<anonymized user.home>/Documents/Java/Tiny.java,<anonymized user.dir>/src/edu/rice/cs/drjava/config/EagerFileProperty.java,<anonymized user.dir>/src/edu/rice/cs/drjava/CodeStatus.java,<anonymized user.dir>/src/edu/rice/cs/drjava/Version.java]
recent.projects = [<anonymized user.dir>.pjt,<anonymized user.home>/Documents/Semester 8 Spring 2008/COMP 312/hw1/solution/hw1sol.pjt,<anonymized user.home>/Documents/Research/Concutest/MSThesis.defense/RCSC-20071004/listings/rscs-20071004.pjt,<anonymized user.home>/Documents/Semester 8 Spring 2008/COMP 312/hw1/assignment/hw1.pjt]
window.height = 776
window.width = 1276
window.x = 0
window.y = 22
doc.list.width = 277
last.dir = <anonymized user.home>/Documents/Java/WeakRef.java
last.interactions.dir = <anonymized user.home>/Documents/Java
master.jvm.xmx = 512
dialog.clipboard.history.state = 425 400 425 210
dialog.completeword.scan.class.files = true
dialog.completeword.javaapi = true
find.replace.focus.in.defpane = true

Used memory: about 12.61 megabytes
Free memory: about 767.16 kilobytes
Total memory: about 13.36 megabytes
Total memory can expand to: about 508.06 megabytes

Discussion

  • Dan Smith

    Dan Smith - 2008-03-27

    Logged In: YES
    user_id=1060117
    Originator: NO

    The main issue here is that erasure-based "casts" are implemented incorrectly:

    expectedType.isInstance(val)

    rather than the correct

    val == null || expectedType.isInstance(val)

    I'll fix that.

    The second issue I see is you're surprised by the behavior of a declaration when an exception occurs in its initializer. You can reproduce it as follows:
    > int z = 3/0
    java.lang.ArithmeticException: / by zero
    > z
    Static Error: Undefined name 'z'

    The only reasonable behavior here is to *not* perform the initialization. Otherwise, we have to arbitrarily choose an initial value for z, and the user might be surprised by that choice. (This isn't a problem in real Java, because whenever an exception occurs, control immediately exits the scope in which the variable was declared.)

    (The equality test with "w.get()" is simpler but has the same problem -- if an exception occurs when evaluating "w.get()", the rest of the expression can't evaluate.)

    I don't understand the third issue you're talking about -- how behavior seems different whether you restart DrJava or just reset the Interactions. The differences between the two stack traces are explained, I believe, by different syntax being evaluated (maybe you're trying to evaluate all the statements at once instead of doing them one at a time). Is there really a discrepancy between the behavior of the same sequence of expressions being evaluated after different choices for restart/reset? Can you provide an example?

     
  • Dan Smith

    Dan Smith - 2008-03-27
    • status: open --> closed-fixed
     
  • Dan Smith

    Dan Smith - 2008-03-27

    Logged In: YES
    user_id=1060117
    Originator: NO

    Fixed with rev 4421.

     
  • Mathias Ricken

    Mathias Ricken - 2008-03-27

    Logged In: YES
    user_id=1075744
    Originator: YES

    I made a mistake when I said there was a difference between resetting and completely restarting. I got confused by the DrJavaErrorPopup/Window behavior, which shows the Popup only for the first error, code which I wrote myself :P

    I can now understand that it is reasonable to not perform the entire definition -- that's what it's doing: It's ignoring the entire definition, not just the initialization, as you described. An alternative would be to perform the definition, but not perform the initialization, and leave the object with the default value.

    This behavior was so confusing to me because, in contrast to the division-by-zero example, I got no error message that something had gone wrong in the initialization. But now that the NullPointerException is fixed, I assume in all cases when an exception is thrown in the initializer, an error message is printed.

     
  • Mathias Ricken

    Mathias Ricken - 2008-03-27
    • status: closed-fixed --> open
     
  • Mathias Ricken

    Mathias Ricken - 2008-04-12
    • status: open --> closed
     

Log in to post a comment.