2011-02-06 8 views
0

아래 코드에 문제점이 있습니다. in/out의 변수를 어떻게 초기화 할 수 있는지는 명확하지 않습니다.스트림 초기화/초기화에 대한 java 초기화 변수

이 개체를 만드는 동안 생성자에서 프로그램이 중단됩니다. this.inObjects = new ObjectIn......... 줄에 매달려 있습니다. 입력/출력, 문자열 및 객체를 메서드에서 호출하고 읽기 쓰기 등을 적용하여 해당 입/출력 객체를 한 번만 읽고 쓰고 싶습니다.

어디서 잘못 되었습니까? 데이터를 수신하지 않음으로써 데이터가 중단 될 수 있습니까? 그들은 안된다, 그렇지? 그렇지 않으면 항상 블록을

this.outObjects = new ObjectOutputStream(this.clientSocket.getOutputStream()); 
this.inObjects = new ObjectInputStream(this.clientSocket.getInputStream()); 

일부 헤더 OIS 대기의 생성자가 먼저 보내야합니다 :

public class PokerClient 
{ 
    private PokerClientGui gui; 
    private Socket clientSocket; 
    private DataInputStream in; 
    private DataOutputStream output; 
    private ObjectInputStream inObjects; 
    private ObjectOutputStream outObjects; 
    private Hand hand; 

    //constructor 
    public PokerClient() 
    { 
     try 
     { 
      this.gui= gui; 
      this.clientSocket = new Socket("localhost", 4444); 
      this.in = new DataInputStream(this.clientSocket.getInputStream()); 
      this.inObjects = new ObjectInputStream(this.clientSocket.getInputStream()); 
      this.output = new DataOutputStream(this.clientSocket.getOutputStream()); 
      this.outObjects = new ObjectOutputStream(this.clientSocket.getOutputStream()); 
     } 
     catch (Exception e) 
     { 
     } 
} 

답변

2

항상 개체 출력 스트림을 먼저 만들고 플러시해야합니다. 같은 스트림을 두 가지 다른 방법으로 랩핑해서는 안됩니다. 예외를 잡아 내고 오류가있는 것을 좋아하지 않으면 오류를 무시하고 오류를 판별 할 수 없습니다. 자기 자신에게 필드를 할당하지 마십시오. 이것은 아무런 도움이되지 않습니다. 사람들을 혼란스럽게 할 것입니다.

public class PokerClient { 
    private final PokerClientGui gui; 
    private final Socket clientSocket; 
    private final ObjectOutputStream outObjects; 
    private final ObjectInputStream inObjects; 

    public PokerClient(PokerClientGui gui) throws IOException { 
    this.gui = gui; 
    clientSocket = new Socket("localhost", 4444); 
    outObjects = new ObjectOutputStream(clientSocket.getOutputStream()); 
    outObjects.flush(); 
    inObjects = new ObjectInputStream(clientSocket.getInputStream()); 
    } 
} 
+0

! (현장 자동 할당을 위해 유감스럽게 생각합니다.) 나는 이것을 tomorrrow해볼 것입니다! – Mikeel

1

스왑 두 줄, 즉,이 순서를 사용합니다.

+0

내가 교환하려하지만 난 그것을 작동하는 모든 라인을 주석 대신하는 경우가 ... 다시 중단 ... 그리고 경우에도 나는 단지 첫 번째 왼쪽 : ( this.in = 새의 DataInputStream을 this.clientSocket .getInputStream()); 괜찮아요. ...... 프로그램의 일부분을 보내거나받지 못하기 때문입니까? – Mikeel

+0

DataInputStream에는 아무런 문제가 없습니다. 일부 입력이 예상되므로 ObjectInputStream 블록 만 문제가됩니다. 디버거 또는 일부 인쇄를 사용하여 중단 지점을 찾으십시오. 나는 내가 쓴 글에 대해 확신한다. 문제가 나 자신을 만났고 Javadoc 어딘가에서 찾을 수 있기 때문이다. – maaartinus

+0

데이터 스트림을 삭제하면 일반 데이터에도 개체 스트림을 사용할 수 있습니다. 인터페이스 ObjectInput는 DataInput를 확장합니다. 그러나, 나는 당신의보기에 문제를 일으킬 수있는 방법을 모르겠습니다. – maaartinus