Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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_Nullpointerexception_Static Variables - Fatal编程技术网

Java中的静态初始化?

Java中的静态初始化?,java,nullpointerexception,static-variables,Java,Nullpointerexception,Static Variables,我试图执行以下代码: public class StaticTest { private static List<String> dat1; { dat1 = new ArrayList<>(); } private StaticTest(){ System.out.println(dat1.contains("a")); //Marked Line 2: this one is not throwin

我试图执行以下代码:

public class StaticTest {

    private static List<String> dat1;
    {
        dat1 = new ArrayList<>(); 
    }

    private StaticTest(){
        System.out.println(dat1.contains("a")); //Marked Line 2: this one is not throwing
    }

    public static void main(String[] args) {
        System.out.println(dat1.contains("a")); //Marked Line 1: This line throws null pointer 
        new StaticTest(); 
    }
}
公共类静态测试{
私有静态列表dat1;
{
dat1=新的ArrayList();
}
专用静态测试(){
System.out.println(dat1.contains(“a”);//标记行2:这一行没有抛出
}
公共静态void main(字符串[]args){
System.out.println(dat1.contains(“a”);//标记的第1行:此行抛出空指针
新的静态测试();
}
}
我试图执行上面的代码,但在标记的第1行出现了
Null指针异常
。但是当我对标记行1进行注释时,我得到了输出

为什么我在第一种情况下得到异常,而在第二种情况下没有得到异常

当我使用私有静态列表dat1=newarraylist()时,不会引发异常。

简单:

System.out.println(dat1.contains("a")); 
运行构造函数(因为它在构造函数中!)。 运行构造函数的一部分是:运行类的所有非静态初始化程序块

鉴于:

public static void main(String[] args) {
  System.out.println(dat1.contains("a")); //Marked Line 1: This line 
只运行静态初始值设定项-但不运行构造函数代码(它运行-但在该行之后)

因此,您的问题是此初始值设定项块:

{
    dat1 = new ArrayList<>(); 
}
{
dat1=新的ArrayList();
}
不是静态的

换句话说:你的问题是由以非常不健康的方式混合静态/非静态引起的。如果字段是静态的,请确保静态的初始化代码将对其进行初始化

顺便说一句:合理的解决方案是简单地做:

private final static List<String> data = new ArrayList<>();
private final static List data=new ArrayList();
这确保列表尽快初始化;然后编译器甚至会在您忘记初始化它时告诉您。

简单:

System.out.println(dat1.contains("a")); 
运行构造函数(因为它在构造函数中!)。 运行构造函数的一部分是:运行类的所有非静态初始化程序块

鉴于:

public static void main(String[] args) {
  System.out.println(dat1.contains("a")); //Marked Line 1: This line 
只运行静态初始值设定项-但不运行构造函数代码(它运行-但在该行之后)

因此,您的问题是此初始值设定项块:

{
    dat1 = new ArrayList<>(); 
}
{
dat1=新的ArrayList();
}
不是静态的

换句话说:你的问题是由以非常不健康的方式混合静态/非静态引起的。如果字段是静态的,请确保静态的初始化代码将对其进行初始化

顺便说一句:合理的解决方案是简单地做:

private final static List<String> data = new ArrayList<>();
private final static List data=new ArrayList();
这确保列表尽快初始化;然后编译器甚至会在您忘记初始化它时告诉您。

这段代码

{
    dat1 = new ArrayList<>(); 
}
{
dat1=新的ArrayList();
}
这个构造函数块。它将在super()之后的每个构造函数中执行,因此它还不会在Mark1上运行

若您有这样的代码,那个么它将在类加载时执行

static {
    dat1 = new ArrayList<>(); 
}
静态{
dat1=新的ArrayList();
}
这里有更多细节

此代码

{
    dat1 = new ArrayList<>(); 
}
{
dat1=新的ArrayList();
}
这个构造函数块。它将在super()之后的每个构造函数中执行,因此它还不会在Mark1上运行

若您有这样的代码,那个么它将在类加载时执行

static {
    dat1 = new ArrayList<>(); 
}
静态{
dat1=新的ArrayList();
}
这里有更多细节 您的代码:

{
    dat1 = new ArrayList<>(); 
}
然后,它将适用于这两种情况。

您的代码:

{
    dat1 = new ArrayList<>(); 
}

然后它将适用于这两种情况。

Hi@kajal请参考下面的正确代码:-

 public class StaticTest {

    private static List<String> dat1;
    static
    {
        dat1 = new ArrayList<String>(); 
    }

    private StaticTest(){
        System.out.println(dat1.contains("a")); //Marked Line 2: this one is not throwing
    }
    public static void main(String[] args) {
        System.out.println(dat1.contains("a")); //Marked Line 1: This line throws null pointer 
        new StaticTest(); 
    }
}
公共类静态测试{
私有静态列表dat1;
静止的
{
dat1=新的ArrayList();
}
专用静态测试(){
System.out.println(dat1.contains(“a”);//标记行2:这一行没有抛出
}
公共静态void main(字符串[]args){
System.out.println(dat1.contains(“a”);//标记的第1行:此行抛出空指针
新的静态测试();
}
}
实例块在创建该类的实例时执行。 问题:为什么会得到
NullPointerException
:- 请查看下面的
StaticTest
类执行流程:-

  • 首先,所有导入类的加载方式如下:-
  • Object
    class 2.
    java.lang
    Package class 3.
    java.util.ArrayList
    class
  • 编译器将遍历StaticTest类,并将内存分配给案例中的所有静态成员,即
    dat1
  • 现在,javac编译器搜索执行的静态块。在您的情况下,它们不是静态块
  • 现在,编译器执行
    main
    方法并执行
    System.out.println(dat1.contains(“a”)称为
    null.contains(“a”)它显示了execption,但正如我所说的,当您创建该类的实例时,实例块将被执行。因此,当您创建对象
    新的StaticTest()时,
    dat1
    被初始化

  • Hi@kajal请参考以下正确代码:-

     public class StaticTest {
    
        private static List<String> dat1;
        static
        {
            dat1 = new ArrayList<String>(); 
        }
    
        private StaticTest(){
            System.out.println(dat1.contains("a")); //Marked Line 2: this one is not throwing
        }
        public static void main(String[] args) {
            System.out.println(dat1.contains("a")); //Marked Line 1: This line throws null pointer 
            new StaticTest(); 
        }
    }
    
    公共类静态测试{
    私有静态列表dat1;
    静止的
    {
    dat1=新的ArrayList();
    }
    专用静态测试(){
    System.out.println(dat1.contains(“a”);//标记行2:这一行没有抛出
    }
    公共静态void main(字符串[]args){
    System.out.println(dat1.contains(“a”);//标记的第1行:此行抛出空指针
    新的静态测试();
    }
    }
    
    实例块在创建该类的实例时执行。 问题:为什么会得到
    NullPointerException
    :- 请查看下面的
    StaticTest
    类执行流程:-

  • 首先,所有导入类的加载方式如下:-
  • Object
    class 2.
    java.lang
    Package class 3.
    java.util.ArrayList
    class
  • 编译器遍历StaticTest类并分配