关于抛出异常的困惑

时间:2013-07-03 08:54:40

标签: java exception

嗯,我听起来很天真。请原谅我。但我无法理解一个简单的场景。

以下是代码

class Utils {
    int getInt(String x) throws Exception {
        return 7;
    }
}

public class Tutorial4 extends Utils  {
    public static void main(String[] args) {
        Utils u = new Tutorial4();
        u.getInt("2");

    }

    int getInt(String arg) {
        return Integer.parseInt(arg);
    }
}

但是下面的代码显示了

的编译时错误
u.getInt("2");

它要求我声明或处理异常。

然而,当我覆盖上述方法时,为什么它显示错误

其次,当我用NUllPointerException代替Exception时,它没有给我任何错误

它背后的概念是什么?

由于

6 个答案:

答案 0 :(得分:3)

  

它要求我声明或处理异常。

是的。当您调用已声明要抛出异常的方法时,调用方法应该声明要抛出的异常,或者处理该异常。

  

然而,当我覆盖上述方法时,为什么它显示错误

覆盖方法时无法删除或减少限制。您的重写方法必须至少声明异常或它在重写方法中声明的子类。

  

其次,当我用NUllPointerException代替Exception时,它没有给我任何错误

NPE是未经检查的异常,因此不需要声明它被抛出。

答案 1 :(得分:1)

  

然而,当我覆盖上述方法时,为什么会显示   错误

这是因为变量u的类型是Utils。在Utils getInt()方法Exception抛出Tutorial4 u = new Tutorial4(); u.getInt(); Checked Exception

将声明更改为

Exception

此处您无需处理throws Exception,因为在覆盖时,您已从getInt()定义中删除了{{1}}子句

  

其次,当我给NUllPointerException代替Exception时   没有给我任何错误

因为NullPointerException是Unchecked Exception。如果任何方法抛出Unchecked异常,则不会强制调用者捕获异常。

答案 2 :(得分:1)

请看一下这个链接:http://www.artima.com/designtechniques/exceptions.html 对异常概念的描述非常容易理解。

  

但是下面的代码显示了编译时错误   它要求我声明或处理异常。

您已声明该方法抛出异常。通过覆盖你的意思是在riting中,所以你也继承了throws声明,因此你也得到了编译错误。

  

其次,当我用NUllPointerException代替Exception时,它没有给我任何错误

这是因为NullPointerException是一个RuntimeException,在编译期间没有标记为错误。请参阅上面链接中的小继承图。

答案 3 :(得分:0)

public static void main(String[] args)  throws Exception{
        Utils u = new Tutorial4();
        u.getInt("2");

    }

答案 4 :(得分:0)

<强> secondly when i give NUllPointerException in place of Exception it gives me no error

这是因为NPE是未经检查的例外。

答案 5 :(得分:0)

另外,在编写main方法时,最好处理异常。

 public static void main(String[] args) {

        try{


        }catch(Exception e){
           //do something with the exception here.
        }


    }

由于您也为main方法声明throws,您的程序将在main方法中断开