Java 创建线程时出现NullPointerException

Java 创建线程时出现NullPointerException,java,multithreading,console,Java,Multithreading,Console,我有一个简单的练习,在这里我调用一个线程,然后调用run()方法 但是我确实得到了一个NullPointerException 正在努力找出为什么会出现这种例外 package practice; import java.util.Date; import java.text.SimpleDateFormat; class IdDisplay implements Runnable { String idNumber; IdDisplay(String ID) {

我有一个简单的练习,在这里我调用一个线程,然后调用run()方法

但是我确实得到了一个NullPointerException

正在努力找出为什么会出现这种例外

package practice;
import java.util.Date;
import java.text.SimpleDateFormat;


class IdDisplay implements Runnable
{
    String idNumber;
    IdDisplay(String ID)
    {
        this.idNumber = ID;

    }
    char [] idMine = this.idNumber.toCharArray();
    public void run()
    {
        for(int i = 0; i < idMine.length; i++)
        {
            System.out.print(idMine[i] + " ");
            try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException in){}


        }
    }       
}
public class Practice
{
    public static void main(String[]args)
    {


        String name = "Arian";
        String age = "38";
        String id = "7401195021087";

        int ageInt;
        int year;
        int yearBorn;

        System.out.println("Welcome " + name + " your age is " + age + " and your ID number " + id);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        Date date = new Date();

        year = Integer.parseInt(sdf.format(date));
        ageInt = Integer.parseInt(age);
        yearBorn = year - ageInt;
        System.out.println("You were born in " + yearBorn);

        IdDisplay idClass = new IdDisplay(id);
    Thread tt = new Thread(idClass);
    tt.start(); 



    }
}   
包装实践;
导入java.util.Date;
导入java.text.simpleDataFormat;
类IdDisplay实现可运行
{
字符串ID号;
IdDisplay(字符串ID)
{
this.idNumber=ID;
}
char[]idMine=this.idNumber.toCharArray();
公开募捐
{
for(int i=0;i
为什么我会得到这个NullPointerException


关于

您声明了两个实例字段:

String idNumber;

第二个参数的初始值设定项假定第一个参数不是
null
,它以该参数开头,因此出现异常。实例初始值设定项在进入构造函数之前进行处理

相反,将该初始化移到构造函数中:

IdDisplay(String ID)
{
    this.idNumber = ID;
    this.idMine = this.idNumber.toCharArray();
}
还强烈建议将所有字段声明在一个位置(我更喜欢在课程开始时声明,但将它们放在哪里是一个风格问题;将它们放在一起是一个更重要的维护考虑)。(对一般规则的警告:在字段支持访问器的情况下,有一个参数用于声明访问器旁边的字段。)并且一些东西之间的垂直空格可能很有用

完整更新的
IdDisplay
类:

class IdDisplay implements Runnable
{
    String  idNumber;
    char [] idMine;

    IdDisplay(String ID)
    {
        this.idNumber = ID;
        this.idMine = this.idNumber.toCharArray();
    }

    public void run()
    {
        for(int i = 0; i < idMine.length; i++)
        {
            System.out.print(idMine[i] + " ");
            try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException in){}
        }
    }       
}
类IdDisplay实现可运行
{
字符串ID号;
煤焦矿;
IdDisplay(字符串ID)
{
this.idNumber=ID;
this.idMine=this.idNumber.toCharArray();
}
公开募捐
{
for(int i=0;i
您声明了两个实例字段:

String idNumber;

第二个参数的初始值设定项假定第一个参数不是
null
,它以该参数开头,因此出现异常。实例初始值设定项在进入构造函数之前进行处理

相反,将该初始化移到构造函数中:

IdDisplay(String ID)
{
    this.idNumber = ID;
    this.idMine = this.idNumber.toCharArray();
}
还强烈建议将所有字段声明在一个位置(我更喜欢在课程开始时声明,但将它们放在哪里是一个风格问题;将它们放在一起是一个更重要的维护考虑)。(对一般规则的警告:在字段支持访问器的情况下,有一个参数用于声明访问器旁边的字段。)并且一些东西之间的垂直空格可能很有用

完整更新的
IdDisplay
类:

class IdDisplay implements Runnable
{
    String  idNumber;
    char [] idMine;

    IdDisplay(String ID)
    {
        this.idNumber = ID;
        this.idMine = this.idNumber.toCharArray();
    }

    public void run()
    {
        for(int i = 0; i < idMine.length; i++)
        {
            System.out.print(idMine[i] + " ");
            try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException in){}
        }
    }       
}
类IdDisplay实现可运行
{
字符串ID号;
煤焦矿;
IdDisplay(字符串ID)
{
this.idNumber=ID;
this.idMine=this.idNumber.toCharArray();
}
公开募捐
{
for(int i=0;i
问题在于:

char [] idMine = this.idNumber.toCharArray();
这一行在调用构造函数之前执行,在构造函数中初始化
This.idNumber

建议更改:

String idNumber;
char [] idMine;

IdDisplay(String ID)
{
    this.idNumber = ID;
    idMine = this.idNumber.toCharArray();
}
问题在于:

char [] idMine = this.idNumber.toCharArray();
这一行在调用构造函数之前执行,在构造函数中初始化
This.idNumber

建议更改:

String idNumber;
char [] idMine;

IdDisplay(String ID)
{
    this.idNumber = ID;
    idMine = this.idNumber.toCharArray();
}
此声明位于类范围内,此时This.idNumber是一个尚未分配的字符串对象。将其弹出到run()方法中

此声明位于类范围内,此时This.idNumber是一个尚未分配的字符串对象。将其弹出到run()方法中

尝试在

String idNumber;
给你一个NPE

尝试在

String idNumber;
并给你一个NPE。

移动这行:

char [] idMine = this.idNumber.toCharArray();
到构造函数(在设置idNumber之后)。在当前位置,当您创建
IdDisplay
的实例时,它被初始化,由于
idNumber
未初始化,您将得到一个异常。

移动此行:

char [] idMine = this.idNumber.toCharArray();

到构造函数(在设置idNumber之后)。在当前位置,当您创建
IdDisplay
的实例时,它被初始化,并且由于
idNumber
未初始化,您将得到一个异常。

您的空指针异常很可能来自此行:

char [] idMine = this.idNumber.toCharArray();

这是因为您在构造函数中初始化了This.idNumber。但是,idMine将在this.idNumber仍然为空的时候提前初始化。

您的空指针异常很可能来自此行:

char [] idMine = this.idNumber.toCharArray();

这是因为您在构造函数中初始化了This.idNumber。但是,idMine将在this.idNumber仍然为空的时候提前初始化。

您已经创建了两个实例,因此它将被赋予空poin