In the following example an inner class, "ProtectedInnerClass2" extends
a protected inner class defined by an outer class in another package. In JDK1.1.5 this caused a compiler error (see bug 4085837) which was thought to
have been fixed in 1.1.6. In 1.1.6 a runtime "class not found" error is
generated, on 1.2 beta3, java SEGVs. Here's the application and the transcripts
of runs against 1.2 and 1.1.6.
// File InnerClassBug1.java
package p1;
public class InnerClassBug1 {
protected class BaseInnerClass {
public String getWorld() { return "World"; }
}
}
// File InnerClassBug2.java
package p2;
public class InnerClassBug2 extends p1.InnerClassBug1
{
class ExtendedInnerClass extends BaseInnerClass {
String getHelloWorld() { return "Hello " + getWorld(); }
}
ExtendedInnerClass eicObject = new ExtendedInnerClass();
public static void main(String[] args) {
System.out.println(new InnerClassBug2().eicObject.getHelloWorld());
}
}
mushmouth% which java
/usr/local/java/jdk1.2beta3/solaris/bin/java
mushmouth% echo $CLASSPATH
.:/usr/local/java/jdk1.2beta3/solaris/lib/classes.zip
mushmouth% javac InnerClassBug1.java InnerClassBug2.java
mushmouth% java -classpath ${CLASSPATH} p2.InnerClassBug2
SIGSEGV 11* segmentation violation
si_signo [11]: SIGSEGV 11* segmentation violation
si_errno [0]: Error 0
si_code [1]: SEGV_MAPERR [addr: 0x0]
stackbase=F0000000, stackpointer=EFFFE248
Full thread dump:
"SoftReference sweeper" (TID:0xee3046a8, sys_thread_t:0x81fd8, state:CW) prio=9
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:315)
at java.lang.Runtime.waitForMemoryAdvice(Runtime.java:569)
at java.lang.ref.SoftReference$Sweeper.run(SoftReference.java:524)
at java.lang.Thread.run(Thread.java:490)
"Finalizer" (TID:0xee300318, sys_thread_t:0x60db0, state:CW) prio=8
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:107)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:122)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:127)
"Reference handler" (TID:0xee3003c8, sys_thread_t:0x59868, state:CW) prio=10
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:315)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:186)
"Async Garbage Collector" (TID:0xee3001b0, sys_thread_t:0x5a400, state:R) prio=1
"Idle thread" (TID:0xee3001f8, sys_thread_t:0x5a2d8, state:R) prio=0
"Clock" (TID:0xee3002d0, sys_thread_t:0x53108, state:CW) prio=12
"main" (TID:0xee300038, sys_thread_t:0x22cf0, state:R) prio=5 *current thread*
at p2.InnerClassBug2.<init>(InnerClassBug2.java:9)
at p2.InnerClassBug2.main(InnerClassBug2.java:12)
Monitor Cache Dump:
Registered Monitor Dump:
utf8 hash table: <unowned>
JNI pinning lock: <unowned>
JNI global reference lock: <unowned>
BinClass lock: <unowned>
Class linking lockAbort (core dumped)
mushmouth%
-------------
mushmouth% setenv CLASSPATH .:/usr/local/java/jdk1.1.6/solaris/lib/classes.zip
mushmouth% which java
/usr/local/java/jdk1.1.6/solaris/bin/java
mushmouth% javac -d /home/hmuller/awt-bugs InnerClassBug1.java InnerClassBug2.java
mushmouth% java -classpath ${CLASSPATH} p2.InnerClassBug2
java.lang.NoClassDefFoundError: p1/InnerClassBug1$BaseInnerClass
at p2.InnerClassBug2.<init>(InnerClassBug2.java:3)
at p2.InnerClassBug2.main(InnerClassBug2.java:12)
mushmouth%
a protected inner class defined by an outer class in another package. In JDK1.1.5 this caused a compiler error (see bug 4085837) which was thought to
have been fixed in 1.1.6. In 1.1.6 a runtime "class not found" error is
generated, on 1.2 beta3, java SEGVs. Here's the application and the transcripts
of runs against 1.2 and 1.1.6.
// File InnerClassBug1.java
package p1;
public class InnerClassBug1 {
protected class BaseInnerClass {
public String getWorld() { return "World"; }
}
}
// File InnerClassBug2.java
package p2;
public class InnerClassBug2 extends p1.InnerClassBug1
{
class ExtendedInnerClass extends BaseInnerClass {
String getHelloWorld() { return "Hello " + getWorld(); }
}
ExtendedInnerClass eicObject = new ExtendedInnerClass();
public static void main(String[] args) {
System.out.println(new InnerClassBug2().eicObject.getHelloWorld());
}
}
mushmouth% which java
/usr/local/java/jdk1.2beta3/solaris/bin/java
mushmouth% echo $CLASSPATH
.:/usr/local/java/jdk1.2beta3/solaris/lib/classes.zip
mushmouth% javac InnerClassBug1.java InnerClassBug2.java
mushmouth% java -classpath ${CLASSPATH} p2.InnerClassBug2
SIGSEGV 11* segmentation violation
si_signo [11]: SIGSEGV 11* segmentation violation
si_errno [0]: Error 0
si_code [1]: SEGV_MAPERR [addr: 0x0]
stackbase=F0000000, stackpointer=EFFFE248
Full thread dump:
"SoftReference sweeper" (TID:0xee3046a8, sys_thread_t:0x81fd8, state:CW) prio=9
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:315)
at java.lang.Runtime.waitForMemoryAdvice(Runtime.java:569)
at java.lang.ref.SoftReference$Sweeper.run(SoftReference.java:524)
at java.lang.Thread.run(Thread.java:490)
"Finalizer" (TID:0xee300318, sys_thread_t:0x60db0, state:CW) prio=8
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:107)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:122)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:127)
"Reference handler" (TID:0xee3003c8, sys_thread_t:0x59868, state:CW) prio=10
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:315)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:186)
"Async Garbage Collector" (TID:0xee3001b0, sys_thread_t:0x5a400, state:R) prio=1
"Idle thread" (TID:0xee3001f8, sys_thread_t:0x5a2d8, state:R) prio=0
"Clock" (TID:0xee3002d0, sys_thread_t:0x53108, state:CW) prio=12
"main" (TID:0xee300038, sys_thread_t:0x22cf0, state:R) prio=5 *current thread*
at p2.InnerClassBug2.<init>(InnerClassBug2.java:9)
at p2.InnerClassBug2.main(InnerClassBug2.java:12)
Monitor Cache Dump:
Registered Monitor Dump:
utf8 hash table: <unowned>
JNI pinning lock: <unowned>
JNI global reference lock: <unowned>
BinClass lock: <unowned>
Class linking lockAbort (core dumped)
mushmouth%
-------------
mushmouth% setenv CLASSPATH .:/usr/local/java/jdk1.1.6/solaris/lib/classes.zip
mushmouth% which java
/usr/local/java/jdk1.1.6/solaris/bin/java
mushmouth% javac -d /home/hmuller/awt-bugs InnerClassBug1.java InnerClassBug2.java
mushmouth% java -classpath ${CLASSPATH} p2.InnerClassBug2
java.lang.NoClassDefFoundError: p1/InnerClassBug1$BaseInnerClass
at p2.InnerClassBug2.<init>(InnerClassBug2.java:3)
at p2.InnerClassBug2.main(InnerClassBug2.java:12)
mushmouth%
- duplicates
-
JDK-4109894 Incorrect access bits generated for nested classes
-
- Closed
-