嗯,我听起来很天真。请原谅我。但我无法理解一个简单的场景。
以下是代码
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时,它没有给我任何错误
它背后的概念是什么?
由于
答案 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方法中断开