public class Printer {
static Printer obj =null;
private Printer(){}
public static Printer getInstance(){
if(obj==null){
Printer pr=new Printer();
}
return obj;
}
void print(String msg){
System.out.println("["+msg);
try {
Thread.sleep(1000);
} catch(InterruptedException c) {
c.printStackTrace();
}
System.out.println("]");
}
}
class PrintThread implements Runnable {
Printer p;
String msg;
PrintThread(Printer p,String msg) {
this.p=p;
this.msg=msg;
}
public void run() {
p.print(msg);//Getting error in this line
}
}
//Deploying main class
public class Execution {
public static void main(String[] args) {
Printer pr=Printer.getInstance();
Thread t1=new Thread(new PrintThread(pr,"java"));
t1.start();
PrintThread r=new PrintThread(pr,"javadeveloper");
Thread t2=new Thread(r);
t2.start();
}
}
您好,
我编写了这个程序来理解线程是如何工作的。在这里,我将Printer类设为singleton,并尝试通过实现Runnable在第二类PrintThread中实现线程。在这里我覆盖了Run(){}
方法但是在执行时jvm抛出一个错误,说有一个
PrintThread.run中的“Thread-0”(java.nullPointerException)中的异常(Printer.java:31)。
我试图谷歌它并阅读其他相关问题,但我仍然无法纠正问题
答案 0 :(得分:5)
static Printer obj =null;
private Printer(){}
public static Printer getInstance(){
if(obj==null){
Printer pr=new Printer();
}
return obj;
}
您创建一个新的Printer
对象,但返回空值。
正确:
static Printer obj = null;
private Printer(){}
public static Printer getInstance(){
if(obj == null){
obj = new Printer();
}
return obj;
}
答案 1 :(得分:3)
纠正您的getInstance
实施:
public static Printer getInstance() {
if(obj==null) {
obj = new Printer(); // don't create local variable
}
return obj;
}
答案 2 :(得分:3)
Printer pr=new Printer();
将此更改为
obj=new Printer();
答案 3 :(得分:3)
您未正确初始化Printer
变量:Printer.getInstance()
始终返回null
,导致NullPointerException
。这样做:
public static Printer getInstance() {
if (obj == null) {
obj = new Printer();
}
return obj;
}
答案 4 :(得分:1)
Printer pr=new Printer();
此代码创建新的打印机对象但不使用它 并且 obj 对象的生命范围为null
建议的代码
public static Printer getInstance(){
if(obj==null){
obj=new Printer(); // Printer pr=new Printer(); /// here it's wrong
}
return obj;
}
答案 5 :(得分:0)
您需要正确实现单例类。将构造函数声明为私有方法。 实现一个返回同一个类的实例的静态方法。还以线程安全的方式实现实例的创建。像
打印机p =新打印机();