为了账号安全,请及时绑定邮箱和手机立即绑定

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法

呼唤远方 2021-09-29 13:12:47
我正在尝试使用 WiFip2p 创建一个聊天应用程序。一切都在这个应用程序中完成。在发送和接收消息应用程序运行良好之前。在那之后,我得到了这个错误。当我连接到另一台设备时出现此错误。它显示了一个空对象引用。我不知道为什么我需要一个解决方案,任何人都可以帮助我谢谢。 public class WiFi_Activity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_wi_fi_);        FINDVIEWBYID();        CLICKLISTINER();    }    Handler handler=new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message msg) {            switch (msg.what)            {                case MESSAGE_READ:                    byte[]  readbuffer=(byte[])msg.obj;                    String tempmez=new String(readbuffer,0,msg.arg1);                    txt_message.setText(tempmez);                    break;            }            return true;        }    });    private void FINDVIEWBYID() {            btn_onoff=findViewById(R.id.onOff);            btn_discover=findViewById(R.id.discover);            btn_send=findViewById(R.id.sendButton);            listView=findViewById(R.id.peerListView);            txt_connectionsts=findViewById(R.id.connectionStatus);            txt_message=findViewById(R.id.readMsg);            edit_message=findViewById(R.id.writeMsg);        wifiManager= (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);        wifiP2pManager= (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);        channel=wifiP2pManager.initialize(this,getMainLooper(),null);        broadcastReceiver=new Wifi_broadcast_reciever(wifiP2pManager,channel,this);        intentFilter=new IntentFilter();        intentFilter.addAction(wifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);        intentFilter.addAction(wifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);        intentFilter.addAction(wifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);        intentFilter.addAction(wifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);    }   
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

我能看到的唯一问题是您正在捕获(并忽略)来自getInputStream()和 的错误getOutputStream()。异常是停止执行,因此如果getInputStream()出现错误,则不会设置。您的两个流都将为空。


由于您至少要打印堆栈跟踪,因此请在实际崩溃之前检查其他堆栈跟踪。它可能会告诉您更多关于出了什么问题的信息。


为了解决这个问题,我建议不要捕捉异常,而是让构造函数 throw IOException。如果你早点抓住它,它会给你以后带来更少的麻烦。


编辑:我已经多看了你的课程,我发现你没有设置时间的地址Socket。在获取数据流之前执行此操作。不使用字段将起作用。


private Socket socket;


public SendRecieve(Socket skt) {

    this.socket = skt;

}


@Override

public void run() {

    try {

        InputStream in = socket.getInputStream();

        ... etc

    } ...

}


查看完整回答
反对 回复 2021-09-29
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

您在 Clientclas 运行执行之前调用 Sendreceiver start,因此需要执行以下操作:


public class Clientclass extends Thread {


Socket socket;

String host_address;


public Clientclass(InetAddress hostaddress){


    host_address=hostaddress.getHostAddress();

    socket=new Socket();

}


@Override

public void run() {


    try {

        socket.connect(new InetSocketAddress(host_address,1111),500);


    sendRecieve=new SendRecieve(socket);

    sendRecieve.start();


    } catch (IOException e) {

        e.printStackTrace();

    }

}

}


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 297 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号