1

oncreate() 関数から showQuestion() メソッドを呼び出そうとすると、null ポインター例外が発生しますが、ボタンを介して呼び出そうとすると機能します。アクティビティが開いたときに 1 つのメッセージが表示されるように、 onCreate() 関数から showQuestion() を呼び出したいと思います。

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;
    }
 }
}

アップデート:

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)
4

4 に答える 4

0

msgList初期化されていないため、NPEが発生する可能性があります 。

于 2013-09-11T15:59:58.463 に答える
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をスローします

于 2013-09-11T15:21:47.983 に答える
0

変数 msgList が NPE をスローしているものであることを確認してください

    JSONObject jsonobject = msgList.getJSONObject(i);

このエラーが発生する理由は、AsyncTask が完了するまで msgList が null であるためです。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);
   }
}

onCreate() メソッドから showQuestion(i) を削除します。AsyncTask の onPostExecute メソッドは、メイン UI スレッドで実行されます。

補足として、変数に適切な名前を付ける習慣を身につけてください。Eclipse では、Ctrl+Space を押すとオートコンプリートが実行されるため、aynt ではなく LoadMessageListAsync のような名前を付けることができ、コードのメンテナンスがより簡単になります。

于 2013-09-11T16:33:19.983 に答える