2 u012751110 u012751110 于 2016.04.30 18:35 提问

Android 中new ObjectInputStream无法创建对象 2C
//程序在这里报错了;
 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;
        } 

    }

报错信息

报错信息说是空指针异常经过检查得知是ClinetInputThread的构造方法中的this.ois对象为成功创建,所以后来在通过Client的getClientInputThread方法得到的是一个空对象

但是ClientOutputThread中却能成功创建this.oos对象,如打印出的log信息显示,oos == true 是false
ClientInputThread未能成功创建this.ois对象,如打印出的log信息显示,ois == true是 true

3个回答

devmiao
devmiao   Ds   Rxr 2016.05.02 05:15
u010076059
u010076059   2016.05.04 22:03

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

u012751110
u012751110 this.socket.getInputStream()为空
大约 2 年之前 回复
q610098308
q610098308   2016.04.30 21:59

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

u012751110
u012751110 this.ois = new ObjectInputStream(socket.getInputStream());//这样写,一样不对啊
大约 2 年之前 回复
u012751110
u012751110 怎么讲,为啥输出流没出错呢
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java IO系列2 InputStream之ObjectInputStream
一、对象序列化 当一个可序列化类有多个父类时(包括直接父类和间接父类),这些父类要么有无参数的构造器,要么也是可序列化的,否则反序列化时抛出InvalidClassException。如果父类是不可序列化的,只是带有无参数的构造器,则该父类中定义的Field值不会序列化到二进制流中 public class Computer { public String name; public in
ObjectInputStream类和ObjectInputStream类的使用
ObjectInputStream和ObjectInputStream类创建的对象被称为对象输入流和对象输出流。 创建文件输出流代码: FileOutputStream file_out = new FileOutputStream(“student.dat”); ObjectOutputStream object_out = new ObjectOutputStream(file_out)
Java Socket中使用ObjectInputStream发生死锁
 Socket编程中一个很奇怪的现象:用DataInputStream对象没错,但改为ObjectInputStream就出错了,而且try...catch还抓不到异常。 例如在Socket客户端中,使用DataInputStream进行下述编程,很正常,不会出现问题:  DataInputStream dis = new DataInputStream(socket
new ObjectInputStream(socket.getInputStream());无法执行
写JAVA,用到网络传递对象时,遇到了一个很奇怪的问题。 代码执行到 new ObjectInputStream(socket.getInputStream()); 就执行不下去了。 上网找了一些资料,可能是这样的: 之所以在那句代码不执行下去不报错不异常,是因为在那里线程进入了阻塞状态,阻塞不太好,用异步的方法比较好。另外ObjectInputStream是以流方式通讯,这种流是TCP
解决不能创建NEW ACTIVITY问题
有时真搞不懂ECLIPSE的开发人员的想法。老是出现一些莫名其妙的问题。前段时间因需要,把系统从XP3换成WIN7后,想开发一个带TTS功能的ANDROID的APK,继续使用放在D盘的ECLIPSE。开始还是挺顺利的。但需要新建NEW ACTIVITY时,却出现了问题,每次到了FINISH那一步的时候就卡在那里,怎么也新建不了。百度了好久发现不少人都出现这个问题,最终在朋友的指点下解决了。具体如下
【IO】ObjectInputStream的使用方法及其注意事项
【IO----ObjectInputStream的使用方法及其注意事项】 一、代码及笔记演示 package ioDemo.inputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream
Android中关于在onDrow或者onMeasure中创建对象性能问题
在实际开发中Android中自带的控件有时无法满足我们的需求,这时就需要我们重写控件来实现我们想要的功能。 还有个关于UI体验的问题,就是在onDraw()函数中最好不要去创建对象,否则就提示下面的警告信息:因为onDraw()调用频繁,不断进行创建和垃圾回收会影响UI显示的性能 例如: protected void onDraw(Canvas canvas) {   super.o
Java中ObjectInputStream 与 ObjectOutputStream的使用
ObjectInputStream能够让你从输入流中读取Java对象,而不需要每次读取一个字节。你可以把InputStream包装到ObjectInputStream中,然后就可以从中读取对象了 ObjectOutputStream能够让你把对象写入到输出流中,而不需要每次写入一个字节。你可以把OutputStream包装到ObjectOutputStream中,然后就可以把对象写入到该输出流中
用线程解决Socket的getInputStream阻塞
1.背景: 在Socket通信中,当我们希望传输对象时,往往会用到输入/输出对象流。 ObjectInputStream in=new ObjectInputStream(socket.getInputStream()); ObjectOutputStream out=new ObjectOutputStream(socket.getOutputStream());   2.问题: 当
ObjectOutputStream 和 ObjectInputStream类的简单介绍,及运用。
以前在文件中写入数据的主要方式是用字符流或者字节流。但是如果想保存并读取一个对象,该怎么办?可以是用ObjectOutputStream类 和 ObjectInputStream类。   ObjecOutputStream类 常用构造方法:ObjectOutputStream oos = new ObjectOutputStream(OutputStream out);//创建一个写入指