2011-10-09 6 views
-2

내 프로그램에이 구조가 있습니다.실행중인 서버 스레드의 객체를 얻는 방법은 무엇입니까?

class Node0 
    private Server server; 
    ... 
    public void init(){ 
     server.waitConnections(); 
    ... 

class Server 
    socket = ss.accept(); // ss :socketServer object 
    handler = new Handler(socket); 
    handler.start(); // start handler thread 


class Handler 
    public void run() { 
    while (true) { 
     try { 
     package = (Package) ois.readObject(); // ois :ObjectInputStream 
     if (package != null) { 
      this.setPackage(package); 
     } 
     } catch (Exception e) { 
     break; 
     } 
    } 

이제 Node0 클래스의 Handler 클래스에서 패키지 객체를 가져와야합니다. 어떻게 할 수 있습니까? Handler 클래스의 패키지를 받았지만 지금은 Node0 클래스에이 객체를 보낼 수 있어야합니다. 그러나이 값을 가져 오려고하면

class Node0 
    server.getHandler().getPackage(); 

NullPointerException가 실행됩니다.

어떻게 할 수 있는지 알기 원하십니까?

+3

그건 컴파일 할 수있는 것이 아닙니다. 실제 코드를 게시하십시오. –

+1

예외를 처리하지 않으려면 예외를 catch하지 마십시오. 적어도 그들을 기록하거나 오류로 다시 던지십시오. 'server.getHandler(). getPackage()'가'NullPointerException'을 일으키는 경우,'server' 또는'server.getHandler()'는'null'입니다. –

+0

Ryan 나는 내 게시물보다 3 개의 클래스가 매우 길기 때문에 코드를 붙여 넣지 않습니다. 제 아이디어를 표현하려고 시도한 것입니다. –

답변

2

왜 콜백 기능을 사용하지 않으시겠습니까? 핸들러가 패키지를 설정 한 시점을 알 수 없습니다. 핸들러에서 액션을 트리거해야합니다. 당신의 아주 최소한의 예를 바탕으로

, 테스트하지 또는 컴파일 :

class Node0 
    private Server server; 
    ... 
    public void init(){ 
     server.setNode(this); 
     server.waitConnections(); 
    ... 
    public doPackage(Package p){ 
     // do something with p; 
    ... 

class Server 
    public setNode(Node n) { 
     this.node = n; 
    } 
    socket = ss.accept(); // ss :socketServer object 
    handler = new Handler(socket, node); 
    handler.start(); // start handler thread 

class Handler 
    ... 
    public Handler(Socket socket, Node node){ 
    this.socket = socket; 
    this.node = node;  
    } 
    public void run() { 
    while (true) { 
     try { 
     package = (Package) ois.readObject(); // ois :ObjectInputStream 
     if (package != null) { 
      // this.setPackage(package); 
      this.node.doPackage(package); 
     } 
     } catch (Exception e) { 
     break; 
     } 
    } 
+0

그건 좋은 접근 방법입니다, 나는 그것을 시도 할 것입니다. –

+0

감사합니다. 친구, 잘 작동합니다. =) –

1

내가 내 Node0 클래스

이유에서 핸들러 클래스의 패키지 개체를 얻을 필요가? 들어오는 데이터를 처리하는 코드는 Handler 클래스에 있어야합니다. Node0 클래스는 accept() 루프를 실행하기위한 것일뿐입니다. 전혀 다른 일을 할 이유가 없습니다.

관련 문제