Java 创建线程时出现NullPointerException
我有一个简单的练习,在这里我调用一个线程,然后调用run()方法 但是我确实得到了一个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) {
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