"throw(e)"和"throw e"的区别是什么?

4

我遇到了这个重新抛出的异常,甚至惊讶于它能够编译通过。

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

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

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

任何有关此文档或选择其中一个的指导链接?

4
它们是相同的。 - мυѕτавєւмo
1
看起来这只是多余的分组括号。 - Carcigenicate
2
在这种情况下,应该在异常本身中记录上下文。顺便说一句,无论您是否重新抛出异常,记录 e.getMessage() 都是一个不好的主意。 - biziclop
4
我已删除log()行,以免混淆问题的重点。 - noctonura
1
@eis,你说的是记录异常中没有的信息。我不反对这个,我说的是不要记录异常,然后抛出相同的异常。 - Andy Turner
显示剩余7条评论
3个回答

9

许多语言允许在表达式周围使用任意数量的括号,Java也是其中之一。以下代码是完全有效的。

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

所以除了你的源文件会多两个字节外,没有任何区别。


2
所以除了你的源文件会多两个字节之外,绝对没有任何区别。而且可读性也会大大降低。 - davidxxx

6

从功能上来说,它们是等效的。

然而,不要选择throw(e);,因为有人可能会误以为它是一个方法调用,最起码会让某些人不必要地想知道你在做什么。为了清晰明了,请优先选择正常的throw e;语法。


2
没错。不必要的括号既容易出错,又是死代码,对功能也没有任何改进。 - davidxxx

0

Throw是一个指令,用于抛出“可抛掷”(通常是异常)

可以将其视为返回语句

Public int get value() {
    return 3;
}

等同于的意思是

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

对于可抛出异常(Throwable)也是一样。

实际上它们都遵循完全相同的规则。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接