与Java中的Exception vs Throwable相关联的开销

我知道

throw new Exception(); 

有一个相当大的开销,因为它创建了一个完整的stackTrace等。
是否

 throw new Throwable(); 

出现同样的问题? 这种行为是inheritance的,还是抛出Throwable有一个较小的(o no)开销?

编辑
分析师的角度来看,插入错误密码的用户是程序正常执行顺序的例外。 如果我有:

 public Session newSession() { validate_user_and_password(); } 

分析师的角度来看,抛出UserNotValidException听起来是正确的。
如果您的代码具有相当好的抽象,则返回null0只是听起来不正确。 我只想知道我是否可以在代码中实现这一点,或者如果我不得不将其留给理论。

编程视点exception与分析师观点exception之间存在很大差异。

注意:我给出了一个非常简单而愚蠢的例子,这不是我的情况。
注2:我知道返回null将是普通的事情,但我需要有适当的抽象和OO代码,而且,就个人而言,我认为没有任何伤害。

Throwable创建时也会创建堆栈跟踪。 来自Throwable的java文档 :

throwable包含其创建时线程执行堆栈的快照。

因此,就创建堆栈跟踪的开销而言, ExceptionThrowable之间应该没有区别。

如果您使用“exception事件”的exception(就像您应该这样),那么您不应该过多关注堆栈跟踪的开销。 在运行代码中很少发生exception事件。 因此,exception不应以任何重要方式影响正常代码的性能。

不,你需要自己的子类来避免这种影响。

 Exception ex = new Exception() { @Override public Throwable fillInStackTrace() { return this; // and do nothing else } }; 

这会创建一个exception实例,它不会填充堆栈跟踪(创建例外委托给fillInStackTrace来实际填充堆栈跟踪),因此创建起来很便宜。

使用JIT编译,实际上并不是在Java中抛出Exception有很多被无意中听到的Exception 。 但投掷一个Throwable并没有太大的不同,因为你也会得到一个堆栈跟踪。

如果您感兴趣,有一篇非常有趣的论文称为“即时编译中的高效Javaexception处理”( 链接 )。 不是轻松阅读,但信息量很大。

你永远不应该扔或抓住Throwable. 例外的范围太大了。

如前所述,只有在需要时才应使用例外情况,即:在特殊情况下,应特别针对产生它们的情况。 除此之外,捕获Throwable意味着一系列exception,例如OutOfMemoryException 。 这种程度的错误无法从(轻松)恢复,并且不应由开发人员处理。

Throwable是Exception的父类。 所以Exception classinheritance自Throwable

您可以查看这两个类的源代码,看看除了暴露与Throwable相同的构造函数之外, Exception不会做任何事情。 所有的肉,因此头顶上,都生活在Throwable

即使Exception确实引入了一些额外的开销,使用Throwable也会明显过度优化。 使用正确的工具来完成工作,不要因为它更轻而选择错误的工具。

java.lang.Exception扩展了java.lang.Throwable ,因此它的开销相同。 来自Javadoc :

Throwable类是Java语言中所有错误和exception的超类。 只有作为此类(或其子类之一)的实例的对象才被Java虚拟机抛出,或者可以被Java throw语句抛出。 类似地,只有这个类或其子类之一可以是catch子句中的参数类型。

两个子类的实例Error和Exception通常用于表示发生了exception情况。 通常,这些实例是在特殊情况的上下文中新创建的,以便包括相关信息(例如堆栈跟踪数据)。

可抛出与异常

Java例外

正如@mangoDrunk所说:“Throwable是exception和错误的超类。”