例如,我在Spring bootstrap 代码中看到了这一点(在带有webServer变量的catch块中):

@Override
public final void refresh() throws BeansException, IllegalStateException {
    try {
        super.refresh();
    }

    catch (RuntimeException ex) {
        WebServer webServer = this.webServer;
        if (webServer != null) {
            webServer.stop();
        }
        throw ex;
    }
}

为什么不做this.webServer.stop()呢?

局部变量webServer的用途是什么?

推荐答案

赋值的主要目的是避免在空判断之后和webServer.stop()调用之前,并发线程将this.webServer设置为null时产生NullPointerException.

也就是说,没有局部变量:

  1. 您的线程:this.webServer != null->;真的
  2. 另一个线程:this.webServer = null
  3. 您的线程:this.webServer.stop()->;可能导致NullPointerException(取决于步骤2中更改的可见性,这可能并不总是发生;竞争条件).

在其他形式的代码中,与重复引用字段相比,将字段指定给局部变量也有性能优势.

Java相关问答推荐

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

@ EnableRouting注释在Kotlin项目中不工作

Java中不同包中的类之间的配置共享

Oracle DUAL表上使用DDL时jOOQ问题的解析'

Springdoc Whitelabel Error Page with Spring V3

Java Stream,需要更新列表对象列表

多个Java线程和TreeMap.put()的非预期行为

Java inline Double条件和值解装箱崩溃

';com.itextpdf.ext.html.WebColors已弃用

如何在ApachePOI中将图像添加到工作表的页眉?

Kotlin内联互操作:强制装箱

将响应转换为带值的键

如何集成语义发布和BitBucket(Java项目)

有没有可能在时间范围内得到多种解决方案?

将java.util.Date(01.01.0001)转换为java.time.LocalDate将返回29.12.0000

在具有Quarkus Panache的PostgreSQL中将JSON数据存储为JSONB时,会将其存储为转义字符串

如何使用Java ZoneID的区域设置?

整数->;双取消框,但双->;int不';t开箱.为什么?

Java 21内置http客户端固定运营商线程

如何使用 Java 替换位于特定标记内的 XML 标记的 CDATA 内的值