2015-05-06 48 views
0

我在嘗試通過Servlet將數據檢索到使用JSON的Android中時遇到了一些問題。所以基本上這是我的控制器類:Android Servlet AsyncTask#1致命異常

public String GetPwd(SoccerUserModel userModel) throws JSONException { 
    String page, pwd = null; 
    JSONArray jsonArray; 

    try { 
     String userName = userModel.getUserName(); 
     String securityQuestion = userModel.getSecurityQuestion(); 
     String securityAnswer = userModel.getSecurityAnswer(); 

     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(MainActivity.URL 
       + "/SoccerWebService?action=GetPwd&userName=" 
       + userName + "&securityQuestion=" + securityQuestion + "&securityAnswer=" + securityAnswer + ""); 

     HttpResponse response = client.execute(request); 
     HttpEntity entity = response.getEntity(); 
     String responseString = EntityUtils.toString(entity, "UTF-8"); 
     page = "{\'Pwd\':" + responseString + "}"; 
     try { 
      JSONObject jsonObject = new JSONObject(page); 
      jsonArray = jsonObject.getJSONArray("Pwd"); 
      int length = jsonArray.length(); 
      for (int i = 0; i < length; i++) { 
       JSONObject attribute = jsonArray.getJSONObject(i); 
       pwd = attribute.getString("pwd"); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return pwd; 
} 

而且我AsyncTaskClass:

public class GetPwdAsyncTask extends AsyncTask<SoccerUserModel, Integer, Double> { 
public static String pwd; 
UserController userCtrl = new UserController(); 
Context context; 

public interface OnRoutineFinished { 
    void onFinish(); 
} 

private OnRoutineFinished mCallbacks; 

public GetPwdAsyncTask(OnRoutineFinished callback) { 
    mCallbacks = callback; 
} 

public GetPwdAsyncTask() { 
} 

@Override 
protected Double doInBackground(SoccerUserModel... params) { 
    if (params.length == 1) { 
     try { 
      pwd = userCtrl.GetPwd(params[0]); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

protected void onPostExecute(Double result) { 
    if (mCallbacks != null) 
     mCallbacks.onFinish(); 
} 

protected void onProgressUpdate(Integer... progress) { 
} 

} 

和位於Servlet中,然後我的SQL部分:

else if (action.equalsIgnoreCase("GetPwd")) { 
     String userName = request.getParameter("userName"); 
     String securityQuestion = request.getParameter("securityQuestion"); 
     String securityAnswer = request.getParameter("securityAnswer"); 

     try { 
      PreparedStatement statement = db 
        .getStatement("SELECT * FROM soccerUser WHERE userName = '" 
          + userName + "' AND securityQuestion = '" + securityQuestion + "'" + 
            " AND securityAnswer = '" + securityAnswer + "'"); 
      ResultSet result = statement.executeQuery(); 
      while (result.next()) { 
       JSONObject jsonResult = new JSONObject(); 
       jsonResult.put("pwd", result.getString("pwd")); 

       jsonArray.put(jsonResult); 
      } 
     } 

     catch (JSONException je) { 
      System.out.println(je.getMessage()); 
     } catch (Exception exc) { 
      System.out.println(exc.getMessage()); 
     } 

     out.println(jsonArray.toString()); 

    } 

我有這個網址進行測試: http://localhost:8080/SoccerWebService/SoccerWebService?action=GetPwd&userName=user&securityQuestion=Who我是& securityAnswer =將此結果返回給我的用戶:

[{"pwd":"123"}] 

然而,當我嘗試從我的手機上運行,​​我收到這些錯誤消息:

05-06 22:05:35.990: W/dalvikvm(5113): threadid=12: thread exiting with uncaught exception (group=0x40c4b1f8) 
05-06 22:05:36.005: E/AndroidRuntime(5113): FATAL EXCEPTION: AsyncTask #1 
05-06 22:05:36.005: E/AndroidRuntime(5113): java.lang.RuntimeException: An error occured while executing doInBackground() 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at android.os.AsyncTask$3.done(AsyncTask.java:278) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at java.lang.Thread.run(Thread.java:856) 
05-06 22:05:36.005: E/AndroidRuntime(5113): Caused by: java.lang.IllegalArgumentException: Illegal character in query at index 110: http://192.168.0.25:8080/SoccerWebService/SoccerWebService?action=GetPwd&userName=user3&securityQuestion=Whats your pet name&securityAnswer=hiha 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at java.net.URI.create(URI.java:727) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:75) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at Controller.UserController.GetPwd(UserController.java:111) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at AsyncTask.GetPwdAsyncTask.doInBackground(GetPwdAsyncTask.java:32) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at AsyncTask.GetPwdAsyncTask.doInBackground(GetPwdAsyncTask.java:1) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at android.os.AsyncTask$2.call(AsyncTask.java:264) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
05-06 22:05:36.005: E/AndroidRuntime(5113):  ... 5 more 

我不知道哪部分出了問題。提前致謝。

+0

好像你在url中有空的空間,也就是問題,我想在將這些變量追加到url之前,你應該先做一個url編碼。 http://stackoverflow.com/questions/3286067/url-encoding-in-android – Surely

回答

1

拋出:IllegalArgumentException:在指數110查詢非法字符...

http://192.168.0.25:8080/SoccerWebService/SoccerWebService?action=GetPwd&userName=user3&securityQuestion=Whats你的寵物的名字& securityAnswer = hiha

在指數110多,我可以看到:

你的寵物名稱& securityAnswer = hiha

您的無效字符只是一個空格,這在URL中是不允許的。

請務必登錄URL encode

+0

啊我明白了。非常感謝。我花了很長時間來逐個檢查字符,但最後它是間隔故障。謝謝!!! – hyperfkcb

+0

不客氣。如果URL編碼解決了您的問題,請隨時接受我的回答:) – shkschneider