2017-08-11 134 views
-4

有兩個類A和C都包含靜態塊,但只有A.java有一個主要方法。我想從A調用C,即使用forName()動態加載它。由於C沒有一個.class文件,我得到了一個ClassnotFoundException,我在使用throws子句的main中捕獲到了這個異常,但是我發現它沒有被捕獲。需要幫助搞清楚什麼我做錯了:無法捕獲拋出的異常

class  A 
{   
    static 
    { 
       System.out.println("A class static block"); 
    } 

    public static void main(String[] args) throws ClassNotFoundException 
    { 
    Class.forName("C");  
  } 
} 


class C 
{ 
    static 
  { 
    System.out.println("C class static block"); 
  } 
} 

輸出如下:

C:\Users\xxxx\Documents\MyJavaPrograms\MyJava>java A 
A class static block 
Exception in thread "main" java.lang.ClassNotFoundException: C 
        at java.net.URLClassLoader.findClass(Unknown Source) 
        at java.lang.ClassLoader.loadClass(Unknown Source) 
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
        at java.lang.ClassLoader.loadClass(Unknown Source) 
        at java.lang.Class.forName0(Native Method) 
        at java.lang.Class.forName(Unknown Source) 
        at A.main(A.java:10) 
+5

你是扔在'main'異常則拋出異常。你期望什麼?如果你想使用'try/catch'來捕獲它,而不是拋出它 –

+0

在Java中拋出一些東西意味着什麼? throws子句用於聲明不是由特定的方法來處理的異常,是給市民的指令,明確地處理這些或調用層次重新拋出起來。 ... throws關鍵字指示某個方法可能會「拋出」某個異常。 – Mona

+0

所以我期待主拋出和異常,我正在處理它使用拋出子句或至少這是我的想法。我仍然在學習java。 – Mona

回答

1

,我感到我在主趕上使用一個ClassNotFoundException throws子句

其實,throws子句與捕獲異常相反 - 它告訴編譯器,如果內部存在任何內容,您希望此方法拋出異常拋出異常。追趕這個樣子的:

public static void main(String[] args) 
    { 
    try 
    { 
     Class.forName("C"); 
    } 
    catch (ClassNotFoundException e) 
    { 
     // add logging code or something here. 
    } 
    } 
+0

噢好吧,也許我錯了。我實際上正在運行代碼,如視頻中所示。感謝你的幫助 – Mona

0

你說:

由於C沒有一個.class文件,我得到一個ClassNotFoundException,我在主趕上使用throws子句

但在你實際上的代碼是而不是趕上ClassNotFoundException。該的try-catch概念的工作原理是周圍的代碼塊,預計將引發異常與試塊,然後您就可以添加相應的追趕塊到specifiy做什麼,如果發生異常在嘗試塊。你這樣做是這樣的:

public static void main(String[] args) 
{ 
    try { 
     Class.forName("C"); 
    } catch (ClassNotFoundException e) { 
     System.out.println("The class was not found."); 
    } 
} 

如果試塊內部發生異常,然後將中止塊內的計算和直接跳轉到追趕塊。在執行捕獲塊後,它將定期繼續執行try-catch構造以外的代碼。


你與你的

public static void main(String[] args) throws ClassNotFoundException 

所做的只是意味着「嘿,如果你想使用方法,注意,這可能會引發此異常」。這是該方法的調用者適當處理錯誤情況的提示。

此外,如果是指定Exception是所謂檢查異常然後調用者必須處理錯誤的情況下,可以通過同時指定拋出XYException(意思是:「我不處理錯誤,我讓我的方法的調用者做到這一點...「)或與捕捉它嘗試捕捉像上面看到的。

ClassNotFoundException是這樣的檢查異常。除了從RuntimeException延伸的一個的所有的例外是檢查,需要使用這樣的方法時,進行處理。其他示例將是IOExceptionFileNotFoundException。爲未經檢查的異常一個例子是IllegalArgumentExceptionArithmeticException如果試圖在5/0像除以零。


你可以閱讀更多的話題,一切的try-catch所提供的(多捕,最後塊,...)在official documentation