【问题标题】:IDE forces to surround with try/catch and not throw the exceptionIDE 强制使用 try/catch 包围而不抛出异常
【发布时间】:2013-07-27 01:09:06
【问题描述】:

我了解已检查异常和未检查异常之间的区别。 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));
}

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

您可以阅读Context.writehere的函数签名作为参考。

谢谢。

【问题讨论】:

  • 你能展示一些代码示例吗?我现在想到的唯一原因是最终你需要捕获异常并处理它。 throwing exceptions 用于让客户端类处理异常,您可能会不断抛出异常但最终需要捕获它。
  • 您也可以解释一下“只给我一个环绕...的选项”的意思——您是如何提出这个选项的?
  • @rcook eclipse 在您编写有错误的代码时显示快速修复,并在您将鼠标悬停在突出显示的区域时建议一些操作
  • @MoayadAl-sowayegh:我已经编辑了我的问题以添加示例代码。

标签: java exception exception-handling try-catch


【解决方案1】:

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

【讨论】:

  • 不,您可以删除它。无法添加。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    相关资源
    最近更新 更多