6

我了解已检查和未检查异常之间的区别。Java 编译器强制程序员要么用 try/catch 块包围检查的异常,要么在方法签名中添加 throw 声明。

但是有时我看到在 Eclipse 中,编译器只给了我一个选项来用 try/catch 块包围语句而不是抛出它。为什么会这样?这是因为在继承层次结构中,类(包含可能产生异常的代码)位于顶部?

例如,我正在为映射器编写一个映射函数Hadopp

public void map(BytesWritable key, Text value, Context context) {
    String[] fields = value.toString().split("\t");
    String referrer = fields[10];
    context.write(new LongWritable(referrer.length()), new Text(
                    referrer));
}

这是一个非常简单的映射函数,我从一行中提取一个字段并将其长度作为键发出,并将其本身作为值发出。现在,我得到一个抛出的错误Unhandled exception type InterruptedExceptionContext.write()Eclipse 只给了我一个选项,用 try/catch 块包围它,而不是在层次结构中向上抛出它。为什么会这样?

作为参考,您可以阅读Context.write 此处的函数签名。

谢谢。

4

2 回答 2

2

throws是方法签名的一部分。如果要定义抽象方法,则必须遵守其签名。您不能throws在实施时添加。

于 2013-07-27T02:58:07.493 回答
0

如果一个人正在重写一个未声明为抛出特定检查异常的方法,并且一个人正在调用一个声明为抛出一个期望处理的检查异常的方法,则应该捕获该异常,处理它,而不是重新抛出它. 如果不希望出现任何被调用的方法实际上会抛出指示的检查异常的情况,则应捕获该异常,将其包装在某种派生自RuntimeException,然后扔那个。有些人提倡空的 catch 声明,但我认为这是一种反模式。如果一个方法被期望永远不会抛出某个异常,但它无论如何都会抛出异常,这几乎意味着存在一些程序员没有考虑并且没有准备好处理的条件。如果异常被默默地吞下,程序可能会盲目地做正确的事情,但是没有理由期望在意外异常之后有正确的行为。

于 2013-07-30T18:49:24.890 回答