2013-08-01 73 views
0

我一直在試圖想出一個實習生可以申請化妝課程的形式,當他們提交數據時將存儲在數據庫中。我是新來的android編程,我也使用PHP連接到數據庫。java.lang.String類型的值不能轉換爲JSONObject

我不知道其中的代碼出錯

這是我的錯誤:

08-01 14:04:42.808: E/JSON Parser(5907): Error parsing data org.json.JSONException:  Value <br of type java.lang.String cannot be converted to JSONObject 
08-01 14:18:03.149: I/tagconvertstr(5965): [null] 
08-01 14:18:03.149: W/dalvikvm(5965): threadid=15: thread exiting with uncaught exception (group=0x40a71930) 
08-01 14:18:03.308: E/AndroidRuntime(5965): FATAL EXCEPTION: AsyncTask #5 
08-01 14:18:03.308: E/AndroidRuntime(5965): java.lang.RuntimeException: An error occured while executing doInBackground() 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at android.os.AsyncTask$3.done(AsyncTask.java:299) 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at java.lang.Thread.run(Thread.java:856) 
08-01 14:18:03.308: E/AndroidRuntime(5965): Caused by: java.lang.NullPointerException 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at com.example.testmakeup.Makeup$CreateMakeup.doInBackground(Makeup.java:288) 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at com.example.testmakeup.Makeup$CreateMakeup.doInBackground(Makeup.java:1) 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
08-01 14:18:03.308: E/AndroidRuntime(5965):  at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
08-01 14:18:03.308: E/AndroidRuntime(5965):  ... 4 more 

我的Android代碼:

import android.app.Activity; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.app.TimePickerDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Spinner; 
import android.widget.TabHost; 
import android.widget.TimePicker; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.List; 
import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.widget.DatePicker; 

public class Makeup extends Activity { 
Button AbsentDate; 
Button MakeupDate; 
Button MakeupTime; 
Button Submit; 
private int year; 
private int month; 
private int day; 
private int hour; 
private int minute; 
static final int DATE_DIALOG_ID = 999; 
static final int DATE_DIALOG_ID_1 = 1; 
static final int TIME_DIALOG_ID = 2; 

private EditText name, trainee_id, batch_id, module_name, reason, remarks; 
private String department; 
private String makeuptime; 
private String makeupdate; 
private String absentdate; 

private static String Makeup_URL = "http://10.0.2.2/MajorProject/TestMakeup/NewMakeUp.php"; 
private static final String TAG_SUCCESS = "success"; 
private static final String TAG_MESSAGE = "message"; 
// JSON parser class 
private ProgressDialog pDialog; 
JSONParser jsonParser = new JSONParser(); 

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

     setContentView(R.layout.makeup);    
     TabHost tabs=(TabHost)findViewById(R.id.tabhost); 
     tabs.setup(); 
     TabHost.TabSpec spec=tabs.newTabSpec("tag1"); 
     spec.setContent(R.id.tab1); 
     spec.setIndicator("Make Up Form");   
     tabs.addTab(spec); 
     spec=tabs.newTabSpec("tag2"); 
     spec.setContent(R.id.tab2); 
     spec.setIndicator("Exam Claims"); 
     tabs.addTab(spec); 
     tabs.setCurrentTab(0);   
     setCurrentDateOnView(); 
     addListenerOnButton(); 
     setCurrentTimeOnView(); 

     name = (EditText)findViewById(R.id.Name); 
     trainee_id =(EditText)findViewById(R.id.TranineeID); 
     batch_id = (EditText)findViewById(R.id.BatchID); 
     module_name = (EditText)findViewById(R.id.ModuleName); 
     reason = (EditText)findViewById(R.id.Reason); 
     remarks = (EditText)findViewById(R.id.Remarks); 

     Spinner Spin = (Spinner) findViewById(R.id.spinner1); 

      ArrayAdapter<CharSequence> adapter =   ArrayAdapter.createFromResource(this, 
        R.array.DeptName, android.R.layout.simple_spinner_item); 
     // Apply the adapter to the spinner 
      Spin.setAdapter(adapter);   
      Spin.setOnItemSelectedListener(new MyOnItemSelectedListener()); 
} 

public class MyOnItemSelectedListener implements OnItemSelectedListener { 

    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 

     department = parent.getItemAtPosition(pos).toString(); 
    } 

    public void onNothingSelected(AdapterView parent) { 
     // Do nothing. 
    } 
} 

