我创建了一个Android应用程序。并键入一些代码,如:
public void onCreate(Bundle savedInstanceState) {
...
XmlResourceParser xrp = getResources().getXml(R.xml.OneXml); <==OneXml is a custom xml file in folder res/xml
...
try {
....
xrp.next();
....
} catch(IOException e) {
e.printStackTrace();
} catch(XmlPullParserException e) {
e.printStackTrace();
}
...
我发现我既不能删除catch(IOException e)
也不能删除catch(XmlPullParserException e)
,当我尝试删除其中一个时,Eclipse会在xrp.next()
标记错误并告诉我 未处理的异常类型IOException 或 未处理的异常类型XmlPullParserException ,所以我必须添加两个catch
吗?为什么Eclipse要求我强制添加两个catch
?如果没有两个catch
?
答案 0 :(得分:2)
异常处理方式:
我们可以处理问题陈述&#39; (问题陈述是可以抛出异常的任何陈述)有两种方式。
try-catch
块中。throws
子句。 在重写方法中处理异常:
如果要覆盖子类中的方法。然后你不能在其签名中附加额外的throws子句。在你的情况下,onCreate
是父类中的一个方法,它在子类中被重写,因此我们不能在其标题中附加throws子句。所以你必须附上任何问题陈述&#39;在try-catch块中的onCreate
方法中。
<强>示例:强>
将语句括在try-catch
块中。
public void myMethod(){
try{
// Problem Statement
}catch(IllegalAccessException e){
e.printStackTrace();
}catch(NullPointerException e){
e.printStackTrace();
}
}
在方法标题中附加throws
子句。
public void myMethod()
throws IllegalAccessException, NullPointerException{
// Problem Statement
}
示例重写方法:
有效throws子句:如果覆盖方法中的throws子句也在父&#39; smethod中,则该子句有效。
public class Parent {
public int method()
throws IllegalAccessException,NullPointerException, Exception {
return 0;
}
}
public class child extends Parent {
// throws is part of method because parent method
// have throws clause
@Override
public int method()
throws IllegalAccessException, NullPointerException,
Exception {
//Problem Statement
return super.method();
}
}
无效的throws子句:如果在父方法中不存在,则重写方法中的throws子句无效。
public class Parent {
public int method(){
return 0;
}
}
public class child extends Parent {
//**Error:** We can not append throws clause in the method because
// parent method do not have a throws clause
@Override
public int method()
throws IllegalAccessException, NullPointerException,
Exception {
//Problem Statement
return super.method();
}
}
因此,我们必须修改子类的方法并删除throws
子句,因为父方法在这种特定情况下不包含throws子句。我们必须通过try-catch
阻止处理异常。
public class child extends Parent {
//**Error:** We can not append throws clause in the method because
// parent method do not have a throws clause
@Override
public int method() {
try{
// Problem Statement
}catch(IllegalAccessException e){
e.printStackTrace();
}catch(NullPointerException e){
e.printStackTrace();
}
}
}
答案 1 :(得分:1)
在Java中,您必须捕获异常或声明调用该方法可能导致异常的事实,如下所示:
public void onSomethingOtherThanCreate(Bundle savedInstanceState)
throws IOException, XmlPullParserException
{
// your code without any try/catch
}
(任何时候都可能发生的Error
和RuntimeException
例外不需要以这种方式声明。)
答案 2 :(得分:0)
这就是检查异常的意思:你必须抓住它们,或者声明它们被抛出。
onCreate
被覆盖并且必须遵守原始方法的声明,因此要么捕获它们,要么在另一种捕获它们的方法中执行该部分工作,这是您唯一的选择。
有关详细信息,请参阅JLS 11 Exceptions,特别是JLS 11.2.3 Exception Checking。
答案 3 :(得分:0)
它不是Eclipse,它是Java!
在一个方法中,抛出异常的代码必须驻留在try-catch
块内,除非在方法声明本身中使用了未赋予异常的异常的throws
子句。
答案 4 :(得分:0)
如果您的投诉是您必须键入两个 catch子句,则可以在一个子句中捕获它们,
catch (Exception e) {
// dostuff here
}
但是,除非你打算做的只是打印堆栈跟踪或记录异常,否则这种做法是不受欢迎的。从长远来看,它将使代码更难调试和维护。
Java 7允许您catch multiple exceptions in a single clause,但Android尚不支持Java 7。