首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java异常的内部元素

Java异常的内部元素
EN

Stack Overflow用户
提问于 2015-06-22 20:46:55
回答 2查看 419关注 0票数 1

open中的本机方法fillInStackTrace发出一个调用JVM_FillInStackTrace(env,throwable)是该方法的来源。

抛出是jvm指令athrow。与程序集Jvm本身类似的东西是本机代码,所以在jvm中实现的任何东西都是本机too.So,是抛出本机吗?换句话说,对fillInStackTrace的内部调用不会导致通常的JNI调用?(而成本是填充堆栈跟踪)。

是试图捕获缓存的异常,保证工作的?异常表将如何是filled.For,相同的异常,会有多个匹配的catch块吗?

在web应用程序(或具有类似延迟的任何应用程序)中真的很昂贵吗?说,web服务get/employee/{invalid_id}抛出javax.ws.rs NotFoundException,而不是使用if/javax.ws.rs返回一个404响应。考虑到http请求、响应和object序列化/反序列化的成本,异常的成本并不高。

EN

回答 2

Stack Overflow用户

发布于 2015-06-23 03:58:25

创建异常对象时,需要捕获堆栈跟踪。JVM通过遍历java堆栈来查找调用链中的所有方法,从而达到这个目的。

当调用方法时,fillInStackTrace方法的成本与java堆栈的深度成正比。与此成本相比,JNI相对于内部开销更低。

异常捕获独立于使用缓存的异常或新创建的异常。在执行athrow字节码时,JVM遍历java堆栈,并寻找能够处理当前异常类型的catch块的方法。

异常是针对异常事件的,不应用于控制流。

票数 1
EN

Stack Overflow用户

发布于 2015-06-23 05:00:54

在实践中,异常用于非本地控制流。例如,jruby和scala (可能还有其他基于JVM的语言)使用它们来中断函数循环体或从闭包返回外部函数。

但是,它们使用的优化不填充堆栈跟踪和/或使用预先分配的异常,JVM将这些异常优化为goto (如果可以内联的话)。但这些都是没有其他选择的专门案例。

在一般情况下,异常只能用来表示异常行为。

例外仍然可以意味着预期,但不常见的情况下,可以认为是一个缓慢的代码路径,其中异常恢复是如此昂贵,无论如何,产生异常是一个微不足道的代价相比。各种与网络相关的异常将是一个例子,因为网络从来都不是100%可靠的,但是错误也不会主导大部分操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30989519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档