我在学校的一个小型Android项目中遇到了一些问题。我需要通过发送用户名来通过.php从在线数据库中请求密码。它应该返回加密密码。但是我用来连接数据库和接收密码的方法似乎有问题。 LogCat给了我这些:
HTTP连接错误java.net.UnknownHostException:boekenapp.atwebpages.com
转换结果java.lang.NullPointerException时出错
解析数据时出错org.json.JSONException:
所以我的问题是:我做错了什么?/我需要做些什么才能让它发挥作用?
代码:
public static String phpconnect(String name, String value) {
String result = "";
InputStream is = null;
//variables to send to database
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair(name,value));
//HTTP post
try{
HttpClient httpclient = new DefaultHttpClient();
URI connection = new URI("http://boekenapp.atwebpages.com/phpscript.php");
HttpPost httppost = new HttpPost(connection);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch(Exception e) {
Log.e("log_tag", "Error in HTTP connection "+e.toString());
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result=sb.toString();
} catch(Exception e){
Log.e("log_tag", "Error converting result "+e.toString());
}
//parse JSON data
try{
JSONArray jArray = new JSONArray(result);
for(int i=0;i<jArray.length();i++){
JSONObject json_data = jArray.getJSONObject(i);
Log.i("log_tag","userid: "+json_data.getInt("userid")+", password: "+json_data.getString("password"));
}
} catch(JSONException e) {
Log.e("log_tag", "Error parsing data "+e.toString());
}
return "";
}
答案 0 :(得分:0)
第二个try块将始终执行,因为您只登录第一个catch块。
您应该考虑return语句或throw语句。另一种方法是将第二个try块嵌入第一个try块中,但可能性较差。
在您的情况下,问题是连接本身失败。你确定你有网络吗?你可以从你的计算机和Android ping主机(你可以在CLI上使用adb shell ping <host>
。)
不要在第一行截断错误堆栈,必须自上而下地读取堆栈,直到找到导致错误的代码段为止。
答案 1 :(得分:0)
首先,浏览器中使用的此代码中的URL重定向到www.alotspace.com/error-404/。大家就知道了。
如果不进行测试,只需查看代码,我就会先检查响应的状态行。这就是
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
// here all is OK, you can check for 404 and so on
}
此外,我看到您使用缓冲读取器处理响应,并将所有内容放在StringBuilder的代码中。更好的选择是使用gson。
但首先要关注最初的网络相关异常。其他异常只是单独的try / catch块的结果(正如@Snicolas已经指出的那样)。 Unknownhost听起来像没有网络。重定向只会返回不同于预期的输出,而不是unkownhost。要验证是否正在测试您正在测试的Android设备上的网址。