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

Java异常处理-样式

姚麒
2023-03-14
问题内容

从历史上看,我总是这样编写我的异常处理代码:

    Cursor cursor = null;
    try {
        cursor = db.openCursor(null, null);
        // do stuff
    } finally {
        if (cursor != null) cursor.close();
    }

但是最近,出于可读性和懒惰的原因,我开始这样做:

        Cursor cursor = db.openCursor(null, null);
        try {           
            // do stuff
        } finally {
            cursor.close();
        }

我将光标(jdbc句柄,无论如何)的赋值从try-catch-finally块中分配出来是错误的吗?

除非JVM实际上在分配上爆炸,否则在分配和try块中任何内容的第一行之间,我不确定我的旧样式是否会带来任何额外的价值,而第二种肯定更易读和简洁。文献通常总是采用第一种风格。

编辑 -假设我很高兴,同时初始化光标不是在这个代码块被抓,我在这个例子中唯一关心的是关闭游标,如果它通过openCursor抛出的异常
分配和打开。还要 假设我正在测试null 等。等等。yadda … yadda
…(我更改了示例以反映这一点,这不是我的问题的重点,因此我没有将其包括在第一版)


问题答案:

如果最后要做的就是关闭游标,则第二种形式是正确的。如果openCursor()失败,您将 永远不会 关闭光标。该变量的值甚至都不会被设置。

正如其他人所暗示的,警告是,如果您要进行其他初始化,而该初始化需要自己进行清理,那么从逻辑上讲,必须进入finally
{}并相应地更改范围。尽管在这种情况下我会主张进行重组。

底线:按照书面形式,第一个版本不必要地复杂。第二个版本是正确的。

编辑:结合我的其他评论为后代…

第一个示例似乎无害,因为它所做的只是添加一堆不必要的代码。(完全不需要,如果还不清楚的话。)但是,在经典的“更多代码意味着更多潜在错误”的方式中,有一个隐藏的陷阱。

如果出于某种原因“
//做某事”代码无意中清除了游标变量,那么您将无声地泄漏游标,而至少在获得NullPointerException之前。由于额外的代码绝对没有任何用处,因此完全不需要额外的风险。

因此,我愿意将第一个示例称为“完全错误”。我当然会在代码审查中标记它。



 类似资料:
  • 问题内容: 我一直在概念上为我的项目决定异常处理结构。 假设您有一个示例: 还有两个子类FileData和StaticData,它们从某些指定的文件中读取数据,StaticData仅返回一些预定义的常量数据。 现在,在读取文件时,可能会在FileData中引发IOException,但是StaticData将永远不会抛出。大多数样式指南建议在调用堆栈上传播Exception,直到有足够的上下文可以

  • 主要内容:异常简介,异常类型很多事件并非总是按照人们自己设计意愿顺利发展的,经常出现这样那样的异常情况。例如: 你计划周末郊游,计划从家里出发→到达目的→游泳→烧烤→回家。但天有不测风云,当你准备烧烤时候突然天降大雨,只能终止郊游提前回家。“天降大雨”是一种异常情况,你的计划应该考虑到这样的情况,并且应该有处理这种异常的预案。 计算机程序的编写也需要考虑处理这些异常情况。 异常(exception)是在运行程序时产生的一种异

  • 我期望第1行捕获从第0行抛出的NullPointerException,但它没有发生。 但为什么呢?。 当定义了另一个catch块时,为什么第1行的NPE处理程序不能捕获它? 是因为“投掷”直接进入main()方法吗?

  • Java 的异常处理是 Java 语言的一大重要特性,也是提高代码健壮性的最强大方法之一。当我们编写了错误的代码时,编译器在编译期间可能会抛出异常,有时候即使编译正常,在运行代码的时候也可能会抛出异常。本小节我们将介绍什么是异常、Java 中异常类的架构、如何进行异常处理、如何自定义异常、什么是异常链、如何使用异常链等内容。 1. 什么是异常 异常就是程序上的错误,我们在编写程序的时候经常会产生错

  • 问题内容: 我想从用户那里接收Double并处理抛出的异常,以防用户未输入double / int;在这种情况下,我想请用户再次输入金额。如果捕获到异常,我的代码将陷入循环,并继续打印“插入量”。 先感谢您。 问题答案: 你的程序进入时遇到一个无效的输入,因为一个无限循环,并 没有 消耗无效令牌。因此,导致该异常的任何标记都将保留在那里,并在下次您尝试读取double时继续引发异常。 这可以通过以

  • 我使用的是java JDK1.8版本。当我将任何数字除以零(0)时,它会显示消息“infinity”。而它应该在运行时显示ArithmeticException:/zero。原因是什么。