Name: rl43681 Date: 07/26/2003
FULL PRODUCT VERSION :
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
FULL OS VERSION :
Windows 2000 service pack 3
A DESCRIPTION OF THE PROBLEM :
Conditions when the bug appears:
When you implement two classes that inherits from java.beans.Beans and implements an java.util.EventListener like the followings
CLASS 1 : introspector_test.A
package introspector_test;
import java.beans.Beans;
import java.util.EventListener;
import java.util.Vector;
public class A extends Beans implements EventListener{
Vector bs=new Vector();
public A() {
}
public void addB(B b) {
bs.addElement(b);
}
public void removeB(B b) {
bs.removeElement(b);
}
}
CLASS 2 : introspector_test.B
package introspector_test;
import java.beans.Beans;
import java.util.EventListener;
public class B extends Beans implements EventListener {
java.util.Vector as=new java.util.Vector();
public B() {
}
public void addA(A a) {
as.addElement(a);
}
public void removeA(A a) {
as.removeElement(a);
}
}
And third class to let the bug appear:
package introspector_test;
import java.beans.BeanInfo;
import java.beans.Introspector;
public class Main {
public static void main(String[] args) {
try {
BeanInfo info=Introspector.getBeanInfo(A.class);
}catch(Throwable th1) {
th1.printStackTrace();
}
}
}
Running the Introspector like in main() function let it throw an
java.lang.StringIndexOutOfBoundsException
with a stack trace like that:
java.lang.StringIndexOutOfBoundsException: String index out of range: -7
at java.lang.String.substring(String.java:1444)
at java.beans.Introspector.getTargetEventInfo(Introspector.java:884)
at java.beans.Introspector.getBeanInfo(Introspector.java:371)
at java.beans.Introspector.getBeanInfo(Introspector.java:144)
at introspector_test.Main.main(Main.java:23)
The exception is at line : 884 of class java.beans.Introspector, in that point your code does like that:
> String eventName = decapitalize(listenerName.substring(0, listenerName.length()-8));
Even if the Beans standard does reccomend to use method names add<event-name>Listener and remove<event-name>Listener
it does not say that i must avoid to name methods with add<...> and remove<.....> starting words,so it is coherent to write
classes like A and B. I think you forget to test if name of add/remove methods ends with the word "Listener" (that is the same stuff you are
cutting with listenerName.length()-8 parameter).
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
CLASS 1 : introspector_test.A
package introspector_test;
import java.beans.Beans;
import java.util.EventListener;
import java.util.Vector;
public class A extends Beans implements EventListener{
Vector bs=new Vector();
public A() {
}
public void addB(B b) {
bs.addElement(b);
}
public void removeB(B b) {
bs.removeElement(b);
}
}
CLASS 2 : introspector_test.B
package introspector_test;
import java.beans.Beans;
import java.util.EventListener;
public class B extends Beans implements EventListener {
java.util.Vector as=new java.util.Vector();
public B() {
}
public void addA(A a) {
as.addElement(a);
}
public void removeA(A a) {
as.removeElement(a);
}
}
And third class to let the bug appear:
package introspector_test;
import java.beans.BeanInfo;
import java.beans.Introspector;
public class Main {
public static void main(String[] args) {
try {
BeanInfo info=Introspector.getBeanInfo(A.class);
}catch(Throwable th1) {
th1.printStackTrace();
}
}
}
Running the Introspector like in main() function let it throw an
java.lang.StringIndexOutOfBoundsException
with a stack trace like that:
java.lang.StringIndexOutOfBoundsException: String index out of range: -7
at java.lang.String.substring(String.java:1444)
at java.beans.Introspector.getTargetEventInfo(Introspector.java:884)
at java.beans.Introspector.getBeanInfo(Introspector.java:371)
at java.beans.Introspector.getBeanInfo(Introspector.java:144)
at introspector_test.Main.main(Main.java:23)
The exception is at line : 884 of class java.beans.Introspector, in that point your code does like that:
> String eventName = decapitalize(listenerName.substring(0, listenerName.length()-8));
Even if the Beans standard does reccomend to use method names add<event-name>Listener and remove<event-name>Listener
it does not say that i must avoid to name methods with add<...> and remove<.....> starting words,so it is coherent to write
classes like A and B. I think you forget to test if name of add/remove methods ends with the word "Listener" (that is the same stuff you are
cutting with listenerName.length()-8 parameter).
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
A normal JavaBeans introspection
ACTUAL -
at line 884 of java.beans.Introspector an exception of type java.lang.StringIndexOutOfBoundsException is thrown
ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.lang.StringIndexOutOfBoundsException: String index out of range: -7
at java.lang.String.substring(String.java:1444)
at java.beans.Introspector.getTargetEventInfo(Introspector.java:884)
at java.beans.Introspector.getBeanInfo(Introspector.java:371)
at java.beans.Introspector.getBeanInfo(Introspector.java:144)
at introspector_test.Main.main(Main.java:23)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
CLASS 1 : introspector_test.A
package introspector_test;
import java.beans.Beans;
import java.util.EventListener;
import java.util.Vector;
public class A extends Beans implements EventListener{
Vector bs=new Vector();
public A() {
}
public void addB(B b) {
bs.addElement(b);
}
public void removeB(B b) {
bs.removeElement(b);
}
}
CLASS 2 : introspector_test.B
package introspector_test;
import java.beans.Beans;
import java.util.EventListener;
public class B extends Beans implements EventListener {
java.util.Vector as=new java.util.Vector();
public B() {
}
public void addA(A a) {
as.addElement(a);
}
public void removeA(A a) {
as.removeElement(a);
}
}
And third class to let the bug appear:
CLASS 3:
package introspector_test;
import java.beans.BeanInfo;
import java.beans.Introspector;
public class Main {
public static void main(String[] args) {
try {
BeanInfo info=Introspector.getBeanInfo(A.class);
}catch(Throwable th1) {
th1.printStackTrace();
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Avoid declaring class A and B as implementing java.util.EventListener
(Incident Review ID: 189507)
======================================================================