2013-12-22 65 views
0

我在Java是這裏拋出的異常嗎?

public class PolyTest 
{ 
    public static void main(String... arg) 
    { 
     Animal a = new Animal(); 
     Horse b = new Horse(); 
     Animal c = new Horse(); 

     a.eat(); 
     b.eat(); 
     c.eat(); 
    } 
} 

class Animal 
{ 
    public void eat() throws IndexOutOfBoundsException 
    { 
     System.out.println("Animal Eating"); 
    } 
} 
class Horse extends Animal 
{ 
    @Override 
    public void eat() 
    { 
     System.out.println("Horse Eating"); 
    } 
} 

有這個程序現在,令人驚訝它的工作原理沒有,儘管沒有try catch塊的任何錯誤或拋出子句中的主要方法。
1.爲什麼a.eat()在主要方法中沒有給出任何錯誤?
2.當我將IndexOutOfBoundsException更改爲Exception時,這是編譯時錯誤。爲什麼?

在kathy sierra的SCJP考試指南中閱讀了這篇文章,但無法理解這裏的概念。

+0

IndexOutOfBoundsException是一個RuntimeException,因此它不需要特殊處理。 – wxyz

+0

IndexOutOfBoundsException是一個RuntimeException。請參閱http://stackoverflow.com/questions/2190161/difference-between-java-lang-runtimeexception-and-java-lang-exception。 – jarmod

+0

可能的重複[運行時異常沒有編譯錯誤。爲什麼?](http://stackoverflow.com/questions/6150609/no-compilation-error-on-runtime-exceptions-why) – Mat

回答

3

您無需趕上IndexOutOfBoundsException,它是RuntimeException。

檢查類型Exceptions

0

IndexOutOfBoundsException異常的是unchecked的RuntimeException這就是爲什麼你不需要處理它。

1

並非所有的異常都需要由程序員來處理。他們中的一些人只是應該粉碎應用程序,因爲他們代表問題而不是輸入代碼。這種例外是RuntimeExceptions。最着名的是NullPointerException這表明一些變量不保存對對象的引用,但仍用於調用該對象的方法。

現在看看IndexOutOfBoundsException documentation,你會看到,它擴展RuntimeException這意味着你不必(但可以)抓住它。這就是爲什麼你的代碼編譯沒有問題。

0
  1. 爲什麼你認爲它應該會給出錯誤?
  2. IndexOutOfBoundsException是一個未經檢查的異常,因此您不必在main方法的throws清單申報,Exception是檢查異常賦予一個編譯時錯誤,因爲你沒有在main方法中throws部分聲明它並且你不使用try/catch塊。
3

主要在這裏混亂之間實際上拋出異常,只是宣佈它區分。由於Java的檢查異常的不幸「特徵」導致了這種混淆,因爲調用聲明拋出檢查異常的方法將使您對其執行一些操作,而不管該方法是否實際上可能拋出異常

另一方面,編譯器決不會讓你做任何關於未經檢查的異常的事情,無論它們是否實際拋出。一個方法可以聲明拋出一個未經檢查的異常,但編譯器基本上忽略該聲明。它可能用於文檔目的,但通常不會寫入。

0

你必須牢固地理解你爲什麼不應該捕獲RuntimeException。因爲這種類型的異常表明你的編程錯誤。通常情況下,這種類型的異常不應該出現。 例如,如果您的程序中用戶輸入數組中的某些東西的索引,則應首先檢查用戶輸入的數據,然後纔將該數據傳遞給程序。如果你沒有檢查並且用戶輸入-1,你會得到運行時異常,這將表明你的編程錯誤。