Hi Russell,
This may be a VisAD bug or may be a Java3D bug, but if you
are willing to experiment perhaps we can fix it.
The experiments all involve changes in
visad/java3d/RendererJ3D.java. First could you please try
changing RendererJ3D.clearBranch() from (please excuse all
the old comments):
public void clearBranch() {
if (branches == null) return;
synchronized (branches[currentIndex]) {
if (branchNonEmpty[currentIndex]) {
// System.out.println("branch " + currentIndex + " not empty, clearBranch");
/* WLH 1 April 99 - doesn't help memory */
flush(branches[currentIndex]);
Enumeration ch = branches[currentIndex].getAllChildren();
while(ch.hasMoreElements()) {
BranchGroup b = (BranchGroup) ch.nextElement();
b.detach();
}
/*
for (int m=0; m<branches[currentIndex].numChildren(); m++) {
branches[currentIndex].removeChild(m);
}
*/
}
}
branchNonEmpty[currentIndex] = false;
}
to:
public void clearBranch() {
if (branches == null) return;
synchronized (this) {
if (branchNonEmpty[currentIndex]) {
// System.out.println("branch " + currentIndex + " not empty, clearBranch");
/* WLH 1 April 99 - doesn't help memory */
flush(branches[currentIndex]);
Enumeration ch = branches[currentIndex].getAllChildren();
while(ch.hasMoreElements()) {
BranchGroup b = (BranchGroup) ch.nextElement();
b.detach();
}
/*
for (int m=0; m<branches[currentIndex].numChildren(); m++) {
branches[currentIndex].removeChild(m);
}
*/
}
branchNonEmpty[currentIndex] = false;
}
}
That is, move "branchNonEmpty[currentIndex] = false" inside
the synchronized block, and synchronize on "this" rather than
"branches[currentIndex]". If this fixes the problem, please
let me know, and you're done.
If that doesn't fix it, then it may be a Java3D bug that we
can fix with a little defensive code. The lowest level VisAD
code in your Exception stack is line 264 of RendererJ3D.java,
in the getBranch() method:
public BranchGroup getBranch() {
synchronized (this) {
if (branches != null && branchNonEmpty[currentIndex]) {
return (BranchGroup) branches[currentIndex].getChild(0); // line 264
}
else {
return null;
}
}
}
Would you please try changing this to:
public BranchGroup getBranch() {
synchronized (this) {
if (branches != null && branchNonEmpty[currentIndex] &&
branches[currentIndex].numChildren() > 0) {
return (BranchGroup) branches[currentIndex].getChild(0);
}
else {
return null;
}
}
}
If that still gives the Exception, then please try:
public BranchGroup getBranch() {
synchronized (this) {
if (branches != null && branchNonEmpty[currentIndex] &&
branches[currentIndex].numChildren() > 0) {
try {
return (BranchGroup) branches[currentIndex].getChild(0);
}
catch (java.lang.ArrayIndexOutOfBoundsException e) {
return null;
}
}
else {
return null;
}
}
}
Let us know how this works out, and thanks for your help on this.
Cheers,
Bill
On Thu, 10 Jul 2003, Russell Steicke wrote:
> Hello All,
>
> I can consistently get this exception in an application by changing the
> order in which I add data to the display. Is this familiar to anyone?
> How do I go about tracking this one down, given that there's none of my
> own code in the stack trace?
>
> (A search of the email archives didn't turn up the same stack trace.)
>
>
> java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
> at java.util.Vector.elementAt(Vector.java:427)
> at javax.media.j3d.GroupRetained.getChild(GroupRetained.java:410)
> at javax.media.j3d.Group.getChild(Group.java:219)
> at visad.java3d.RendererJ3D.getBranch(RendererJ3D.java:264)
> at visad.bom.ImageRendererJ3D.doTransform(ImageRendererJ3D.java:363)
> at visad.java3d.RendererJ3D.doAction(RendererJ3D.java:181)
> at visad.DisplayImpl.doAction(DisplayImpl.java:1559)
> at visad.ActionImpl.run(ActionImpl.java:353)
> at visad.util.ThreadPool$ThreadMinnow.run(ThreadPool.java:95)
>
>
> Thanks
> Russell
>
>
> --
> Russell Steicke
>
> -- Fortune says:
> Two percent of zero is almost nothing.
>
>