我听说对控制流使用异常是不好的做法。你觉得这怎么样?
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)。然后,该函数仅返回一个对象,指示未找到匹配项。
g0.substring(0, -1)
这是不好的做法吗?我可以手动检查每个索引以查看它们是否都为-1,但这感觉需要更多工作。
更新
我已经删除了try-catch块,并用以下代码替换了它:
if (g0Left == -1 || g0Right == -1 || g1Left == -1 || g1Right == -1) { return new StringMatch(); }
哪个更好:检查每个变量是否为-1,还是使用布尔值foundMatch进行跟踪并在最后检查一下?
foundMatch
通常情况下,例外是昂贵的操作,顾名思义,是例外情况。因此,在控制应用程序流的上下文中使用它们确实被认为是不好的做法。
特别是在您提供的示例中,您需要对提供给StringMatch构造函数的输入进行一些基本验证。如果它是在某些基本参数验证失败的情况下返回错误代码的方法,则可以避免事前检查,但事实并非如此。