日期:2014-05-20  浏览次数:20705 次

thinking in java一个示例程序运行出错,无法找到原因啊。。。求助
package typeinfo;
import java.util.*;

class Initable {
  static final int staticFinal = 47;
  static final int staticFinal2 =
  ClassInitialization.rand.nextInt(1000);
  static {
  System.out.println("Initializing Initable");
  }
}

class Initable2 {
  static int staticNonFinal = 147;
  static {
  System.out.println("Initializing Initable2");
  }
}

class Initable3 {
  static int staticNonFinal = 74;
  static {
  System.out.println("Initializing Initable3");
  }
}

public class ClassInitialization {
  public static Random rand = new Random(47);
  public static void main(String[] args) throws Exception {
  Class initable = Initable.class;
  System.out.println("After creating Initable ref");
  // Does not trigger initialization:
  System.out.println(Initable.staticFinal);
  // Does trigger initialization:
  System.out.println(Initable.staticFinal2);
  // Does trigger initialization:
  System.out.println(Initable2.staticNonFinal);
  Class initable3 = Class.forName("Initable3");
  System.out.println("After creating Initable3 ref");
  System.out.println(Initable3.staticNonFinal);
  }


理论上的输出结果如下:
After creating Initable ref
47
Initializing Initable
258
Initializing Initable2
147
Initializing Initable3
After creating Initable3 ref
74

而实际输出结果是:
After creating Initable ref
47
Initializing Initable
258
Initializing Initable2
147
Exception in thread "main" java.lang.ClassNotFoundException: Initable3
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at typeinfo.ClassInitialization.main(ClassInitialization.java:38)

如果main方法不用 throws Exception。。而改为把Class initable3 = Class.forName("Initable3");写成try catch..

则输出如下:
After creating Initable ref
47
Initializing Initable
258
Initializing Initable2
147
java.lang.ClassNotFoundException: Initable3
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at typeinfo.ClassInitialization.main(ClassInitialization.java:39)
After creating Initable3 ref
Initializing Initable3
74


跑出的异常时说,找不到Initable3,我理解为是木有初始化。。。但书上却说Class.forName()调用即会立马初始化。。。

------解决方案--------------------
Class initable3 = Class.forName("Initable3");
改成
Class.forName("typeinfo.Initable3");//完全限定名