2013-04-20 2 views
1

누군가가 도와 주겠다. 나는 클라이언트와 서버를 가지고 있는데,이 패킷에서 클라이언트가 보내는 패킷을 보낸다. 데이터 :클라이언트가 서버에 객체를 보낼 때 Java에서 오류가 발생한다.

class Data implements Serializable { 
     /** 
     * 
     */ 
     // private static final long serialVersionUID = 1L; 

     String a = "ok baby"; 
     String b = "hi there"; 
    } 

    public void Connect(String[] args) throws IOException { 

     Socket kkSocket = null; 
     PrintWriter out = null; 
     ObjectOutputStream oos = null; 
     BufferedReader in = null; 

     try { 
      kkSocket = new Socket("192.168.0.5", 1337); 
      out = new PrintWriter(kkSocket.getOutputStream(), true); 
      oos = new ObjectOutputStream(kkSocket.getOutputStream()); 
      in = new BufferedReader(new InputStreamReader(
        kkSocket.getInputStream())); 
     } catch (UnknownHostException e) { 
      System.err.println("Don't know about hostname, network problem."); 
      System.exit(1); 
     } catch (IOException e) { 
      System.err.println("Couldn't connect to server."); 
      System.exit(1); 
     } 

     BufferedReader stdIn = new BufferedReader(new InputStreamReader(
       System.in)); 
     String fromServer; 
     String fromUser; 

     // SEND PACKET OF DATA 
     oos.writeObject(new Data()); 
     oos.flush(); 
     // SEND PACKET OF DATA 

이 코드는 단순히 전송하고 여기에 나를 도와, 사람의 마음을 보내려고하면이 오류 팝업을 가지고하지 않는 이유는 무엇입니까? 내 소스의

java.io.NotSerializableException: java.lang.Thread 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeArray(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.access$300(Unknown Source) 
    at java.io.ObjectOutputStream$PutFieldImpl.writeFields(Unknown Source) 
    at java.io.ObjectOutputStream.writeFields(Unknown Source) 
    at java.awt.Container.writeObject(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeArray(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.access$300(Unknown Source) 
    at java.io.ObjectOutputStream$PutFieldImpl.writeFields(Unknown Source) 
    at java.io.ObjectOutputStream.writeFields(Unknown Source) 
    at java.awt.Container.writeObject(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeArray(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.access$300(Unknown Source) 
    at java.io.ObjectOutputStream$PutFieldImpl.writeFields(Unknown Source) 
    at java.io.ObjectOutputStream.writeFields(Unknown Source) 
    at java.awt.Container.writeObject(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeArray(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.access$300(Unknown Source) 
    at java.io.ObjectOutputStream$PutFieldImpl.writeFields(Unknown Source) 
    at java.io.ObjectOutputStream.writeFields(Unknown Source) 
    at java.awt.Container.writeObject(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject(Unknown Source) 
    at citadelRPG.Main.Connect(Main.java:124) 
    at citadelRPG.Main.<init>(Main.java:158) 
    at citadelRPG.Main$2.run(Main.java:269) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at citadelRPG.Main$2.run(Main.java:277) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

부분은 this question에 두 번째 대답에서 사용하고, 나는 자바 안돼서했다.

+0

관련없는, 설계 상 의도적으로 객체를'null'로 초기화 할 필요는 없습니다. 객체에 값/참조를 할당하지 않으면 기본적으로'null'이됩니다. – TheMerovingian

+0

@ TheMerovingian 예, 있습니다. 그렇지 않으면 나중에 패킷이나 다른 패킷을 보내는 곳을 참조 할 수 없습니다. – tincopper2

+0

'소켓 kkSocket = null; 대신에'소켓 kkSocket; '을 사용할 수 있다고 말하는데 같은 일을합니다. 전혀 다른 것은 없으며 기본값에 대해 알아야한다고 생각했습니다. – TheMerovingian

답변

2

Data 클래스는 외부 클래스의 비 정적 내부 클래스로, Thread를 확장하거나 Thread 유형의 특성을가집니다. 모든 비 정적 내부 클래스에는 외부 객체에 대한 암시 적 참조가 있습니다. 이 다음 코드

public class Outer extends Thread { 
    class Data implements Serializable { 
     String a = "ok baby"; 
     String b = "hi there"; 
    } 

    ... 
} 

을 설명하는 것은 다음과 동등하다 : 데이터 인스턴스를 직렬화 때, 그것은 또한 시도

public class Outer extends Thread 
    ... 
} 

class Data implements Serializable { 
    String a = "ok baby"; 
    String b = "hi there"; 
    Outer outer; 
} 

은 외부 객체를 직렬화 및 비되는 스레드 직렬화 가능, 중단됩니다.

문제를 해결하려면 Data 내부 클래스를 정적으로 만들거나 최상위 클래스로 만듭니다.

+0

그래서 클래스 공용 데이터 클래스 밖으로 이동 하시겠습니까? – tincopper2

+0

예. 그것이 최상위 클래스가 될 것입니다. 아니면 그대로 두지 만 정적으로 만듭니다. –

+0

감사합니다. 데이터를 검색하는 데 실수가있었습니다. 이는 좋은 대답입니다. – tincopper2

관련 문제