wood burning stoves 2.0*
The moose likes Beginning Java and the fly likes Problem running Inner Class Applications... Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Murach's Java Servlets and JSP this week in the Servlets forum!
JavaRanch » Java Forums » Java » Beginning Java
Bookmark "Problem running Inner Class Applications..." Watch "Problem running Inner Class Applications..." New topic
Author

Problem running Inner Class Applications...

Rekha Anand
Ranch Hand

Joined: Feb 23, 2008
Posts: 36
Hi All,

I have just started learning about inner classes. To observe the effect of inner classes I tried to run the following application taken from a book. It compiled fine but gave a huge runtime error. The program is as below:



class InnerTest{
public static void main(String[] args){
Outer o = new Outer();
Outer.Inner i = o.new Inner();//one way
i.seeOuter();
i = new Outer().new Inner();//another way
i.seeOuter();
}
}
public class Outer{
private String s = "outer s";
void makeAndSeeInner(){
System.out.println(this);//refers to Outer.this
Inner i = new Inner();//No need of Outer.this explicitly, because, Outer.this already exists here.
i.seeOuter();
}
void seeInner(){
System.out.println(s);//How to see Inner s here? You can't, because Inner.this not present.
}
strictfp class Inner{
private String s = "inner s";
void seeOuter(){
System.out.println(this);
System.out.println(Outer.this.s);//Need to mention Outer because this refers to Inner.this here.
System.out.println(s);//Or, this.s
}
}
abstract class AbInner{
private String s = "abstract inner s";
void seeOuter(){
System.out.println(this);//this refers to the subclass not the abstract class.
System.out.println(Outer.this.s);
System.out.println(s);
}
abstract void abMethod();
}
class Some extends AbInner implements Runnable, Animal{//can extend and implement
public void run(){}
void abMethod(){
System.out.println(this);
System.out.println(super.s);
}
}
public static void main(String[] args){
Inner i = new Outer().new Inner();
//Inner i = new Inner();//can't exist w/o outer class instance
i.seeOuter();
Outer o = new Outer();
o.makeAndSeeInner();
o.seeInner();
//new Outer().makeAndSeeInner();
Some so = new Outer().new Some();
so.seeOuter();
so.abMethod();
}
}
interface Animal{
}




The runtime exception that i received was:



Exception in thread "main" NoClassDefFoundException : Outer
caused by java.lang.ClassNotFoundException : Outer
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrevileged(Native Method)
at java.lang.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)


I got similar runtime exception for other two Inner Class Apps also that i tried to run.Please Help!!!


Regards,

Rekha
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 37874
    
  22
It ran perfectly well when I tried it.
Please use code tags on your quoted code.
Maybe you forgot to compile all the classes?
Rekha Anand
Ranch Hand

Joined: Feb 23, 2008
Posts: 36
Hi.

This code is stored under the name Outer.java on my system.
I compiled it : javac Outer.java
It compiled fine and I checked that InnerTest.class, Outer.class, Outer$Inner.class, Outer$AbInner.class and Outer$Some.class were present in the directory after compilation. Then which class file is it looking for..?

Regards
Rekha
[ March 13, 2008: Message edited by: Rekha Anand ]
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 37874
    
  22
Don't know, I am afraid.
Rekha Anand
Ranch Hand

Joined: Feb 23, 2008
Posts: 36
Somebody Please Help !!!
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 37874
    
  22
Less of the thank you; we are trying to help.

Which version of jdk are you using? Have you done an "ls" (Unix/Linux) or "dir" (DOS/Windows) call while you are in the terminal window? Have you got a . for current directory in your CLASSPATH?

I have just tried compiling it and it wouldn't compile InnerTest, presumably because of the file name (earlier I copies InnerTest into its own file). It would however compile and run Outer. It would appear you can't find Outer.

I suspect you have either slipped off the directory you think you are in, or you have the . missing from your CLASSPATH.
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 37874
    
  22
. . . and here is a copy-and-paste from my terminal window
[Campbell@queeg ~]$ cd java/applications
[Campbell@queeg applications]$ gedit Outer.java&
[1] 3157
[Campbell@queeg applications]$ javac Outer.java
[Campbell@queeg applications]$ java Outer
Outer$Inner@3e25a5
outer s
inner s
Outer@19821f
Outer$Inner@addbf1
outer s
inner s
outer s
Outer$Some@a90653
outer s
abstract inner s
Outer$Some@a90653
abstract inner s
[Campbell@queeg applications]$ javac InnerTest.java
javac: file not found: InnerTest.java
Usage: javac <options> <source files>
use -help for a list of possible options
[Campbell@queeg applications]$ ls Outer*
Outer$AbInner.class Outer$Inner.class Outer$Some.class
Outer.class Outer.java
[Campbell@queeg applications]$
Rekha Anand
Ranch Hand

Joined: Feb 23, 2008
Posts: 36
Sir,
I am using jdk1.6.0_05 downloaded from sun. My classpath is properly set with dot.And I am running it from the proper dir.

Regards
Rekha
[ March 13, 2008: Message edited by: Rekha Anand ]
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 37874
    
  22
Don't know, I am afraid. As I said, I have compiled and run your code twice on different computers.
 
Consider Paul's rocket mass heater.
 
subject: Problem running Inner Class Applications...
 
Similar Threads
Nested classes - Series of doubts
Inner class references (this & super)
How can acces inner class content from outer class if inner class is abstract?
Interface - AbstractClass Collision
Inner classes