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