Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这里是否抛出异常?_Java_Exception - Fatal编程技术网

Java 这里是否抛出异常?

Java 这里是否抛出异常?,java,exception,Java,Exception,我有这个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 Ani

我有这个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方法中没有try-catch块或抛出子句,但它仍然可以正常工作。
1.为什么
a.eat()
在main方法中没有给出任何错误?
2.当我将
IndexOutOfBoundsException
更改为simply
Exception
时,这是一个编译时错误。为什么?


在kathy sierra的SCJP考试指南中阅读了一些关于这方面的内容,但无法理解此处的概念。

您不必捕捉
索引自动边界异常,它是RuntimeException


检查

IndexOutOfBoundsException的类型是一个RuntimeException,这就是您不需要处理它的原因

并非所有异常都需要程序员处理。他们中的一些人只是被认为会破坏应用程序,因为他们代表的是代码问题,而不是输入问题。这些异常是
运行时异常
。最著名的是
NullPointerException
,它表示一些变量不包含对对象的引用,但仍然用于调用该对象的方法

现在看看,您将看到它扩展了
RuntimeException
,这意味着您不需要(但您可以)捕获它。这就是代码编译没有问题的原因

  • 为什么你认为它应该给出一个错误
  • IndexOutOfBoundsException
    是未检查的异常,因此您不必在方法main的
    throws
    列表中声明,
    Exception
    是一个选中的异常,它会给出编译时错误,因为您没有在main方法的
    throws
    部分中声明它,也没有使用try/catch块

  • 这里的主要混淆在于区分实际抛出异常和仅声明异常。这种混乱是由Java不幸的检查异常“特性”引起的,因为调用一个只声明抛出检查异常的方法将使您对它做一些事情,而不管该方法是否真的抛出异常


    另一方面,编译器永远不会让您对未检查的异常执行任何操作,不管它们是否实际抛出。方法可以声明抛出未检查的异常,但编译器基本上忽略该声明。它可能用于文档目的,但通常根本不是编写的。

    您必须坚定地理解为什么不应该捕获RuntimeException。因为这种类型的异常表示您的编程错误。通常不应出现此类异常。
    例如,如果您有一个程序,用户在其中输入数组中某个内容的索引,则应首先检查用户输入的数据,然后将该数据传递给该程序。如果未选中并且用户输入了-1,您将获得运行时异常,该异常将指示您的编程错误。

    IndexOutOfBoundsException是一个运行时异常,因此不需要特殊处理。IndexOutOfBoundsException是一个运行时异常。请参阅。可能的副本