예외

2013-08-19 2 views
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 클래스를 만들고 Runnable을 구현하여 두 번째 클래스 인 PrintThread에서 스레드를 구현하려고했습니다. 여기서 I는 Run(){} 방법 오버라이드하지만 실행의 시점 JVM은 (PrintThread.run에 "스레드 0"(java.nullPointerException)에예외

예외가 존재한다는 Printer.java를 오류 던지고 : 31).

는 내가 구글을 시도하고 다른 관련 질문을 읽을 수는 있지만 여전히 나는 문제

답변

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

당신은 새로운 Printer 객체를 생성을 수습하고 있지만, null 값을 반환 할 수 없습니다입니다.

올바른 :

obj=new Printer(); 
3

getInstance 구현을 수정210 변수 : Printer.getInstance()은 항상 null을 반환하며, 무엇이 NullPointerException이되는지를 나타냅니다. 대신이 작업을 수행합니다 :

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

변경이 :

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

public static Printer getInstance(){ 
if(obj == null){ 
    obj = new Printer(); 
} 
return obj; 
} 
3

올바르게초기화되지 않습니다에

public static Printer getInstance() { 
    if(obj==null) { 
     obj = new Printer(); // don't create local variable 
    } 
return obj; 
} 
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; 
} 
0

싱글 톤 클래스를 올바르게 구현해야합니다. 생성자를 private 메소드로 선언하십시오. 같은 클래스의 인스턴스를 반환하는 정적 메서드를 구현합니다. 또한 스레드 안전 방식으로 인스턴스 생성을 구현하십시오. like

프린터 p = new Printer();