Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我试图从SQL数据库中获取数据,但我真的不知道出了什么问题_Android_Android Asynctask - Fatal编程技术网

Android 我试图从SQL数据库中获取数据,但我真的不知道出了什么问题

Android 我试图从SQL数据库中获取数据,但我真的不知道出了什么问题,android,android-asynctask,Android,Android Asynctask,我试图从数据库中获取一些数据,但我得到了“致命错误…”。。异步任务#2'。我对java和android studio还很陌生,因此我不知道我所做的是否正确。但简而言之,这就是我试图从数据库中读取JsonObject的原因: 设置输入流(con.getInputStream) 将其转换为字符串 并将其发送到JSONobject进行读取,然后返回 我使用的是API 23,但我还没有从网上得到多少信息。非常感谢您的帮助 public class fetchUserDataAsyncTask exten

我试图从数据库中获取一些数据,但我得到了“致命错误…”。。异步任务#2'。我对java和android studio还很陌生,因此我不知道我所做的是否正确。但简而言之,这就是我试图从数据库中读取JsonObject的原因:

设置输入流(con.getInputStream) 将其转换为字符串 并将其发送到JSONobject进行读取,然后返回

我使用的是API 23,但我还没有从网上得到多少信息。非常感谢您的帮助

public class fetchUserDataAsyncTask extends AsyncTask<Void, Void, User> {

    User user;
    GetUserCallback userCallback;

    fetchUserDataAsyncTask(User user, GetUserCallback userCallback) {
        this.user = user;
        this.userCallback = userCallback;
    }

    @Override
    protected User doInBackground(Void... params) {

        //Use HashMap, it works similar to NameValuePair
        Map<String, String> dataToSend = new HashMap<>();

        dataToSend.put("username", user.username);
        dataToSend.put("password", user.password);

        //Encoded String - we will have to encode string by our custom method (Very easy)
        String encodedStr = getEncodedData(dataToSend);


        User returneduser = null; //for the JSONobject

        try {

            //Converting address String to URL
            URL url = new URL(Server_Address + "FetchUserData.php");

            //Opening the connection (Not setting or using CONNECTION_TIMEOUT)
            HttpURLConnection con = (HttpURLConnection) url.openConnection();

            //Post Method
            con.setRequestMethod("POST");
            //To enable inputting values using POST method
            //(Basically, after this we can write the dataToSend to the body of POST method

            con.setDoOutput(true);

            OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
            //Writing dataToSend to outputstreamwriter
            writer.write(encodedStr);
            //Sending the data to the server - This much is enough to send data to server
            //But to read the response of the server, you will have to implement the procedure below
            writer.flush();



            //Attempt to read data and shit but doesnt work
            StringBuilder sb = new StringBuilder();
            BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));

            String line = null;

            while ((line = reader.readLine()) != null) { //Read till there is something available
                sb.append(line + "\n");     //Reading and saving line by line - not all at once
            }

            line = sb.toString();           //Saving complete data received in string, you can do it differently

            try {
                JSONObject jObject = new JSONObject(line);//result in the ().

                if (jObject.length() == 0) {
                    returneduser = null;
                }
                    else {

                        try {
                            String name = jObject.getString("name");
                            String teamname = jObject.getString("teamname");
                            String username = jObject.getString("username");
                            String password = jObject.getString("password");
                            String emailad = jObject.getString("emailad");

                            returneduser = new User(name, teamname, username, emailad, password);

                            }  catch (JSONException e) {
                             e.printStackTrace();
                            }
                     }

                } catch (JSONException e){
                    e.printStackTrace();
                    }

             }catch (IOException e){
            e.printStackTrace();
            }

        return returneduser;
    }

    @Override
    protected void onPostExecute(User returneduser) {
        progressDialog.dismiss();
        userCallback.done(returneduser);
        super.onPostExecute(returneduser);

    }

      //get encoded data (edit)

       (private String getEncodedData(Map<String, String> data) {
    StringBuilder sb = new StringBuilder();
    for (String key : data.keySet()) {
        String value = null;
        try {
            value = URLEncoder.encode(data.get(key), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        if (sb.length() > 0)
            sb.append("&");

        sb.append(key + "=" + value);
    }
    return sb.toString();
})

}

这是你的罪魁祸首:

java.lang.NullPointerException: Attempt to invoke virtual method 'int 
java.lang.String.length()' on a null object reference
您正在AsyncTask中调用此函数:

if (jObject.length() == 0) {
    returneduser = null;
}
改为:

if(jObject == null || jObject.length() == 0) {
    returneduser = null;
}
这样,当它进行检查时,它是空安全的。此外,您还可以通过在代码中设置断点并通过AndroidStudio、Intellij或Eclipse运行调试器来验证这一点,具体取决于您使用的是什么。这是你最好的选择,我建议你对所有你不能轻易识别的bug都尝试一下。在大多数情况下,您会很快看到错误,并且可以查看断点范围内所有变量的值,以验证它们是否符合预期


另一种效率较低的方法是,将Log.i(String,String)行放在任何地方,以跟踪正在发生的事情以及应用程序的状态,然后将其放入日志cat输出。

链接与“致命错误”关联的日志cat输出。。AsyncTask#2‘嘿,卢卡斯,我添加了logcat输出中的错误,原因是:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法‘int java.lang.String.length()’Bro,你需要学会读取日志。^^^嘿,现在,不要害羞,否则你会感到羞耻,因为我已经试了好几天了。我得到了相同的空指针错误。我添加了获取空指针错误的方法。它是GetEncodedata。
if(jObject == null || jObject.length() == 0) {
    returneduser = null;
}