0
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を実装することで2番目のクラスPrintThreadにスレッドを実装しようとしました。ここでRun(){}メソッドをオーバーライドしましたが、実行時にjvmがエラーをスローしています

PrintThread.run(Printer.java:31) での「Thread-0」(java.nullPointerException) での例外。

私はそれをグーグルで検索し、他の関連する質問も読みましたが、それでも問題を修正できません

4

6 に答える 6

5
static Printer obj =null;
    private Printer(){}
     public static Printer getInstance(){
         if(obj==null){
             Printer pr=new Printer();
         }
     return obj;  
     }

新しいPrinterオブジェクトを作成しますが、null 値を返します。

正しい:

static Printer obj = null;
private Printer(){}

public static Printer getInstance(){
 if(obj == null){
  obj = new Printer();
 }
 return obj;
}
于 2013-08-19T09:18:44.793 に答える
3

getInstance実装を修正します。

public static Printer getInstance() {
    if(obj==null) {
         obj = new Printer(); // don't create local variable
    }
return obj;  
}
于 2013-08-19T09:18:50.407 に答える
3
Printer pr=new Printer();

これをに変更

  obj=new Printer();
于 2013-08-19T09:19:47.370 に答える