【问题标题】:Difference between "throw(e)" and "throw e"?“throw(e)”和“throw e”的区别?
【发布时间】:2018-05-30 03:11:22
【问题描述】:

我遇到了这个重新抛出的异常,并且对它甚至可以编译感到惊讶。

} catch(SomeException e) {
    ...
    throw(e);
}

这个 throw() 和通常使用的有什么区别?...

} catch(SomeException e) {
    ...
    throw e;
}

是否有任何指向其中记录的链接或选择一个而不是另一个的指导?

【问题讨论】:

  • 他们是一样的
  • 看起来只是多余的分组括号。
  • @eis 在这种情况下,上下文应该记录在异常本身中。虽然我们正在这样做,但无论您是否重新抛出,记录 e.getMessage() 都是一个坏主意。
  • 我删除了 log() 行,以免混淆问题。
  • @eis 您在谈论不在异常中的日志记录信息。我不反对,我说的是不记录异常然后抛出 same 异常。

标签: java exception throw


【解决方案1】:

相当多的语言允许在表达式周围添加任意数量的括号。 Java就是其中之一。以下是完全有效的代码。

public class HelloWorld {
  public static void main(String[] args) {
    throw ((((new RuntimeException()))));
  }
}

所以绝对没有区别,只是你的源文件大了两个字节。

【讨论】:

  • "所以绝对没有区别,只是你的源文件大了两个字节。"而且可读性差很多。
【解决方案2】:

在功能上它们是等价的。

但是,不要选择throw(e);,因为有人可能会将其误认为是一个方法调用,而且至少会让别人不必要地怀疑你在做什么。为清楚起见,首选普通的throw e; 语法。

【讨论】:

  • 对。不必要的括号既不是功能必需的,也不是提高可读性的,容易出错和死代码。
【解决方案3】:

Throw 是抛出“可抛出”(通常是异常)的指令

想想它是否像一个返回语句

Public int get value() {
    return 3;
}

等价于

Public int get value() {
    return (3);
}

throwable 也一样。

表面上他们会遵守完全相同的事情。

【讨论】:

    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2014-03-18
    • 2020-08-03
    • 2010-12-22
    相关资源
    最近更新 更多