Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;变量可能尚未初始化";编译时未给出错误_Java_Spring Boot_Nullpointerexception - Fatal编程技术网

Java &引用;变量可能尚未初始化";编译时未给出错误

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;

在使用SpringBoot开发API时,我必须制作一个
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());
    }
 }