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
classdat1
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