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();
}
}
Run Code Online (Sandbox Code Playgroud)
嗨,我写了这个程序,以了解线程的工作原理.在这里,我将Printer类设为singleton,并尝试通过实现Runnable在第二类PrintThread中实现线程.在这里我覆盖了Run(){}方法,但在执行时,jvm抛出一个错误,说有一个
PrintThread.run中的"Thread-0"(java.nullPointerException)中的异常(Printer.java:31).
我试图谷歌它,并阅读其他相关的问题,但我仍然无法纠正这个问题
static Printer obj =null;
private Printer(){}
public static Printer getInstance(){
if(obj==null){
Printer pr=new Printer();
}
return obj;
}
Run Code Online (Sandbox Code Playgroud)
您创建一个新Printer对象,但返回null值.
正确:
static Printer obj = null;
private Printer(){}
public static Printer getInstance(){
if(obj == null){
obj = new Printer();
}
return obj;
}
Run Code Online (Sandbox Code Playgroud)