相关疑难解决方法(0)

Java异常有多慢?

问题:Java中的异常处理实际上是否很慢?

传统观念以及许多谷歌搜索结果表明,不应将特殊逻辑用于Java中的正常程序流程.通常有两个原因,

  1. 它确实很慢 - 甚至比常规代码慢一个数量级(给出的原因各不相同),

  1. 它很混乱,因为人们只希望在特殊代码中处理错误.

这个问题是关于#1.

例如,这个页面将Java异常处理描述为"非常慢",并将缓慢与异常消息字符串的创建联系起来 - "然后将此字符串用于创建抛出的异常对象.这并不快." Java中的有效异常处理这篇文章说"其原因在于异常处理的对象创建方面,从而使异常本身变得缓慢".另一个原因是堆栈跟踪生成减慢了它的速度.

我的测试(使用Java 1.6.0_07,Java HotSpot 10.0,在32位Linux上)表明异常处理并不比常规代码慢.我尝试在循环中运行一个执行一些代码的方法.在方法结束时,我使用布尔值来指示是返回还是抛出.这样实际处理是一样的.我尝试以不同的顺序运行方法并平均我的测试时间,认为它可能是JVM升温.在我的所有测试中,投掷至少与返回一样快,如果不是更快(最多快3.1%).我对我的测试错误的可能性持开放态度,但我没有看到代码示例,测试比较或过去一两年中显示Java中的异常处理的结果慢.

让我沿着这条路走下去的是我需要使用的API,它将异常作为正常控制逻辑的一部分.我想在他们的使用中纠正它们,但现在我可能无法做到.相反,我是否必须赞美他们的前瞻性思维?

即时编译中的高效Java异常处理文章中,作者建议单独存在异常处理程序,即使没有抛出异常,也足以阻止JIT编译器正确优化代码,从而减慢它的速度.我还没有测试过这个理论.

java performance exception-handling

471
推荐指数
10
解决办法
7万
查看次数

如果构造函数的参数是非法的,则防止实例化类?

我有一个公共构造函数,它接受一个参数(int age)来创建一个对象.我想检查传递的参数是否合法,例如年龄不能为负.如果它是非法的,那么就不要创建对象/实例.如果合法,没问题.

我只能想到一种方法 -

使构造函数私有化.使用参数(int age)创建一个静态方法来执行所有检查,如果传递非法值,则返回null.如果您传递合法值,则创建一个对象并返回其引用.这样做还有其他办法吗?也许来自构造函数本身?

编辑: 我想到了上述方法的一个问题.出于显而易见的原因,工厂方法/对象创建器方法只能是静态方法.如果工厂方法必须访问成员变量(进行一些检查)来创建对象,会发生什么?然后,我们将被迫使该成员变量静态.在所有情况下这可能都不合适.

是否有意义 ?

java

10
推荐指数
2
解决办法
7843
查看次数

异常处理的"切换"等价物

这通常不是关于异常处理的问题,但它特别适用于某些框架的使用.典型起点的几个例子:

  • GWT:接口的public void onFailure(Throwable caught)实现AsyncCallback.
  • JAX-RS:接口的public Response toResponse(E throwable)实现ExceptionMapper<E extends Throwable>.

上述两种方法都接收一个实例Throwable.通常,我看到开发人员使用一个简单的"if/else if"块来区分处理逻辑:

// As specified by the AsyncCallback class of the GWT framework
public void onFailure(Throwable caught) {
    if (caught instanceof AnException) {
        // handle AnException
    } else if (caught instanceof AnotherException) {
        // handle AnotherException
    } else if (caught instanceof YetAnotherException) {
        // handle YetAnotherException
    } else if (caught instanceof ...) {
        // and so on...
    }
} …
Run Code Online (Sandbox Code Playgroud)

java exception-handling

7
推荐指数
1
解决办法
979
查看次数

标签 统计

java ×3

exception-handling ×2

performance ×1