Java Solaris Communities Sun Store Join SDN My Profile Why Join?
 
Bug Database
Bug Detail
Quick Lists
Top 25 Bugs
Top 25 RFE's
Recently Closed Bugs
Printable Page Printable Page


Bug Database
Bug ID: 4994635
Votes 1
Synopsis Null Pointer adding VetoableChangeListenerProxy to VetoableChangeSupport
Category java:classes_beans
Reported Against 1.4.2
Release Fixed 7(b03)
State 10-Fix Delivered, bug
Priority: 4-Low
Related Bugs 6582164
Submit Date 13-FEB-2004
Description


FULL PRODUCT VERSION :
java version "1.4.1_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_02-b06)
Java HotSpot(TM) Client VM (build 1.4.1_02-b06, mixed mode)

FULL OS VERSION :
 customer  Windows 2000 [Version 5.00.2195]

A DESCRIPTION OF THE PROBLEM :
Here is a comparison of the source code for VetoableChangeSupport and PropertyChangeSupport

First PropertyChangeSupport
/**
     * Add a PropertyChangeListener to the listener list.
     * The listener is registered for all properties.
     *
     * @param listener  The PropertyChangeListener to be added
     */
    public synchronized void addPropertyChangeListener(
				PropertyChangeListener listener) {
	
	if (listener instanceof PropertyChangeListenerProxy) {
	    PropertyChangeListenerProxy proxy =
                   (PropertyChangeListenerProxy)listener;
	    // Call two argument add method.
	    addPropertyChangeListener(proxy.getPropertyName(),
                    (PropertyChangeListener)proxy.getListener());
	} else {
	    if (listeners == null) {
		listeners = new java.util.Vector();
	    }
	    listeners.addElement(listener);
	}
    }
Now VetoableChangeSupport
/**
     * Add a VetoableListener to the listener list.
     * The listener is registered for all properties.
     *
     * @param listener  The VetoableChangeListener to be added
     */

    public synchronized void addVetoableChangeListener(
					VetoableChangeListener listener) {
        if (listener instanceof VetoableChangeListenerProxy) {
            VetoableChangeListenerProxy proxy =
                    (VetoableChangeListenerProxy)listener;
            // Call two argument add method.
            addVetoableChangeListener(proxy.getPropertyName(),
                    (VetoableChangeListener)proxy.getListener());
        } else {
            if (listeners == null) {
                listeners = new java.util.Vector();
            }
        }
        listeners.addElement(listener);
    }

Notice the different location of listeners.addElement(listener);
In the veto version, listeners has not been initialised.  The first time you try to add a VetoableChangeListenerProxy, listeners is null, therefore a NullPointerException is caused when trying to addElement

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
initialise a VetoableChangeSupport  customer  and add a ListenerProxy as above

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Expected result is to be the same as adding PropertyChangeListenerProxy to PropertyChangeSupport
ACTUAL -
NullPointerException

ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.lang.NullPointerException
        at java.beans.VetoableChangeSupport.addVetoableChangeListener(VetoableChangeSupport.java:65)
        at uk.co.capacitas.smart.network.ChangeAdapter.addListener(NetworkElement.java:428)
        at uk.co.capacitas.smart.network.NetworkElement.addListener(NetworkElement.java:251)
        at uk.co.capacitas.smart.network.CompositeNetworkElement.addComponent(CompositeNetworkElement.java:100)
        at uk.co.capacitas.smart.network.NetworkNode.addNodeInterface(NetworkNode.java:229)
        at uk.co.capacitas.smart.network.NetworkBuilder.addNetworkSiteService(NetworkBuilder.java:71)
        at uk.co.capacitas.smart.network.ConcreteNetworkManager.addNetworkSiteService(ConcreteNetworkManager.java:141)
        at uk.co.capacitas.smart.testharness.TestBuilder.addSites(TestBuilder.java:234)
        at uk.co.capacitas.smart.testharness.TestBuilder.buildNetwork(TestBuilder.java:101)
        at uk.co.capacitas.smart.testharness.TestBuilder.buildNetwork(TestBuilder.java:121)
        at uk.co.capacitas.smart.testharness.TestHarness.build(TestHarness.java:51)
        at uk.co.capacitas.smart.testharness.TestHarnessTest.testRun(TestHarnessTest.java:50)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at uk.co.capacitas.smart.testharness.TestHarnessTest.main(TestHarnessTest.java:26)


REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.beans.*;

public class Tester {
    
    public Tester() {
    }
    
    public static void main(String[] args) {
        Tester tester = new Tester();
        VetoableChangeSupport changeSupport = new VetoableChangeSupport(tester);
        
        VetoableChangeListener listener = new VetoableChangeListener(){
            public void vetoableChange(PropertyChangeEvent e) {
            
            }
        };
        VetoableChangeListenerProxy proxy = new VetoableChangeListenerProxy("property",listener);
        changeSupport.addVetoableChangeListener(proxy);
        
    }
    
}
---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
Not using a proxy works fine
(Incident Review ID: 185508) 
======================================================================
Posted Date : 2005-10-24 08:43:05.0
Work Around
N/A
Evaluation
This is reproducible back through 1.4, when VetoableChangeListenerProxy was added.  Looks like it was simply an oversight when support was added for getListeners().  See delta 1.35 of PropertyChangeSupport versus 1.37 of VetoableChangeSupport.  Fix is trivial.
  xxxxx@xxxxx   2004-02-19
Contribution forum : https://jdk-collaboration.dev.java.net/servlets/ProjectForumMessageView?forumID=1463&messageID=15001
 (Three related bug-IDs: 4994635, 5026703, 6225071)
Posted Date : 2006-08-24 20:27:29.0

VetoableChangeSupport should be similar to PropertyChangeSupport.
Posted Date : 2006-10-23 13:38:02.0
Comments
  
  Include a link with my name & email   

Submitted On 20-MAR-2007
petr.hollay
Is there any reason why it is not fixed in Java 6 as well?



PLEASE NOTE: JDK6 is formerly known as Project Mustang