当前位置: 首页 > 面试题库 >

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

贝财
2023-03-14
问题内容

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

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进行跟踪并在最后检查一下?


问题答案:

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

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



 类似资料:
  • spring MVC中controllin异常流的良好实践是什么? 假设我有一个DAO类,它将对象保存到数据库中,但如果违反了某些规则,例如名称太长、年龄太低,则抛出异常, 现在,如果我想保存名称超过10的A,它应该抛出异常。 但是有一个dataManipulator对象 和控制器 我希望在不抛出异常的情况下保留控制器(我听说这是一个很好的做法)。 但我的问题是,在这种情况下,A\u Data\u

  • 问题内容: 考虑以下代码(特别是Java): 其中定义为: 基本上,仅在满足某些条件(不是灾难性的,但确实需要以某种方式提高条件)的情况下存在,这样才会知道会错误退出。 在这种情况下,您是否发现可以使用例外来控制流程?还是这是代码气味?如果是这样,您将如何重构呢? 问题答案: 这完全取决于错误条件是什么,以及方法的工作是什么。如果返回是为调用函数处理该错误的有效方法,那为什么会出错呢? 但是,通常

  • 问题内容: 我一直感到期望定期抛出异常并将其用作流逻辑是一件坏事。异常感觉应该是“ 异常 ”。如果您期望并计划一个异常,那似乎表明您的代码应该被重构,至少在.NET中是这样。 但是。最近的情况让我停顿了一下。我之前在msdn上发布了此内容,但我想对此进行更多讨论,这是一个理想的地方! 因此,假设您有一个数据库表,该表具有一个针对其他几个表的外键(在最初引发辩论的情况下,有4个外键指向该表)。您要允

  • 问题内容: 行, 我过去已经看过多次,但是最近在这里有我的问题。所以,我很好奇为什么 在python中会 是这种情况,因为生成器使用异常来指示数据的结束。 如果这对于使用python的每个人来说太糟糕了,为什么该语言将其包含在基本控制结构中?对于那些想阅读相关PEP的人,请点击此处。 问题答案: 因为结束生成器不是一个常见事件(我知道它会一直发生,但只会发生 一次 )。抛出异常被认为是昂贵的。如果

  • 主要讲3个 Promise Generator/yield Async/await 顺序执行的代码和错误有限的回调方式都是js引擎默认支持的,这部分大家会调用接口,无太多变化,而Promise是对callback的思考,或者说改良方案,目前使用非常普遍,这里详细讲解一下。 node里的Promise promise最早是在commonjs社区提出来的,当时提出了很多规范。比较接受的是promise

  • 问题内容: 我被分配了一个项目来开发一组用作存储系统接口的类。要求是该类支持具有以下签名的get方法: 基本上,该方法应该返回与if和仅在after之后被修改的对象相关联。如果存储系统不包含,则该方法应返回null。 我的问题是这样的: 如何处理场景的关键存在,但对象已经 不 被修改? 这很重要,因为使用此类的某些应用程序将是Web服务和Web应用程序。这些应用程序将需要知道是返回404(未找到)