2015-05-03 2 views
1

Привет, У меня возникла проблема с синтаксическим разбором части onPostExecute этого кода. Думаю, я сделал все правильно, но как-то проблема сохраняется. Он говорит, что я получил исключение nullPointerException в методах postExecute() методов 74 и 46. Может кто-то помочь мне с этим.NullPointerException getJSONArray

Это журнал ошибок

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
     Process: com.example.crow.androidappthirteen, PID: 25314 
     java.lang.NullPointerException 
       at com.example.crow.androidappthirteen.MainActivity$JSONParse.onPostExecute(MainActivity.java:74) 
       at com.example.crow.androidappthirteen.MainActivity$JSONParse.onPostExecute(MainActivity.java:46) 
       at android.os.AsyncTask.finish(AsyncTask.java:632) 
       at android.os.AsyncTask.access$600(AsyncTask.java:177) 
       at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:157) 
       at android.app.ActivityThread.main(ActivityThread.java:5335) 
       at java.lang.reflect.Method.invokeNative(Native Method) 
       at java.lang.reflect.Method.invoke(Method.java:515) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
       at dalvik.system.NativeStart.main(Native Method) 

Это ява файл:

public class MainActivity extends ActionBarActivity { 
    String id, name, course; 
    JSONArray students = null; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     new JSONParse().execute(); 
    } 

    @Override 
    protected void onResume() { 
// TODO Auto‐generated method stub 
     super.onResume(); 
     new JSONParse().execute(); 
    } 

    //JSON 
    /*THIS IS LINE 46*/  private class JSONParse extends  AsyncTask<String, String, JSONObject> { 
     private ProgressDialog pDialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(MainActivity.this); 
      pDialog.setMessage("Getting Data ..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
     } 

     @Override 
     protected JSONObject doInBackground(String... args) { 
      JSONParser jParser = new JSONParser(); 
// Getting JSON from URL 
      JSONObject json = jParser.getJSONFromUrl("http://192.168.43.43/mymobile/getstudentlist.php"); 
      return json; 
     } 

     @Override 
     protected void onPostExecute(JSONObject json) { 
      pDialog.dismiss(); 
      final ArrayList<String> ids = new ArrayList<String>(); 
      final ArrayList<String> names = new ArrayList<String>(); 
      final ArrayList<String> courses = new ArrayList<String>(); 
      try { 
/* THIS IS LINE 74 */ students = json.getJSONArray("students"); 
       for (int i = 0; i < students.length(); i++) { 
        JSONObject student = students.getJSONObject(i); 
        ids.add(student.getString("id")); 
        names.add(student.getString("name")); 
        courses.add(student.getString("course")); 
       } 
       final ListView listView = (ListView) findViewById(R.id.list); 
       ArrayAdapter<String> adapter = new 
         ArrayAdapter<String>(MainActivity.this, 
         android.R.layout.simple_list_item_1, android.R.id.text1, 
         names); 

// Assign adapter to ListView 
       listView.setAdapter(adapter); 
// ListView Item Click Listener 
       listView.setOnItemClickListener(new OnItemClickListener() { 

        @Override 
        public void onItemClick(AdapterView<?> parent, View view, 
              int position, long id) { 

// ListView Clicked item value 
         String stud_id = ids.get(position); 
         String stud_name = names.get(position); 
         String stud_course = courses.get(position); 

         Intent i = new Intent(MainActivity.this, ActivityEditDel.class); 
         i.putExtra("stud_id", stud_id); 
         i.putExtra("stud_name", stud_name); 
         i.putExtra("stud_course", stud_course); 
         startActivity(i); 
        } 
       }); 

      } catch (
        JSONException e 
        ) 

      { 
       e.printStackTrace(); 
      } 
     } 


    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Это PHP-файл, который JSON пытается получить доступ.

<?php 
    $database_name = 'dbstudrec'; 
    $con = mysql_connect('localhost', 'root') or die(mysql_error()); 
    mysql_select_db($database_name) or die(msql_error()); 

    $query = "SELECT * FROM tblstudent"; 
    $result = mysql_query($query); 
    $rec = array(); 

    while($row = mysql_fetch_assoc($result)){ 
     $rec['students'][] = $row; 

    } 
    echo json_encode($rec); 
    mysql_close($con); 

?> 

Любая помощь будет очень признательна. Спасибо.

UPDATE: Я не знаю, почему я получаю нуль на тех линиях, но когда я открываю файл getstudentlist.php, я получаю выход. Поэтому должна быть другая причина, по которой он становится нулевым.

+1

вы можете оставить ваш ответ? –

+1

, пожалуйста, помогите мне идентифицировать номер строки в postExecute() –

+0

Установить заголовок ответа как Json ,,, $ data =/** независимо от того, что вы сериализуете ** /; header ('Content-Type: application/json'); echo json_encode ($ data); –

ответ

0

В строке Дано:

protected void onPostExecute(JSONObject json) 

объект JSON является: (1) получение либо нулевое значение или (2) ключ: - "студенты" не найден в JSONObject ,

И для случая (1): u может не указал интернет pemission в файле manifest.xml. для случая (2): вам необходимо указать данные jsonObject путем преобразования jsonobject в строковое значение и отображения на экране с помощью textView as: json.tosString().

Примечание: для хорошего программирования: (1) использование примерочных поймать везде, где вы думаете, исключение/семантическая ошибок может произойти. (2) Как и в этой линии нет: 74 ::

students = json.getJSONArray("students"); 

вы назначили экземпляр json.getJSONArray («студенты») для студентов, который синтаксически правильно, но следует избегать, так как изменения в json может также отразиться на «ученике».

Вместо этого вы должны сделать:

try{ 
student.put("key",json.getJSONArray("students")); 
}catch(Exception e){...} 
0

Dont получить детали в вашем JSONArray в postExecute() .. Делайте это в методе doInBackground()

try { 

      students=json.getJSONArray("students"); 


     } catch (Exception e) { 
      // TODO Auto-generated catch block 

      e.printStackTrace(); 

     } 

} 

и не объявить jsonarray, как

JSONArray students=null; 

Вы не требуется null .. просто

JSONArray students; 

Вы сделали много вещей в postExecute(), я предложу сделать способ в основном потоке и делать все, что в этом методе, а не postexecute() .. и вызвать этот метод в postExecute() .. Все самое лучшее.

+0

Я попытался ввести метод doInbackground, но теперь он говорит 'Unreachable statement' на' students = json.getJSONArray («students»); – user827391012

0

Прежде всего проверить JSONObject в onPostExecute (JSONObject JSon). если он равен нулю, ваш ответ не является форматированным JSON или, возможно, медленным подключением к Интернету. Поскольку «ученики» не создали журнал, будет показано другое Исключение. Итак, проверьте этот вопрос.

if(json == null){ 
//Do something when null. Example show toast or alertdialog 
} 
else{ 
//Your whole code inside onPostExecute 
} 

Извините за плохой английский