我在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");
}
}
现在,令人惊讶的是,尽管在main方法中没有尝试catch块或抛出子句,但它没有任何错误。
1.为什么a.eat()
没有在主方法中给出任何错误?
2.当我将IndexOutOfBoundsException
更改为简单Exception
时,这是一个编译时错误。为什么?
在kathy sierra的SCJP考试指南中阅读有关此内容的内容,但在此处无法理解这一概念。
答案 0 :(得分:3)
你不需要捕获IndexOutOfBoundsException
,它是RuntimeException。
答案 1 :(得分:3)
这里的主要困惑在于区分实际抛出异常并且只是声明它。 Java的不幸“检查异常”功能带来了混乱,因为调用一个只是声明来抛出一个已检查异常的方法会让你对它做一些事情,无论该方法是否真的可能永远抛出异常。
另一方面,编译器永远不会让你对未经检查的异常做任何事情,无论它们是否实际抛出。方法可以声明抛出未经检查的异常,但编译器基本上忽略该声明。它可能用于文档目的,但通常不会编写。
答案 2 :(得分:1)
并非所有异常都需要由程序员处理。他们中的一些人应该简单地粉碎应用程序,因为它们代表代码问题而不是输入。此类例外是RuntimeExceptions
。最着名的是NullPointerException
,它表示某些变量不包含对象的引用,但仍然用于调用该对象的方法。
现在看看IndexOutOfBoundsException
documentation,你会看到它扩展RuntimeException
,这意味着你不需要(但你可以)抓住它。这就是你的代码编译没有问题的原因。
答案 3 :(得分:0)
IndexOutOfBoundsException是unchecked RuntimeException,这就是您不需要处理它的原因。
答案 4 :(得分:0)
IndexOutOfBoundsException
是一个未经检查的异常,因此您不必在方法main的throws
列表中声明,Exception
是一个已检查的异常,它会产生编译时错误,因为您不要在main方法的throws
部分声明它,也不要使用try / catch块。答案 5 :(得分:0)
您必须牢固地理解为什么不应该捕获RuntimeException。因为这种类型的异常表明您的编程错误。通常不应出现此类异常。 例如,如果您有程序,其中用户输入数组中某些内容的索引,则应首先检查用户输入的数据,然后才将此数据传递给程序。如果您没有检查并且用户输入了-1,您将获得运行时异常,这将指示您的编程错误。