1

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

以下是一段代码

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 时,它没有给我任何错误

它背后的概念是什么?

谢谢

4

6 回答 6

3

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

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

但是,当我覆盖上述方法时,为什么它会显示错误

覆盖方法时不能删除或减少限制。您的覆盖方法必须至少声明异常或其在被覆盖方法中声明的子类。

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

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

于 2013-07-03T08:58:01.927 回答
1

但是,当我覆盖上述方法时,为什么它会显示错误

那是因为你的变量的类型uUtils. 并且在Utils方法中getInt()抛出了一个ExceptionChecked Exception

将声明更改为

Tutorial4 u = new Tutorial4();
u.getInt();

在这里您不必处理,Exception因为在覆盖时,您已从定义中删除了该throws Exception子句getInt()

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

因为 NullPointerException 是Unchecked Exception。并且如果任何方法抛出未经检查的异常,则调用者无权捕获该异常。

于 2013-07-03T08:58:15.553 回答
1

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

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

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

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

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

于 2013-07-03T09:05:41.500 回答
0
public static void main(String[] args)  throws Exception{
        Utils u = new Tutorial4();
        u.getInt("2");

    }
于 2013-07-03T08:57:52.560 回答
0

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

这是因为 NPE 是未经检查的异常。

于 2013-07-03T08:59:59.530 回答
0

此外,当您编写 main 方法时,最好在其中处理异常。

 public static void main(String[] args) {

        try{


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


    }

由于您还声明throws了 main 方法,因此您的程序将中断 main 方法

于 2013-07-03T09:02:08.773 回答