2013-09-11 5 views
1

Когда я пытаюсь вызвать метод showQuestion() из функции oncreate(), исключение null-pointer исключает ocurrs, но если я попытаюсь вызвать его через кнопку, он будет работать, любые предложения. Я хочу вызвать функцию showQuestion() из функции onCreate(), чтобы при открытии активности она отображала одно сообщение.Android Exception NullPointer

public class MainActivity extends Activity { 
TextView txt; 

Button bt; 
int i=0; 
static InputStream is = null; 
static JSONObject jobj = null; 
String line,results=""; 
static String json = ""; 
static JSONArray msgList = null; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    new asynt().execute(); 

    txt=(TextView) findViewById(R.id.textView1); 
    bt= (Button) findViewById(R.id.button1); 

    showQuestion(i);// null pointer exception 
    bt.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      i++; 
      showQuestion(i); 
     } 
    }); 
} 

private void showQuestion(int i){ 
    try { 
     JSONObject jsonobject = msgList.getJSONObject(i); 
     String s = jsonobject.getString("messg"); 
     txt.setText(s); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

public class asynt extends AsyncTask<Void, Void, JSONArray>{ 

    @Override 
    protected JSONArray doInBackground(Void...vois) { 
     JSONArray tha=null;; 
     try{ 
      BufferedReader reader = new BufferedReader(new InputStreamReader(getAssets().open("questions.txt"))); 
      StringBuilder sb = new StringBuilder(); 

      while((line = reader.readLine()) != null) 
      { 
       sb.append(line + "\n"); 
      } 
      reader.close(); 
      json=sb.toString(); 
      } 
      catch(Exception e){ 
      } 

      try { 
       jobj = new JSONObject(json); 
       tha = jobj.getJSONArray("message"); 

      } catch (JSONException e) { 

       e.printStackTrace(); 
      } 
      return tha; 

    } 
    @Override 
    protected void onPostExecute(JSONArray result) { 
     // TODO Auto-generated method stub 
     //super.onPostExecute(result); 
     msgList = result; 
    } 
} 
} 

Update:

09-11 21:14:39.751: E/AndroidRuntime(31440): FATAL EXCEPTION: main 
09-11 21:14:39.751: E/AndroidRuntime(31440): java.lang.NullPointerException 
09-11 21:14:39.751: E/AndroidRuntime(31440): at  com.examp.ankurtesting.MainActivity.showQuestion(MainActivity.java:60) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at com.examp.ankurtesting.MainActivity.access$0(MainActivity.java:58) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at com.examp.ankurtesting.MainActivity$1.onClick(MainActivity.java:53) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at android.view.View.performClick(View.java:4129) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at android.view.View$PerformClick.run(View.java:17143) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at android.os.Handler.handleCallback(Handler.java:615) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at android.os.Handler.dispatchMessage(Handler.java:92) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at android.os.Looper.loop(Looper.java:137) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at android.app.ActivityThread.main(ActivityThread.java:4802) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at java.lang.reflect.Method.invokeNative(Native Method) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at java.lang.reflect.Method.invoke(Method.java:511) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:813) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:580) 
09-11 21:14:39.751: E/AndroidRuntime(31440): at dalvik.system.NativeStart.main(Native Method) 
+2

Опубликуйте свой стек. – mmBs

+0

Может ли uoi разместить logcat здесь? –

+0

Поверьте, ваш jsonobject равен null. – user755

ответ

0

Довольно, что переменная msgList является то, что бросает NPE в

JSONObject jsonobject = msgList.getJSONObject(i); 

Причина, почему вы получаете эту ошибку, потому что msgList равна нулю, пока AsyncTask не будет завершена. Метод onCreate() выполняется и заканчивается до завершения AsyncTask. Когда вы увидите и нажмите кнопку, которая вызывает showQuestion(), AsyncTask будет завершена и установит значение msgList, поэтому вы не получите сообщение об ошибке при нажатии кнопки. Вместо вызова этого метода в onCreate вызовите его в onPostExecute и добавьте onPreExecute в вашу AsyncTask, чтобы сообщить пользователю, что есть фоновая работа.

public class asynt extends AsyncTask<Void, Void, JSONArray>{ 

    ProgressDialog dialog; 

    @Override 
    public void onPreExecute() { 
     dialog = new ProgressDialog(context); 
     dialog.show(); 
    } 

    @Override 
    protected JSONArray doInBackground(Void...vois) { 
     ... 
     return tha; 
    } 

    @Override 
    protected void onPostExecute(JSONArray result) { 
     if(dialog.isShowing()) { 
      dialog.dismiss(); 
     } 
     msgList = result; 
     showQuestion(i); 
    } 
} 

удалить showQuestion (i) из метода onCreate(). Метод onPostExecute для AsyncTask запускается в основном потоке пользовательского интерфейса.

В качестве побочного примечания, придите в привычку давать своим переменным лучшие имена. В предложении eclipse Ctrl + Space делает автозаполнение, так что вы можете создавать имена, такие как LoadMessageListAsync, вместо asynt, он значительно улучшает обслуживание кода.

+0

Понял, он работает, спасибо. –

0

Я не могу найти quesList в вашем примере. Если вы имеете в виду msgList с этим, я думал, что результат задачи async еще не был записан в msgList. Вы вызываете showQuestion только очень скоро после того, как задача была запущена. Вы делаете файл io, который иногда довольно медленный. Возможно, JSONObject с индексом 0 имеет значение null. Вы уже проверили это?

+1

Комментарий к этому комментарию не отвечает. –

+0

Да, но я не думаю, что это хорошее решение для ожидания завершения задачи, поскольку это делает задачу async устаревшей. Таким образом, нет хорошего решения для вызова showQuestion from onCreate, если задача запущена в той же функции в любом случае. –

+0

да его msgList не quesList, –

0

Ваш метод

private void showQuestion(int i){ 
    try { 
     JSONObject jsonobject = quesList.getJSONObject(i); 
     String s = jsonobject.getString("messg"); 
     txt.setText(s); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

имеют quesList, где он объявлял и инициализируется ????

Другие

может быть вашим quesList.getJSONObject(i); возвращение NULL

так это jsonobject.getString ("messg"); выбросит NullPointerException

0

Это может быть, что ваш msgList не был инициализирован, таким образом, в результате чего NPE.