尝试在空对象引用上调用虚拟方法[Android Studio]

问题描述

我对此很陌生。我正在尝试在android studio上创建wifidirect应用,但是我有一个我不明白的错误

2020-10-21 21:00:07.217 24543-24543/jeux.killer.test E/AndroidRuntime: FATAL EXCEPTION: main
    Process: jeux.killer.test,PID: 24543
    java.lang.NullPointerException: Attempt to invoke virtual method 'void jeux.killer.test.MainActivity$ServerClass.writeData(byte[])' on a null object reference
        at jeux.killer.test.MainActivity$3.onClick(MainActivity.java:153)
        at android.view.View.performClick(View.java:7448)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

所以我试图在153行检查并看到:

 serverClass.writeData(bytes);

此行出现在我的方法exqListener中:

private void exqListener() {
        btnOnOff.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    Intent panelIntent = new Intent(Settings.Panel.ACTION_WIFI);
                    startActivityForResult(panelIntent,545);
                }
                if (wifiManager.isWifiEnabled())
                {
                    wifiManager.setWifiEnabled(false);
                    btnOnOff.setText("ON");
                }
                else
                {
                    wifiManager.setWifiEnabled(true);
                    btnOnOff.setText("OFF");
                }
                btndiscover.setonClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View v){
                        mManager.discoverPeers(mChannel,new wifip2pManager.ActionListener(){
                            @Override
                            public void onSuccess(){
                                connectionStatus.setText("discovery started");

                            }
                            @Override
                            public  void onFailure(int i){
                                connectionStatus.setText("discovery starting Failed");
                            }
                        });
                    }
                });
                listView.setonItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent,View view,int i,long l) {
                        final wifip2pDevice device = deviceArray[i];
                        wifip2pConfig config = new wifip2pConfig();
                        config.deviceAddress=device.deviceAddress;
                        mManager.connect(mChannel,config,new wifip2pManager.ActionListener(){
                            @Override
                                    public void onSuccess(){
                                Toast.makeText(getApplicationContext(),"connected to"+device.deviceName,Toast.LENGTH_SHORT).show();
                            }
                            @Override
                                    public void onFailure(int i){
                                Toast.makeText(getApplicationContext(),"unable to connect",Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                });
            }
        });
        btnSend.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String msg = writeMsg.getText().toString();
                byte[] bytes =msg.getBytes();
                btnSend.setVisibility(View.INVISIBLE);
                if(userType.equals("server")) {
                    serverClass.writeData(bytes);
                } else if (userType.equals("client")){
                    clientClass.writeData(bytes);
                }
            }
        });
    }

调用serverClass:

public class ServerClass extends AsyncTask<String,Integer,Boolean> {
        Socket socket;
        ServerSocket serverSocket;
        InputStream inputStream = null;
        OutputStream outputStream = new ByteArrayOutputStream(1024);
        @Override
        protected Boolean doInBackground(String... strings) {
            boolean result = true;
            try {
                serverSocket = new ServerSocket(8888);
                socket = serverSocket.accept();
            } catch (IOException e) {
                result = false;
                e.printstacktrace();
            }
            return result;
        }

        public void writeData(final byte[] bytes) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        outputStream.write(bytes);
                    } catch (IOException e) {
                        e.printstacktrace();
                    }
                }
            }).start();
            btnSend.setVisibility(View.VISIBLE);
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if(result) {
                try {
                    inputStream = socket.getInputStream();
                    outputStream = socket.getoutputStream();
                } catch (IOException e) {
                    e.printstacktrace();
                }
                //listener
                new Thread(new Runnable(){
                    public void run() {
                        byte[] buffer = new byte[1024];
                        int x;
                        while (socket!=null) {
                            try {
                                x = inputStream.read(buffer);
                                if(x>0) {
                                    handler.obtainMessage(MESSAGE_READ,x,-1,buffer).sendToTarget();
                                }
                            } catch (IOException e) {
                                e.printstacktrace();
                            }
                        }
                    }
                }).start();
                btnSend.setVisibility(View.VISIBLE);
            } else {
                Toast.makeText(getApplicationContext(),"Could not create sockets",Toast.LENGTH_SHORT).show();
                //restart socket assignment process
            }
        }
    }

如果有人可以解释我在做什么,我将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)