我理解已检查和未检查的异常之间的区别。 Java编译器强制程序员使用try / catch块包围已检查的异常,或者在方法签名中添加throw声明。
但是有时我看到在Eclipse中,编译器只给我一个选项,用try / catch块包围语句而不抛出它。为什么会这样?这是因为在继承层次结构中,类(包含可能产生异常的代码)位于顶部吗?
作为一个例子,我正在为Hadopp
映射器编写一个map函数:
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 InterruptedException
,Context.write()
抛出,Eclipse只给我一个选项,可以通过try / catch块包围它,而不是在层次结构中向上抛出它。为什么会这样?
作为参考,您可以阅读Context.write
here的功能签名。
感谢。
答案 0 :(得分:2)
throws
是方法签名的一部分。如果要定义抽象方法,则必须遵循其签名。您无法在实施时添加throws
。
答案 1 :(得分:0)
如果一个方法覆盖了一个未被声明为抛出特定已检查异常的方法,并且一个方法正在调用一个方法,该方法被声明为抛出一个预期要处理的已检查异常,那么应该捕获该异常,处理它,并且不要重新抛出它。如果一个人不期望在被调用的方法实际抛出指示的已检查异常的情况下出现任何情况,那么应该捕获该异常,将其包装在从RuntimeException
派生的某种类型中,并将其抛出。有些人主张空洞的陈述,但我认为这是一种反模式。如果一个方法预计永远不会抛出某个异常,但无论如何都会这样做,这几乎意味着程序员没有考虑并且不准备处理的某些条件存在。如果异常被悄悄吞下,那么程序可能会盲目地绊倒做正确的事情,但是没有理由期待在意外异常之后的正确行为。