2013-12-22 64 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,你会得到运行时异常,这将表明你的编程错误。