【问题标题】:Code works in old project, doesn't in new project [duplicate]代码在旧项目中有效,在新项目中无效[重复]
【发布时间】:2019-06-18 09:54:40
【问题描述】:

我有一个去年 5 月左右的旧项目,它按预期工作,但是当我将代码复制/粘贴到新项目中时,它会引发异常。有问题的代码是一个简单的 TCP/IP 客户端。

粘贴到新项目时会引发 NPE 异常:

com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: Thread-5 
Process: com.example.myapplication, PID: 32308
java.lang.NullPointerException: Attempt to invoke virtual method 'void java.io.DataOutputStream.writeBytes(java.lang.String)' on a null object reference
    at com.example.myapplication.MainActivity$sendMessage.run(MainActivity.java:212)
    at java.lang.Thread.run(Thread.java:761)

我尝试寻找有关 Socket NPE 的答案,但我找不到任何与我相关的内容,因为这段代码在旧项目中运行时(并且正在)工作。

我使用了 Studios 调试器,正如人们所期望的那样,会显示“socket = null”。这是我的套接字在“try”块中的“catch”初始化:

InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
                socket = new Socket(serverAddr, 502);
                os = new DataOutputStream(socket.getOutputStream());
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

以及完整的代码:

public class MainActivity extends AppCompatActivity
{

    public EditText serverIp,smessage;
    public TextView chat,VALUE0,VALUE1,VALUE2,VALUE3;
    public Button connectPhones,disconnectPhones,send;
    public String serverIpAddress = "",msg = "",msg1 = "",str = "";
    public String substrVALUE,substrMSG = "";
    public Handler handler = new Handler();
    public Socket socket;
    public DataOutputStream os;
    public BufferedReader in;
    public int i,ID,TYPE;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        serverIp = (EditText) findViewById(R.id.server_ip);
        smessage = (EditText) findViewById(R.id.smessage);
        chat = (TextView) findViewById(R.id.chat);
        VALUE0 = (TextView) findViewById(R.id.VALUE0);
        VALUE1 = (TextView) findViewById(R.id.VALUE1);
        VALUE2 = (TextView) findViewById(R.id.VALUE2);
        VALUE3 = (TextView) findViewById(R.id.VALUE3);

        send = (Button) findViewById(R.id.send_button);
        connectPhones = (Button) findViewById(R.id.connectPhones);
        disconnectPhones = (Button) findViewById(R.id.disconnectPhones);

        connectPhones.setEnabled(true);
        disconnectPhones.setEnabled(false);
        send.setEnabled(false);

        connectPhones.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                connectPhones.setEnabled(false);
                disconnectPhones.setEnabled(true);
                send.setEnabled(true);
                serverIpAddress = serverIp.getText().toString();
                str = "";
                if (!serverIpAddress.equals(""))
                {
                    Thread clientThread = new Thread(new ClientThread());
                    clientThread.start();
                }
            }
        });

        send.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {
                 Thread sendThread = new Thread(new sendMessage());
                 sendThread.start();
            }
        });

        disconnectPhones.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
           {
              connectPhones.setEnabled(true);
              disconnectPhones.setEnabled(false);
              send.setEnabled(false);
                  try
                  {
                      socket.close();
                      handler.post(new Runnable() {
                          @Override
                          public void run() {
                              chat.setText("");
                              str = "";
                          }
                      });
                  }
                  catch (IOException e)
                  {
                  }
                  str = "";
                  msg = "";
           }
        });
    }

    public class ClientThread implements Runnable
    {
        public void run()
        {
            try
            {
                InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
                socket = new Socket(serverAddr, 502);
                os = new DataOutputStream(socket.getOutputStream());
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));


                while(true) {

                    String line = null;
                    while ((line = in.readLine()) != null)
                    {
                        msg1 = line;
                        substrMSG=msg1.toString();

                        //if ( substrMSG.substring(0,1).matches("S"))
                        //{
                            i = 0;
                            while (i < msg1.length())
                            {
                                String cutting and printing to textView
                    }
                    Thread.sleep(100);
                }
            }
            catch (Exception e)
            {
            }
        }
    }

    class sendMessage implements Runnable
    {
        @Override
        public void run()
        {
            try
            {
                str = smessage.getText().toString();
                str = str + "\n";
                msg = msg + "C: " + str;
                handler.post(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        chat.setText(msg);
                    }
                });
                os.writeBytes(str);
                os.flush();
            }
            catch(IOException e)
            {
            }
        }
    }
}

我必须进行哪些更改才能使其正常工作?

【问题讨论】:

  • 您是否忘记在清单中添加INTERNET 权限?
  • 是的,忘记权限了。谢谢!
  • 如果您的代码有任何合理的异常处理,您会立即发现这是一个权限问题。相反,您吞下并丢弃异常信息,让自己的生活变得更加艰难。

标签: java android sockets


【解决方案1】:

正如 EpicPandaForce 所说,我忘了设置正确的权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多