【问题标题】:NullPointerException from ObjectInputStream来自 ObjectInputStream 的 NullPointerException
【发布时间】:2015-07-20 19:57:03
【问题描述】:

当我试图通过ObjectInputStream 通过Socket 获得Object 时,我获得了NullPointerException。我正在使用服务器通过TransferObject 向客户端(Android 手机)发送信息。我知道服务器正在发送Object,因为当它发送错误时,它会被很好地读取并且不会引发异常。所有发送的类都是可序列化的,包含一个 serialVersionID,并且包含在两个项目中。

代码:

TransferObject data = null;

try {
    Socket s = new Socket();                                        
    s.connect(new InetSocketAddress(HOST, PORT), 10000);
    ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
    ObjectInputStream ois = new ObjectInputStream(s.getInputStream());

    send.setUser(useremail);
    send.setPassword(password);

    oos.writeObject(send);
    oos.flush();

    Object inputObject = ois.readObject();   //Error happens here.
    data = (TransferObject) inputObject; 

    s.close();
    return data;
}

这里是TransferObject:

public class TransferObject implements Serializable {

    private static final long serialVersionUID = *******************L;  //blanked this out

    public String command;
    public String args;
    public Object[] objects;

    private String password;
    private String user;

    public TransferObject() {
    }

    public TransferObject(String command, String args, Object[] objects) {
        this.objects = objects;
        this.args = args;
        this.command = command;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUser() {
        return this.user;
    }

    public void setUser(String user) {
        this.user = user;
    }
}

最后,可怕的日志:

07-20 14:38:16.044: E/AndroidRuntime(2451): FATAL EXCEPTION: AsyncTask #1
07-20 14:38:16.044: E/AndroidRuntime(2451): Process: com.********************.**********.timecardmanager, PID: 2451
07-20 14:38:16.044: E/AndroidRuntime(2451): java.lang.RuntimeException: An error occured while executing doInBackground()
07-20 14:38:16.044: E/AndroidRuntime(2451):     at android.os.AsyncTask$3.done(AsyncTask.java:304)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.lang.Thread.run(Thread.java:818)
07-20 14:38:16.044: E/AndroidRuntime(2451): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Class.isProxy()' on a null object reference
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.lang.reflect.Proxy.isProxyClass(Proxy.java:261)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectStreamClass.resolveProperties(ObjectStreamClass.java:1016)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectStreamClass.isEnum(ObjectStreamClass.java:1040)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectStreamClass.checkAndGetTcObjectClass(ObjectStreamClass.java:1341)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1788)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readContent(ObjectInputStream.java:707)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.discardData(ObjectInputStream.java:636)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1348)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1113)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:454)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1345)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readNewArray(ObjectInputStream.java:1488)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:759)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1113)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:454)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1345)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1242)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1835)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:761)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1983)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1940)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at com.********************.**********.timecardmanager.MainActivity.sendToServer(MainActivity.java:158)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at com.********************.**********.timecardmanager.TimecardFragment$GetCardsTask.doInBackground(TimecardFragment.java:81)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at com.********************.**********.timecardmanager.TimecardFragment$GetCardsTask.doInBackground(TimecardFragment.java:1)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at android.os.AsyncTask$2.call(AsyncTask.java:292)
07-20 14:38:16.044: E/AndroidRuntime(2451):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
07-20 14:38:16.044: E/AndroidRuntime(2451):     ... 4 more

提前致谢。

编辑:服务器端。每次新客户端连接到新线程时运行。

try
    {
        ObjectOutputStream oos = new ObjectOutputStream(soc.getOutputStream());
        ObjectInputStream ois = new ObjectInputStream(soc.getInputStream());

        TransferObject obj = (TransferObject) ois.readObject();

        switch(obj.command)
        {
            case "REQ":
                JavaTimecard[] javaCards = BullhornTools.getJavaCards(obj.getUser(), obj.getPassword());

                if(javaCards == null)
                {
                    obj.command = "ERR";
                    obj.args = BullhornTools.getError();
                    obj.setUser("");
                    obj.setPassword("");

                    oos.writeObject(obj);
                    oos.flush();
                }
                else
                {
                    obj.command = "AKK";
                    obj.args = "";
                    obj.objects = new Object[javaCards.length];
                    obj.setUser("");
                    obj.setPassword("");

                    for(int i = 0; i < javaCards.length; i++)
                    {
                        obj.objects[i] = javaCards[i];
                    }

                    oos.writeObject(obj);
                    oos.flush();
                }

                break;



            case "SAVE":
                //TODO: Implement later
                break;
        }

        soc.close();
    }
    catch (IOException e) 
    {
        e.printStackTrace();
    } 
    catch (ClassNotFoundException e) 
    {
        e.printStackTrace();
    }

【问题讨论】:

  • 以及Object[] objects中存储的内容...
  • 什么是 com.************************.**********.timecardmanager.MainActivity.sendToServer(MainActivity .java:158) ?
  • 另一端的代码是什么样的?注意:您无需将您的 serialVersionUID 值保密,这不是安全漏洞。
  • @Selvin JavaTimecards
  • @TooManyEduardos 只是一个空白的包名称。有个人信息。

标签: java android sockets nullpointerexception objectinputstream


【解决方案1】:

我尝试通过序列化、存储在文件中并将其读回来对其进行测试。效果很好,因此我将假设它是一个 android 的东西。正如 Selvin 所说,只使用 JSON。

至于任何可能的不明确之处,我深表歉意。

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多