Thread中的异常(java.nullPointerException)

时间:2013-08-19 09:15:31

标签: java

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)。

我试图谷歌它并阅读其他相关问题,但我仍然无法纠正问题

6 个答案:

答案 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 =新打印机();