1

在这里,当我要从其他不要求我处理异常的地方调用此方法时,我在方法签名中使用了 throws。

 public class Exception {

        int a, b, c;

        void set(String data[]) throws NumberFormatException, ArrayIndexOutOfBoundsException {
            a = Integer.parseInt(data[0]);//convert the string into int. eg1.("12" ---> 12)  eg2.("df23" ---> fail)
            b = Integer.parseInt(data[1]);
            c = 0;
        }

        void divide() throws ArithmeticException {
            c = a / b;
        }

        void disp() {
            System.out.println(a + " / " + b + " = " + c);
        }
    }
4

2 回答 2

3

当我要从其他不要求我处理异常的地方调用此方法时。

是的,因为两者都是RuntimeException并且不能被捕获。

阅读有关异常和未经检查的异常的 java 教程。

有时您会看到声明RuntimeExceptions 的方法,就像您的方法一样。这是一种记录可能引发的异常的方法,即使您没有捕获它们。

除了user3168013的评论

我们如何能够将未经检查的异常转换为检查的异常。

每个异常都可能有原因。原因是导致它的另一个异常。如果没有原因,则为根异常。因此,您可以创建一个已检查异常的实例,将未经检查的异常作为原因传递给它,并抛出已检查的期望。

例如定义您的检查异常

public class DataFormatException extends Exception {
    public DataFormatException(Throwable cause) {
        super(cause);
    }
}

然后扔你自己的

void set(String data[]) throws DataFormatException {
    try {
        a = Integer.parseInt(data[0]);// convert the string into int.
                                        // eg1.("12"
                                        // ---> 12) eg2.("df23" ---> fail)
        b = Integer.parseInt(data[1]);
        c = 0;
    } catch (NumberFormatException e) {
        throw new DataFormatException(e);
    } catch (ArrayIndexOutOfBoundsException e) {
        throw new DataFormatException(e);
    }
}

当然,最好根据原因给出详细的异常消息,但这只是一个简短的示例。

于 2014-01-08T08:55:51.747 回答
1

两个例外都是 unchecked Exception. 未经检查的异常在运行时处理。

它的开发人员选择如何处理或不处理运行时异常,编译器从不强迫您处理。

查找有关处理 的更多信息Runtime Exception

于 2014-01-08T08:56:22.823 回答