public void setCurrentDateOnView() { 

    AbsentDate = (Button)findViewById(R.id.AbsentDate); 
    MakeupDate = (Button)findViewById(R.id.MakeupDate);  
    final Calendar c = Calendar.getInstance(); 
    year = c.get(Calendar.YEAR); 
    month = c.get(Calendar.MONTH); 
    day = c.get(Calendar.DAY_OF_MONTH); 
    // set current date into button 
    AbsentDate.setText(new StringBuilder() 
    // Month is 0 based, just add 1 
    .append(day).append("-").append(month + 1).append("-") 
    .append(year).append(" "));  
    // set current date into button 
    MakeupDate.setText(new StringBuilder() 
    // Month is 0 based, just add 1 
    .append(day).append("-").append(month + 1).append("-") 
    .append(year).append(" ")); 

} 

public void setCurrentTimeOnView(){ 

    MakeupTime = (Button) findViewById(R.id.MakeupTime);   
    final Calendar c = Calendar.getInstance(); 
    hour = c.get(Calendar.HOUR_OF_DAY); 
    minute = c.get(Calendar.MINUTE); 
    // set current time into textview 
    MakeupTime.setText(new StringBuilder().append(pad(hour)) 
    .append(":").append(pad(minute))); 

} 

public void addListenerOnButton() { 

    AbsentDate = (Button)findViewById(R.id.AbsentDate); 

    AbsentDate.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showDialog(DATE_DIALOG_ID); 
     } 
    });  
    MakeupDate = (Button)findViewById(R.id.MakeupDate); 

    MakeupDate.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showDialog(DATE_DIALOG_ID_1); 
     } 
    });  
    MakeupTime = (Button) findViewById(R.id.MakeupTime);   
    MakeupTime.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showDialog(TIME_DIALOG_ID); 
     } 
    });  
    Submit =(Button)findViewById(R.id.Submit); 
    Submit.setOnClickListener(new OnClickListener(){ 
     public void onClick(View v){ 
      new CreateMakeup().execute(); 
     } 
    }); 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case DATE_DIALOG_ID: 
     // set date picker as current date 
     return new DatePickerDialog(this, datePickerListener, 
        year, month,day); 
    case DATE_DIALOG_ID_1: 
      // set date picker as current date 
      return new DatePickerDialog(this, datePickerListener1, 
         year, month,day); 
    case TIME_DIALOG_ID: 
     // set time picker as current time 
     return new TimePickerDialog(this, 
            timePickerListener, hour, minute,false); 
    } 
    return null; 
} 
private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() { 
    // when dialog box is closed, below method will be called. 
    public void onDateSet(DatePicker view, int selectedYear, 
     int selectedMonth, int selectedDay) { 
    year = selectedYear; 
    month = selectedMonth; 
    day = selectedDay; 
    // set selected date into textview 
    AbsentDate.setText(new StringBuilder().append(month + 1) 
     .append("-").append(day).append("-").append(year) 
     .append(" ")); 
    absentdate= AbsentDate.toString(); 
    } 
}; 

