在调用抛出异常的方法时,是否必须在Java中包含catch块?

时间:2012-01-28 14:29:42

标签: java android ioexception next

我创建了一个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

,代码是否无法成功编译

5 个答案:

答案 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
} 

(任何时候都可能发生的ErrorRuntimeException例外不需要以这种方式声明。)

答案 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。