gpt4 book ai didi

java - "Variable might not have been initialized"编译时未给出错误

转载 作者:行者123 更新时间:2023-12-02 10:48:51 29 4
gpt4 key购买 nike

在使用 SpringBoot 开发 API 时,我必须制作一个 QueryBuilder为了构建一个可以使用 JDBC 从数据库获取结果的查询。

我的查询的初始结构看起来像

public static class Query {
private String table;
private QueryType queryType;
private List<String> column;
private List<Fields> where;
private List<String> groupBy;
private String orderBy;
private Map<String,Object> extraFields;
}

为了设置给定字段中的值,我使用了公共(public)函数,例如:

public Query addTable(final String tableName){
this.table = tableName;
return this;
}

public Query addExtraField( String key, Object value){
if(null==this.extraFields)
extraFields = new HashMap<>();
this.extraFields.put(key,value);
return this;
}

为了最终构建查询,使用了一个名为 toQuery() 的函数,该函数将查询的不同子句附加到一个字符串中。

toQuery() 函数如下所示:

 private static String toQuery(Query query){
StringBuilder sb = new StringBuilder();
sb.append(query.queryType.name());
return sb.toString();
}

然后使用以下命令构建查询:

QueryBuilder.Query().addTable(sometable).addQueryType(sometype).addExtraFields(somefieldsmap).toQuery();

但是,有些查询需要 ExtraFields,而有些则不需要。因此,在 toQuery() 函数中我使用了以下代码:

if(query.extraFields()==null || query.extraFields.size()<2){
// do Something
}

现在,我的问题是,为什么它没有在编译时抛出错误,指出我无法使用 .size() 条件,因为 extraFields Map 可能 未初始化取决于是否使用 addExtraFields() 。当条件发生时,它会在运行时不断抛出 NullPointerException ,但不会像下面的简单示例那样在编译时抛出错误:

 import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone{
public static void main (String[] args) {
HashMap<String, String> map;
boolean temp = false;
if(temp){map = new HashMap<>();}
System.out.println(map.size());
}
}

最佳答案

类的字段在使用前不需要显式初始化。它们被隐式初始化为字段类型的默认值:

  • false 对于类型 boolean
  • 原始数字类型为零
  • null 表示引用类型。

这就是为什么 query.extraFields 在某些情况下为 null 的原因。

局部变量的规则是不同的,这就是为什么你的最后一个例子是一个编译错误。 (根据 JLS 明确赋值 规则,存在一条通向 println 调用的路径,其中 map 可能尚未被赋值。 map 是一个局部变量,这是一个编译错误。)

关于java - "Variable might not have been initialized"编译时未给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52329918/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com