private DatePickerDialog.OnDateSetListener datePickerListener1 = new DatePickerDialog.OnDateSetListener() { 

    // when dialog box is closed, below method will be called. 
    public void onDateSet(DatePicker view, int selectedYear, 
     int selectedMonth, int selectedDay) { 
    year = selectedYear; 
    month = selectedMonth; 
    day = selectedDay; 
    // set selected date into textview 
    MakeupDate.setText(new StringBuilder().append(month + 1) 
     .append("-").append(day).append("-").append(year) 
     .append(" "));  
    makeupdate= MakeupDate.toString();  
    } 
}; 

    private TimePickerDialog.OnTimeSetListener timePickerListener = 
     new TimePickerDialog.OnTimeSetListener() { 
    public void onTimeSet(TimePicker view, int selectedHour, 
      int selectedMinute) { 
     hour = selectedHour; 
     minute = selectedMinute; 

     // set current time into timebutton 
     MakeupTime.setText(new StringBuilder().append(pad(hour)) 
       .append(":").append(pad(minute))); 

     makeuptime = MakeupTime.toString();   
    } 
}; 
private static String pad(int c) { 
    if (c >= 10) 
     return String.valueOf(c); 
    else 
     return "0" + String.valueOf(c); 
} 
class CreateMakeup extends AsyncTask<String, String, String> {   
    boolean failure = false; 
    private String result;  
      @Override 
    protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(Makeup.this); 
      pDialog.setMessage("Submiting..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
    } 
     @Override 
     protected String doInBackground(String... args) { 
      // TODO Auto-generated method stub 
      // Check for success tag 
      int success; 
      String Name = name.getText().toString(); 
      String Department = department; 
      String Trainee_id = trainee_id.getText().toString(); 
      String Batch_id = batch_id.getText().toString(); 
      String Absent_date = absentdate; 
      String Module_name = module_name.getText().toString(); 
      String Absentreason = reason.getText().toString(); 
      String Makeup_date = makeupdate; 
      String Makeup_time = makeuptime; 
      String Remarks = remarks.getText().toString();       
      try { 
       // Building Parameters 
       List<NameValuePair> params = new ArrayList<NameValuePair>(); 
       params.add(new BasicNameValuePair("name", Name)); 
       params.add(new BasicNameValuePair("department", Department)); 
       params.add(new BasicNameValuePair("trainee_id", Trainee_id)); 
       params.add(new BasicNameValuePair("batch_id", Batch_id)); 
       params.add(new BasicNameValuePair("absentdate",Absent_date)); 
       params.add(new BasicNameValuePair("module_name", Module_name)); 
       params.add(new BasicNameValuePair("reason", Absentreason)); 
       params.add(new BasicNameValuePair("makeupdate", Makeup_date)); 
       params.add(new BasicNameValuePair("makeuptime", Makeup_time)); 
       params.add(new BasicNameValuePair("remarks", Remarks));  

       Log.d("request!", "starting"); 

       JSONObject json = jsonParser.makeHttpRequest(
         Makeup_URL, "POST", params); 

          // Async json success tag 
          success = json.getInt(TAG_SUCCESS); 
          if (success == 1) { 
           Log.d("Submitted", json.toString()); 
           finish();         
           return json.getString(TAG_MESSAGE); 
          } else { 
           Log.d("Fail to Submit!", json.getString(TAG_MESSAGE)); 
           return json.getString(TAG_MESSAGE); 
          } 

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

      return null; 
     }   
} 
} 

和我的PHP文件:

<?php 
$response = array(); 

// include db connect class 
require_once __DIR__ . '/db_connect.php'; 

// connecting to db 
$db = new DB_CONNECT(); 

// get all products from products table 
if (!empty($_POST)) { 
//initial query 
$query = "INSERT INTO make up (Trainnee_Name, Department, Trainnee_ID, Batch_ID, Absent_Date, Module_Name, Reason_For_Absent, Makeup_Date, Makeup_Time, Remarks) 
VALUES (:Trainnee_Name, :Department, :Trainnee_ID, :Batch_ID, :Absent_Date, :Module_Name, :Reason_For_Absent, :Makeup_Date, :Makeup_Time, :Remarks) "; 

//Update query 
$query_params = array(
    ':Trainnee_Name' => $_POST['name'], 
    ':Department' => $_POST['pepartment'], 
    ':Trainnee_ID' => $_POST['trainnee_id'] 
    ':Batch_ID' => $_POST['batch_id'] 
    ':Absent_Date' => $_POST['absentdate'] 
    ':Module_Name' => $_POST['module_name'] 
    ':Reason_For_Absent' => $_POST['reason'] 
    ':Makeup_Date' => $_POST['Makeupdate'] 
    ':Makeup_Time' => $_POST['Makeuptime'] 
    ':Remarks' => $_POST['remarks'] 
); 

//execute query 
try { 
    $stmt = $db->prepare($query); 
    $result = $stmt->execute($query_params); 
} 
catch (PDOException $ex) { 
    // For testing, you could use a die and message. 
    //die("Failed to run query: " . $ex->getMessage()); 

    //or just use this use this one: 
    $response["success"] = 0; 
    $response["message"] = "Database Error. Couldn't add post!"; 
    die(json_encode($response)); 
} 

$response["success"] = 1; 
$response["message"] = "Post Successfully Added!"; 
echo json_encode($response); 

} 

?> 

JSONPar的一部分ser.java

public JSONObject makeHttpRequest(String url, String method, 
     List<NameValuePair> params) { 

if(method == "POST"){ 
      // request method is POST 
      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 
      httpPost.setEntity(new UrlEncodedFormEntity(params)); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 

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(); 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e ("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 

} 
+0

你能不能把你得到錯誤的json放進去? –

+0

Makeup.java的第288行是什麼? – Zoubiock

+0

@Zoubiock第288行將成功= json.getInt(TAG_SUCCESS); –

回答

3

我想在網上JSONObject json = jsonParser.makeHttpRequest(Makeup_URL, "POST", params);回報無效Json。根據錯誤日誌,響應是<br>或開始於<br>。解析時失敗。結果你的json對象是Null。它在Line 288上給出Null Pointer Exception

請問你爲什麼不返回JSON。你必須確保響應應該是JSON。

相關問題