小编典典

Java:作为控制流的异常吗?

java

我听说对控制流使用异常是不好的做法。你觉得这怎么样?

public static findStringMatch(g0, g1) {

    int g0Left = -1;
    int g0Right = -1;
    int g1Left = -1;
    int g1Right = -1;

//if a match is found, set the above ints to the proper indices
//...
//if not, the ints remain -1

        try {
            String gL0 = g0.substring(0, g0Left);
            String gL1 = g1.substring(0, g1Left);

            String g0match = g0.substring(g0Left, g0Right);
            String g1match = g1.substring(g1Left, g1Right);

            String gR0 = g0.substring(g0Right);
            String gR1 = g1.substring(g1Right);

            return new StringMatch(gL0, gR0, g0match, g1match, gL1, gR1);
        }
        catch (StringIndexOutOfBoundsException e) {
            return new StringMatch(); //no match found
        }

因此,如果未找到匹配项,则整数将为-1。当我尝试使用子字符串时,这将导致异常g0.substring(0, -1)。然后,该函数仅返回一个对象,指示未找到匹配项。

这是不好的做法吗?我可以手动检查每个索引以查看它们是否都为-1,但这感觉需要更多工作。

更新

我已经删除了try-catch块,并用以下代码替换了它:

    if (g0Left == -1 || g0Right == -1 || g1Left == -1 || g1Right == -1) {
        return new StringMatch();
    }

哪个更好:检查每个变量是否为-1,还是使用布尔值foundMatch进行跟踪并在最后检查一下?


阅读 224

收藏
2020-09-08

共1个答案

小编典典

通常情况下,例外是昂贵的操作,顾名思义,是例外情况。因此,在控制应用程序流的上下文中使用它们确实被认为是不好的做法。

特别是在您提供的示例中,您需要对提供给StringMatch构造函数的输入进行一些基本验证。如果它是在某些基本参数验证失败的情况下返回错误代码的方法,则可以避免事前检查,但事实并非如此。

2020-09-08