相关疑难解决方法(0)

Java if try/catch开销

Java中是否存在使用try/catch块的开销,而不是if块(假设所附的代码没有请求)?

例如,对字符串采用以下两种简单的"安全修剪"方法:

public String tryTrim(String raw) {
    try {
        return raw.trim();
    } catch (Exception e) {
    }
    return null;
}

public String ifTrim(String raw) {
    if (raw == null) {
        return null;
    }
    return raw.trim();
}
Run Code Online (Sandbox Code Playgroud)

如果raw输入很少null,两种方法之间是否有任何性能差异

此外,使用该方法简化代码布局是一种很好的编程模式tryTrim(),特别是当通过将代码封装在一个try/catch块中可以避免许多if块检查稀有错误条件时?

例如,一个常见的情况是使用一个方法N parameters,M <= N在其开始附近使用它们,如果任何这样的参数是"无效的"(例如,空或空字符串),则快速且确定地失败,而不影响其余的码.

在这种情况下,不必编写k * M if块(其中k每个参数的平均检查次数,例如k = 2对于null或空字符串),try/catch块将显着缩短代码并且可以使用1-2行注释明确地注意到"非常规"逻辑.

这样的模式也会加速该方法,特别是如果错误条件很少发生,并且它会这样做而不会影响程序安全性(假设错误条件是"正常"的,例如在字符串处理方法中为null或空值)是可以接受的,虽然很少存在).

java if-statement exception-handling try-catch overhead

55
推荐指数
4
解决办法
4万
查看次数

35
推荐指数
6
解决办法
1万
查看次数

有没有更好的方法在Java中执行空检查?

这可能看起来像一个原始问题,或者可以通过我不知道的简单实用程序库方法来完成。

目的是检查嵌套在两个对象下的布尔字段的值。

private boolean sourceWebsite(Registration registration) {
    Application application = registration.getApplication();
    if (application == null) {
        return true;
    }

    Metadata metadata = application.getMetadata();
    if (metadata == null) {
        return true;
    }

    Boolean source = metadata.getSource();
    if (source == null) {
        return true;
    }

    return !source;
}
Run Code Online (Sandbox Code Playgroud)

我知道这可以一次完成if()if为了可读性,我在这里添加了多个。

有没有一种方法可以简化上面的if语句,并有一个简单的实用工具类返回Boolean source父对象是否为null的值?

java conditional if-statement

23
推荐指数
2
解决办法
2032
查看次数

当99%的时间对象不为空时,空检查与try/catch

通常我更喜欢空检查.但在目前的情况下,我知道大部分时间我的if条件都会通过,并且很少有合法的场景,其中object可能为null.

此外,负载是巨大的(约500万次电话/小时)

现在我试图从性能角度找出哪种方式更好.已经检查过java中的try/catch vs null检查,但我的情况是唯一的.

还检查哪个更快,在java中尝试catch或if-else(WRT性能)但是这个和上面的都是在通用上下文中,其中通过/失败比率的知识不可用.

public void process(Job job) {
    //... some code which processes job

    SubJob subJob = job.getSubJob();
    if(subJob != null) {  // 99% of the time this will pass
        //.. do something
    }               
}
Run Code Online (Sandbox Code Playgroud)

尝试/捕捉版本

public void process(Job job) {
    //... some code which processes job

    SubJob subJob = job.getSubJob();
    try {
        //.. do something  
    }catch(NullPointerException e) { //This may occure only 1% of the time. 
        //...   
    }               
}
Run Code Online (Sandbox Code Playgroud)

更新:

获胜者是空检查.在Try/catch中,内部JVM将执行空检查并且无论如何都会抛出NPE,并且在JVM中创建异常处理(堆栈等的创建)将是开销.另外,根据另一个答案,现代CPU足够聪明,可以通过良好的预测来处理这些情况,在我的独特案例中,这些预测总是有利于.

我还编写了程序(在我的名字下面发布),结果清楚地表明我的AMD处理器上的空检查更好. …

java

8
推荐指数
1
解决办法
1185
查看次数