【问题标题】:Java throwing errors when client sends Object to server, with no errors/warnings in IDE客户端向服务器发送对象时 Java 抛出错误,IDE 中没有错误/警告
【发布时间】:2013-04-20 15:14:05
【问题描述】:

请大家帮忙,我有一个客户端和一个服务器,我在这段代码中从客户端发送一个对象,上面写着发送数据包:

   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,我是java新手。

【问题讨论】:

  • 不相关,根据设计,您不必专门将对象初始化为null,如果您不为对象分配值/引用,则默认为null
  • @TheMerovingian 是的,我愿意。否则我以后无法参考它发送数据包或其他数据包的位置。
  • 我是说你可以使用Socket kkSocket; 代替Socket kkSocket = null; 他们做同样的事情。它没有什么不同,只是认为您应该了解默认值。
  • 您检查过错误日志中的这个异常是什么意思吗? citadelRPG.Main$2.run(Main.java:277) 处的线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常

标签: java sockets serialization


【解决方案1】:

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 的实例时,它也会尝试序列化外部对象,而 Thread 是不可序列化的,它会中断。

要解决此问题,请将Data 内部类设为静态,或将其设为顶级类。

【讨论】:

  • 所以将数据类移出主公共类?
  • 是的。这就是使它成为顶级课程的原因。或者把它留在那里,但让它成为静态的。
  • 谢谢,我在检索数据时犯了同样的错误,这是一个很好的答案。
猜你喜欢
  • 2023-04-02
  • 2014-07-21
  • 1970-01-01
  • 2014-05-16
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多