在另一个方法

时间:2016-09-24 09:49:33

标签: java nullpointerexception urlconnection

当我想使用URLConnection类型的变量时,我遇到了问题。

这是我的connectToServer()方法:

    private int connectToServer(){
        try {
            URL u = new URL("http://192.168.1.121:5000/");
            URLConnection con = u.openConnection();
            con.setDoOutput(true);
        }catch (IOException e){
            e.printStackTrace();
        }
        return 1;
    }

我想在con方法中使用变量sendToServer(),这里是代码:

    public String sendToServer(String data){
        try {
            OutputStreamWriter streamWriter = new OutputStreamWriter(con.getOutputStream());
            streamWriter.write(data);
            waktu_kirim = GetUTCdatetimeAsString();
            streamWriter.flush();


            BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            reader.close();
            Log.d("RESPONSE", sb.toString());
            return sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }

但是我得到了错误结果,告诉con变量为空。如何使用与服务器保持连接的变量con

2 个答案:

答案 0 :(得分:0)

con是方法connectToServer()中的局部变量。如果您想在connectToServer()中使用变量的值(在sendToServer()中初始化之后),则必须在从前者调用后者时传递它。因此,您必须从sendToServer()致电connectToServer()

private int connectToServer(){
    /* initialize con */
    URL u = new URL("http://192.168.1.121:5000/");
    URLConnection con = u.openConnection();
    con.setDoOutput(true);
    ...
    sendToServer(some_string, con);
    return 1;
}

...

public String sendToServer(String s, URLConnection con){
    //here, con is same as the con in connectToServer()
}

你通常如何使用另一种方法中的变量。但是,如果由于某些原因无法从sendToServer()调用connectToServer(),则可以在类中使用全局实例变量,首先在connectToServer()中初始化它,然后在sendToServer()中使用它}。

import java.net.*;
class Myclass{
    public URLConnection con;

    private int connectToServer(){ //this should be called before 
                                  //sendToServer()
        /* initialize con here */
        URL u = new URL("http://192.168.1.121:5000/");
        con = u.openConnection();
        con.setDoOutput(true);
    }

    public String sendToServer(String s){
        //now use con here
    }
}

答案 1 :(得分:0)

  

当我想使用(Empty)类型的变量时,我遇到了问题。

你的问题是你有两个这样的变量。

URLConnection

这是其中之一。它是一个方法局部变量,你没有返回它,所以它一旦超出范围就会消失。

            URLConnection con = u.openConnection();

这就是它超出范围的地方。返回一个常数 return 1; 的点逃脱了我。更改方法及其签名以返回1

  

我想在con方法

中使用变量con

但你不是。你宣布并使用另一个。

sendToServer()

在这里,无论 BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 是什么,都不是在前一种方法中声明和初始化的con

  

但我收到错误结果,告诉con变量为空。

我同意。它是空的。你从未将它从null改变。

  

如何使用与服务器保持连接的变量con

使用在第一种方法中创建的那个。但事实上你应该删除第一种方法,并在每次需要时通过类似的方法创建一个新的con。您明确的目标是连接到服务器一次,并为多个请求重新使用此连接是不可能的;鉴于HttpURLConnection在幕后进行连接汇集,它甚至不是必需的。