Android / Java Java套接字oputput或输入流为null

时间:2014-08-27 09:25:09

标签: java android sockets

我制作了android应用程序,并且我有这个代码的java.lang.NullPointerException。 Java服务器在计算机上。谢谢你的帮助。

try {
    ok.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                Socket socket;
                socket = new Socket("192.168.0.179", 5450);
                os = new PrintStream(socket.getOutputStream());
                is = new DataInputStream(socket.getInputStream());
                in = is.readLine().trim();

                if(in == "hello") {
                    os.print(edit.getText().toString());
                    os.flush();
                    Log.d("LoL", in);
                    Log.d("LoL", edit.getText().toString());
                    in = is.readLine().trim();
                    edit.setText(in);
                    os.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
} catch (Exception e) {
    Log.d("LoL",e.toString());
}

1 个答案:

答案 0 :(得分:1)

in == "hello"表达式将始终返回false,因为您要比较字符串in"hello"内容;该表达式检查它们是否是同一个对象,并且永远不会发生。对于像字符串这样的非基本类型,我们应该编写"hello".equals(in)。 (您也可以编写in.equals("hello"),但后一种形式可以防止另一种可能的NullPointerException)

由于该表达式将始终返回false,因此if块将永远不会执行。因此,NPE可能只发生在两个地方:

  • in ok.setOnClickListener:如果ok变量为null,例如未初始化,调用任何方法将导致NPE;
  • in in = is.readLine().trim();:如果InputStream为空(例如,没有来自服务器的数据或EOF)is.readLine()将返回null,并且对空对象调用trim()将导致NPE

BTW,InputStream.readLine()已弃用,请改用BufferedReader。这解释了here