在java編程中,有這樣一個問題:類A引用了類B,那么如果運行時沒有類B,類A會不會調(diào)用成功,而不拋異常?
答案是,有可能運行成功,而不拋異常。
例子1:
ClassA.java
package com.hf.cp.test;import com.hf.cp.test2.ClassB;public class ClassA { public static void main(String[] args) { //new ClassB(); System.out.PRintln("TEST IS OK!"); } public void test2(){ new ClassB(); }}ClassB.javapackage com.hf.cp.test2;public class ClassB { }在編譯成功后,將class輸出目錄(如bin目錄)中的ClassB.class去除掉,然后執(zhí)行:K:/workspace2/codeprotect/bin>java com.hf.cp.test.ClassATEST IS OK!例子2:將ClassA的main方法中添加一句對ClassB的引用:
new Class();
詳細的代碼見下文。
ClassA.java
package com.hf.cp.test;import com.hf.cp.test2.ClassB;public class ClassA { public static void main(String[] args) { new ClassB(); System.out.println("2TEST IS OK!"); } public void test2(){ new ClassB(); }}結(jié)果運行出錯:K:/workspace2/codeprotect/bin>java com.hf.cp.test.ClassAException in thread "main" java.lang.NoClassDefFoundError: com/hf/cp/test2/ClassB at com.hf.cp.test.ClassA.main(ClassA.java:8)Caused by: java.lang.ClassNotFoundException: com.hf.cp.test2.ClassB 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:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 1 more
這2個例子說明:
運行期,主類對引入類并不是強依賴,如果運行時未使用依賴類,則雖然依賴類缺失,主類也照樣可以運行;若運行時使用了依賴類,則依賴類必須存在,方可正常運行。
注意:在編譯期主類對引用類具有強依賴,找不到則編譯不通過。
新聞熱點
疑難解答