Android 中new ObjectInputStream无法创建对象

问题描述

Android 中new ObjectInputStream无法创建对象
//程序在这里报错了;
 this.ois = new ObjectInputStream(this.socket.getInputStream());
程序报错说空指针异常,表面上看是下面的第二条语句in在调用方法时出错的,实际上是Client.getInstance().getClientInputThread()返回了空对象,也即是ClientInputThread构造方法中的
this.ois = new ObjectInputStream(this.socket.getInputStream());
未能成功创建ois对象
这在后面打印出来的log信息也可以看出来。打印信息显示ois == null是 true,而oos == null 是 false;

事故语句块之语句1  final ClientInputThread in = Client.getInstance().getClientInputThread();
事故语句块之语句2  in.setMessageListener(new MsgListener(...){}); 

//输入线程
 public class ClientInputThread  extends Thread
{

    @SuppressWarnings("unused")
    private Socket socket;
    private ObjectInputStream ois;
    private TransEntity transEn;
    private MsgListener msgListener;
    private boolean isStart = true;
    public ClientInputThread(Socket socket)
    { 

        this.socket = socket;
        try
        {
            this.ois = new ObjectInputStream(this.socket.getInputStream());
        }
        catch (StreamCorruptedException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public TransEntity getMsg()
    {
        if(transEn!=null)
        {

            synchronized (this)
            {
                    try
                    {
                        wait();
                    }
                    catch (InterruptedException e)
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

            }

            return transEn;

        }
        return null;

    }

    public void setMessageListener(MsgListener msgListener)
    {
        this.msgListener = msgListener;
    }

    public void releaseResource()
    {
        try
        {
            ois.close();
            socket.close();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void run()
    {
        while(isStart)
        {
            //if(ois == null)
                System.out.println("ois == null  : "+(ois == null));
            try
            {
                transEn = (TransEntity) ois.readObject();
                if(transEn!=null)
                {
                    synchronized (this)
                    {
                        notify();
                    }
                }

            //  msgListener.Message(transEn);
            }
            catch (OptionalDataException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (ClassNotFoundException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        releaseResource();
    }

}

 //输出线程
public class OutputThread extends Thread
{
        private Socket socket;
        private OutputThread  outputThread;
        private ObjectOutputStream oos;
        private TransEntity transEn;
        private boolean isStart = true;
        public OutputThread(Socket socket)
        {
            this.socket = socket;
            try
            {
                oos = new ObjectOutputStream(socket.getOutputStream());
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
     // 设置了消息之后,唤醒写线程
        public void setMessage(TransEntity transEn)
        {
            this.transEn = transEn;
            synchronized (this)
            {
                notify();
            }
        }
        public void releaseResouce()
        {
            try
            {
                if (oos != null)
                oos.close();
                if (socket != null)
                socket.close();
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        public void run()
        {
            while(isStart)
            {
            synchronized (this)
            {
                try
                {
                    if (transEn != null)
                    {
                            wait();
                            try
                            {
                                oos.writeObject(transEn);
                                oos.flush();
                                //oos.reset();
                            }
                            catch (IOException e)
                            {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                    }
                }
                catch (InterruptedException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            }
            releaseResouce();
        }
}

//客户端线程,在客户端线程启动输出和输入线程
 public class  ClientThread extends Thread
{

        private ClientOutputThread out;
        private ClientInputThread in;
        private Socket socket;
        public ClientThread(Socket socket)
        {
            this.socket = socket;

        }

        public void run()
        {   

            out = new ClientOutputThread(socket);
            in = new ClientInputThread(socket);
            out.start();
            in.start();

        }

        public ClientInputThread getIn()
        {

            return in;

        }
        public ClientOutputThread getOut()
        {

            return out;

        }
}
//客户端
 public class Client
{
        private static Client client;
      //  private boolean isLogin  = false;
        private Socket socket;
        private ClientThread clientThread;
        private Client()
        {

        }

        public static synchronized Client getInstance()
        { 

                if (client == null)
                {
                    client = new Client();
                }
                return client;
        }  

        public boolean startClient()
        {
            try
            {
                socket = new Socket();
                socket.connect(new InetSocketAddress("10.0.2.2",5345),2000);
                if (socket.isConnected())
                {
                    System.out.println("Connecting...");
                    clientThread = new ClientThread(socket);
                    clientThread.start();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
                return false;
            }
            return true;
        }

     // 直接通过client得到读线程
        public ClientInputThread getClientInputThread()
        {
            return clientThread.getIn();
        }

        // 直接通过client得到写线程
        public ClientOutputThread getClientOutputThread()
        {
            return clientThread.getOut();
        }

}
//在onResume里头启动service,由service启动客户端
     protected void onResume()
    {
        // TODO Auto-generated method stub
        super.onResume();
        if (!GetMsgService.isStart)
        {
             Intent service = new Intent(FirstActivity.this, GetMsgService.class);
             startService(service);
            //isServiceRunning = true;
        } 

    }

报错信息


解决方案

http://www.oschina.net/question/2245161_2175113

解决方案二:

this.ois = new ObjectInputStream(this.socket.getInputStream()); this.socket.getInputStream()==null 出现的null指针吧

解决方案三:

this.ois = new ObjectInputStream(this.socket.getInputStream());
你传进来的 socket 有问题;

时间: 2024-10-03 01:39:22

Android 中new ObjectInputStream无法创建对象的相关文章

android中的service本质是一个类还是一个方法还是一个对象

问题描述 android中的service本质是一个类还是一个方法还是一个对象 android中的service本质是一个类还是一个方法还是一个对象 当然我明白java中一切都是对象的这种说法 解决方案 service在哪里看到的,作为类的定义它是类,对它实例化创建了对象并且执行就是对象了. 解决方案二: java中一切都是对象 这个说法其实不准确.你能说java中的关键字是对象么? 解决方案三: Service(服务)是Android 核心组件之一,特点就是Android系统帮你实例化他的对象

Android 中的 Effective Java(速查表)

本文讲的是Android 中的 Effective Java(速查表), Effective Java 是一本被广泛认可的著作,它指明了在写 Java 代码时兼顾可维护性与效率的方式.Android 也是使用 Java 来开发的,这意味着前书中的所有建议仍旧可用,真的是这样吗?并不尽然.某些同学 认为书中的"大部分"建议都不适用于 Android 开发,但我认为并不是这样.我承认书中的部分建议确实不适用,因为并非所有 Java 特性都有针对 Android 优化(比如说枚举,序列化等等

Android中Activity启动模式详解,可以控制程序按home键后进来还会调用一个自己不喜欢的界面

其实这是很简单的一个问题.但是这还是要对android中activity的启动模式有相当的理解才行,当点击home键的时候,懂Android的人都知道,他会把当前activity放到后退栈中, 栈(Stack)又称堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算.人们把此端称为栈顶,栈顶的第一个元素被称为栈顶元素,相对地,把另一端称为栈底.向一个栈插入新元素又称为进栈或入栈,它是把该元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称为出栈或退栈,它是把栈

Android中的IPC机制

IPC是 Inter-Proscess Communication的缩写,含义为进程间的通讯或者跨进程通讯,是指两个进程之间进行数据交换的过程.按操作系统的中的描述,线程是CPU调度最小的单元,同时线程是一种有限的系统资源,而进程是指一个执行单元,在PC和移动设备上指一个程序或者一个应用.一个进程可以包含多个线程,因此进程和线程是包含于被包含的关系. IPC的使用场景就必须提到多进程,只有面对多进程这种场景下,才需要考虑进程间通讯.多进程的情况分为两种:第一种是一个应用因为某些原因自身需要采用多

Android性能优化篇:Android中如何避免创建不必要的对象

在编程开发中,内存的占用是我们经常要面对的现实,通常的内存调优的方向就是尽量减少内存的占用.这其中避免创建不必要的对象是一项重要的方面. Android设备不像PC那样有着足够大的内存,而且单个App占用的内存实际上是比较小的.所以避免创建不必要的对象对于Android开发尤为重要. 本文会介绍一些常见的避免创建对象的场景和方法,其中有些属于微优化,有的属于编码技巧,当然也有确实能够起到显著效果的方法. 使用单例 单例是我们常用的设计模式,使用这种模式,我们可以只提供一个对象供全局调用.因此单例

从源码剖析Android中的Intent组件_Android

我们知道,Intent主要用来激活安卓几大组件,那么它具体是怎样来激活的?激活时是否可以携带java对象?为何要将对象序列化后才能传递? 一.Intent官网解释Intent可以被startActivity用来加载Activity,也可以被broadcastIntent发送给指定的BroadReceiver组件, 或者被startService.bingService来与后台service通信. Intent最主要作用就是加载Activity,好比Activity之间的胶水. Intent数据结

Android中怎样避免创建不必要的对象_Android

前言 随着在APP中分配更多的对象,你就得实施定期的强制垃圾收集,会导致用户体验产生小卡顿现象.并发垃圾处理器在Android 2.3中引入,但是总是应该避免不必要的工作,因此应该在不必要的时候避免创建对象实例. 在编程开发中,内存的占用是我们经常要面对的现实,通常的内存调优的方向就是尽量减少内存的占用. Android设备不像PC那样有着足够大的内存,而且单个App占用的内存实际上是比较小的.所以避免创建不必要的对象对于Android开发尤为重要. 本文会介绍一些常见的避免创建对象的场景和方法

Android中ListView用法实例分析_Android

本文实例分析了Android中ListView用法.分享给大家供大家参考,具体如下: 通过在Layout中添加ListView Widget可以达到在页面布局具有列表效果的交互页面.在这里通过举例来说明怎样在Layout中添加ListView以及怎样应用. 配合设计了两个事件Listener:  OnItemSelectedListener事件为鼠标的滚轮转动时所选择的值:OnItemClickListener事件则为当鼠标单击时,所触发的事件.由此可以区别出list中的"选择"与&q

解析Android中的Serializable序列化_Android

1.为何要序列化? -- 把内存中的java对象能够在磁盘上持久保存 -- 通过网络传输对象 -- 通过RMI(Remote Method Invocation 远程过程调用)传输. 通过序列化可以把对象转化为与平台无关的二进制流,在重新使用前进行反序列化,重新转化为java对象. (远程过程调用针对分布式Java应用,对开发人员屏蔽不同JVM和网络连接等细节,是的分布在不同JVM上的对象似乎存在于一个统一的JVM中,能够方便的通讯) 2.如何让Java对象可以被序列化? 在java里只需让目标