Java IDE强制使用try/catch包围,而不抛出异常

Java IDE强制使用try/catch包围,而不抛出异常,java,exception,exception-handling,try-catch,Java,Exception,Exception Handling,Try Catch,我理解检查异常和未检查异常之间的区别。Java编译器迫使程序员要么用try/catch块包围已检查的异常,要么在方法签名中添加throw声明 然而,有时我看到在Eclipse中,编译器只给我一个选项,用try/catch块包围语句,而不是抛出它。为什么会这样?这是因为在继承层次结构中,类(包含可能产生异常的代码)位于顶部吗 例如,我正在为Hadoppmapper编写一个map函数: public void map(BytesWritable key, Text value, Context co

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

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

例如,我正在为
Hadopp
mapper编写一个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));
}
这是一个非常简单的映射函数,我从一行中提取一个字段,并将它的长度作为一个键,将其本身作为一个值。现在,我得到了一个错误
未处理的异常类型InterruptedException
,它
Context.write()
抛出,Eclipse只给了我一个选项,用try/catch块包围它,而不是在层次结构中向上抛出它。为什么会这样

有关参考,您可以阅读
Context.write的函数签名


谢谢。

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

如果您正在重写一个未声明为抛出特定检查异常的方法,并且正在调用一个声明为抛出希望处理的检查异常的方法,那么您应该捕获该异常,处理它,而不是重新抛出它。如果不希望出现被调用的方法实际抛出所指示的已检查异常的任何情况,则应捕获该异常,将其包装为从
RuntimeException
派生的某种类型,然后抛出该异常。有些人主张一种空洞的捕获声明,但我认为这是一种反模式。如果期望一个方法永远不会抛出某个异常,但它无论如何都会抛出,这就意味着存在一些程序员没有考虑也不准备处理的条件。如果异常被悄悄地吞没,程序可能会盲目地错误地做正确的事情,但是没有理由期望在发生意外异常后有正确的行为。

您能展示一些代码示例吗。我现在唯一的想法是,最终你需要捕捉异常并处理它。抛出异常用于让客户端类处理异常,您可以继续抛出异常,但最终需要捕获它。您还可以解释“只给我一个环绕的选项…”的含义-如何启用此选项?@rcook eclipse在您编写有错误的代码时会显示快速修复,如果您将鼠标悬停在突出显示的屏幕上,则会建议一些操作area@MoayadAl-索瓦耶:我已经编辑了我的问题,添加了一个示例代码。不,你可以删除它。你不能添加它。