Java &引用;变量可能尚未初始化";编译时未给出错误
在使用SpringBoot开发API时,我必须制作一个Java &引用;变量可能尚未初始化";编译时未给出错误,java,spring-boot,nullpointerexception,Java,Spring Boot,Nullpointerexception,在使用SpringBoot开发API时,我必须制作一个QueryBuilder 为了构建一个可以使用JDBC从数据库中获取结果的查询 我的Query的初始结构如下 public static class Query { private String table; private QueryType queryType; private List<String> column; private List<Fields> where;
QueryBuilder
为了构建一个可以使用JDBC从数据库中获取结果的查询
我的Query
的初始结构如下
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;
}
然后,通过使用以下方法构建查询
:
QueryBuilder.Query().addTable(sometable).addQueryType(sometype).addExtraFields(somefieldsmap).toQuery();
但是,有些查询需要外部字段
,有些则不需要。因此,在toQuery()
函数中,我使用了以下代码:
if(query.extraFields()==null || query.extraFields.size()<2){
// do Something
}
类的字段在使用前不需要显式初始化。它们隐式初始化为字段类型的默认值:
用于类型false
boolean
- 零表示基元数字类型
- 引用类型的
null
query.extraFields
是null
局部变量的规则不同,这就是为什么上一个示例是编译错误。(根据JLS明确分配规则,有一个到
println
调用的路径,map
可能没有被分配值。由于map
是一个局部变量,这是一个编译错误。)要回答您关于最后一个代码块为什么会引发编译错误的问题,我们需要参考:
对于每次访问局部变量或空白最终字段x,x必须为
在访问之前明确指定,否则会发生编译时错误
因为变量
map
是在没有初始化的情况下声明的。初始化发生在if块内,因此编译器无法确定它是否已初始化,因此编译错误。如果要将boolean temp
更改为final并将其赋值为true
值,编译器错误将消失,因为现在变量temp
是final,因此编译器可以确定If块必须已执行且map
变量已明确初始化。因为“未初始化”与“空值”非常不同。默认情况下,该字段的值为null
。请尝试删除此处的括号if(query.extraFields()==null
。它应该是if(query.extraFields==null
QueryBuilder.Query().addTable(sometable).addQueryType(sometype).addExtraFields(somefieldsmap).toQuery();
if(query.extraFields()==null || query.extraFields.size()<2){
// do Something
}
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());
}
}