我想知道这段代码工作的原因,在这段代码中,我实例化了一个if块中的对象,而这个对象的作用域在整个代码的if块之外.这种情况的特殊性在于,它仅在条件为假时才起作用,并且在条件为真的情况下具有相应的抛出异常.如果该条件没有被否定或没有引发,则在代码中的任何位置都不能再访问该对象.这里是一个代码的例子,完全按照我提到的那样工作,但我想了解为什么会这样,因为我还没有在互联网上找到正式的解释.

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void procesarDatos(Map<String, Object> datos) {
        if (!(datos.get("tipo") instanceof String tipo && tipo.equals("A"))) {

            throw new RuntimeException("Error");
        }
        System.out.println(tipo);
    }

    public static void main(String[] args) {
        Map<String, Object> datosA = new HashMap<>();
        datosA.put("tipo", "A");
        procesarDatos(datosA);

    }
}

我试着理解这个代码发生了什么,为什么它会起作用,因为我找不到任何关于它的信息

推荐答案

根据文件:https://docs.oracle.com/en/java/javase/17/language/pattern-matching-instanceof-operator.html#GUID-843060B5-240C-4F47-A7B0-95C42E5B08A7

模式变量的作用域是程序可以 仅当instanceof运算符为true时才达到

模式变量的作用域可以扩展到语句之外, 把它介绍

在您的例子中,tipo是可访问的,因为它是String的实例,即使它不在引入它的块中

Java相关问答推荐

Gmail Javi API批量处理太多请求

Springdoc Whitelabel Error Page with Spring V3

为什么BasicComboBoxRenderer在文本不存在或文本为空的情况下设置两次文本?

需要一个找不到的jakarta.sistence.EntityManager类型的Bean

使用联接和分页的SpringBoot Spring数据JPA

为什么在maven中,getLast方法不适用于List?

如何让JavaFx应用程序识别依赖项?

是否为计划任务补偿系统睡眠?

Spring动态反序列化JSON可以是列表,也可以只是一个对象

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

Java中HashSet的搜索时间与TreeSet的搜索时间

如何在运行docker的应用程序中获取指定的配置文件

使用迭代器遍历HashMap不会因IF条件而停止

为什么JavaFX MediaPlayer音频播放在Windows和Mac上运行良好,但在Linux(POPOS/Ubuntu)上却有问题?

活泼的一次判断成语,结果中等

如何在MPAndroidChart中的条形图上正确添加标签

当我try 返回可选时,Mock无法正常工作

Springboot应用程序无法识别任何@RestController或@Service,我认为@Repository也无法识别

为什么当我输入变量而不是直接输入字符串时,我的方法不起作用?

在数组列表中找到对象后,未从数组中删除对象