【问题标题】:Java unhandled ExceptionJava 未处理的异常
【发布时间】:2016-01-14 15:32:30
【问题描述】:

我目前正在使用 Android Studio 开发 Android 应用,但遇到了一个我无法理解的错误。这是我的代码示例:

public class MyClass {

    public void method1() throws MyException {
        methodIO();     // Unhandled Exception: java.io.IOException
        methodRun();    // OK
    }

    public void method2() throws Exception {
        methodIO();     // OK
        methodRun();    // OK
    }

    public void methodIO() throws IOException {}

    public void methodRun() throws RuntimeException {}
}

class MyException extends Exception {

    public MyException(){super();}

    public MyException(String message, int errorCode) {
        super(message);
    }
}

我无法弄清楚为什么在 method1() 中,我有以下错误“未处理的异常:java.io.IOException”,而 method2() 编译正常。即使两个类都是从 Exception 继承的,抛出 RuntimeException 的方法也不会出现此问题。有人知道这里发生了什么吗?

Ps : 我想避免使用 try/catch 块或添加新的 throws 子句

【问题讨论】:

  • "我的方法通常是返回值。"这并不排除使用 try/catch。
  • 是的,当然。老实说,我只是想不明白这里出了什么问题。我会很容易地找到一种方法来使用 try/catch 确实做到这一点
  • “我想避免使用 try/catch 块或添加新的 throws 子句”如果您想调用 methodIO,这些是您仅有的两个选择。 (唯一的其他选择是不调用该方法。)

标签: java exception android-studio exception-handling compiler-errors


【解决方案1】:

MyException 没有扩展IOException,所以methodIO 抛出的IOException 目前没有被处理。

它在method2 中有效,因为ExceptionIOExceptionMyException 的公共超类,因此它指定了如何处理这两种类型的异常。

将其添加到method1throws 子句中:

public void method1() throws MyException, IOException {

或在方法体中捕获:

public void method1() throws MyException {
  try {
    methodIO();
  } catch (IOException e) {
    // Handle appropriately.
  }
}

【讨论】:

  • 我想避免在我的代码中使用 try/catch 或添加 throws 子句。我编辑了我的问题并添加了一个抛出 RuntimeException 的方法。使用抛出 en RuntimeException 的方法一切正常,而抛出 IOException 的方法出现错误。然而,RuntimeException 和 IOException 都继承自 Exception。
  • 如果您调用的方法会引发检查异常(Exception 的子类不是RuntimeException 的子类),您必须尝试/捕获它或将其添加到方法的throws;在 Java 中你别无选择,这就是检查异常处理的工作方式。 RuntimeException(及其子类)是未经检查的异常,因此您无需显式处理它们。
  • 好的,谢谢,我不知道检查和未检查异常的概念。
【解决方案2】:

method2() 有一个基类Exception 的 throws 声明,其中IOException 是派生类型;而method1() 抛出一个MyExceptionIOException 不是从该IOException 派生的。将IOException 添加到method1() 的 throws 声明中:

public void method1() throws MyException, IOException {
    methodIO(); 
}

或者您总是可以抓住IOException 并抛出MyException

public void method1() throws MyException {
    try {
        methodIO(); 
    } catch (IOException e) {
        throw new MyException();//construct MyException however; this is just an example
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-09
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多