应该试试...捕捉到循环内部还是外部?

2022-08-31 06:14:34

我有一个看起来像这样的循环:

for (int i = 0; i < max; i++) {
    String myString = ...;
    float myNum = Float.parseFloat(myString);
    myFloats[i] = myNum;
}

这是一个方法的主要内容,该方法的唯一目的是返回浮点数组。我希望此方法在出现错误时返回,因此我将循环放在块内,如下所示:nulltry...catch

try {
    for (int i = 0; i < max; i++) {
        String myString = ...;
        float myNum = Float.parseFloat(myString);
        myFloats[i] = myNum;
    }
} catch (NumberFormatException ex) {
    return null;
}

但后来我也想到了把块放在循环中,就像这样:try...catch

for (int i = 0; i < max; i++) {
    String myString = ...;
    try {
        float myNum = Float.parseFloat(myString);
    } catch (NumberFormatException ex) {
        return null;
    }
    myFloats[i] = myNum;
}

是否有任何理由,无论是性能还是其他方面,都比另一个更偏爱?


编辑:共识似乎是,将循环放在 try/catch 中会更干净,可能放在它自己的方法中。但是,关于哪个更快仍然存在争议。有人可以测试一下并得到一个统一的答案吗?


答案 1

性能:

在 try/catch 结构的放置位置上绝对没有性能差异。在内部,它们作为代码范围表在调用方法时创建的结构中实现。当该方法正在执行时,try/catch 结构完全不在画面中,除非发生抛出,然后将错误的位置与表进行比较。

这里有一个参考:http://www.javaworld.com/javaworld/jw-01-1997/jw-01-hood.html

该表的描述大约在一半。


答案 2

性能:正如Jeffrey在他的回复中所说,在Java中,它没有太大区别。

通常,为了提高代码的可读性,选择捕获异常的位置取决于您是否希望循环继续处理。

在您的示例中,您在捕获异常时返回。在这种情况下,我会把 try/catch 放在循环中。如果你只是想抓住一个不好的价值,但继续处理,把它放在里面。

第三种方法:你总是可以编写自己的静态ParseFloat方法,并在该方法而不是循环中处理异常处理。使异常处理与循环本身隔离!

class Parsing
{
    public static Float MyParseFloat(string inputValue)
    {
        try
        {
            return Float.parseFloat(inputValue);
        }
        catch ( NumberFormatException e )
        {
            return null;
        }
    }

    // ....  your code
    for(int i = 0; i < max; i++) 
    {
        String myString = ...;
        Float myNum = Parsing.MyParseFloat(myString);
        if ( myNum == null ) return;
        myFloats[i] = (float) myNum;
    }
}

推荐