0

この単純なプログラムを約2か月間使用しましたが、先日の夜、ユーザーにエラーが表示されましたが、その理由がわかりません。

public class mainmenu extends Activity implements OnPreparedListener {
    private PopupWindow pw;
    public static int RandomNum;
    public static String quickStart;
    private dbadapter mydbhelper;
    MediaPlayer mpButtonClick;
    Intent intent;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainmenu);




    Button bsound = (Button) findViewById(R.id.bCategories);
    bsound.setOnClickListener(new View.OnClickListener() {


        public void onClick(View v) {
            quickStart = "Cate";
            onPrepared(mpButtonClick);
            intent = new Intent ("wanted.pro.madlibslite.CATEGORIES");
            intent.putExtra("quickStart", quickStart);
            startActivity(intent);
        }
    });



    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            moveTaskToBack(true);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    //Menu Items
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.layout.mainmenu, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
             case R.id.help:
               showHelp();
                return true;
           }
        return false;
    }

        private void showHelp() {
            LayoutInflater inflater = (LayoutInflater)
                       this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                     pw = new PopupWindow(
                       inflater.inflate(R.layout.help, null, false), 
                       LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 
                       true);
                     pw.showAtLocation(this.findViewById(R.id.bCategories), Gravity.CENTER, 0, 0); 
        }
        public void onClickHelp(View helper){pw.dismiss();

        }   
        //QuickStart
        public void onClickQuick(View main) {
            Toast.makeText(this, "Quick Start only available in full version.", 1000).show();
            //RandomNum = (int) (Math.random()*101);
            //quickStart = "Quick";
            //mpButtonClick.start();
            //startActivity(new Intent("wanted.pro.madlibslite.INPUTPAGE"));


        }

        public void onPrepared(MediaPlayer player) {
            mpButtonClick.setOnPreparedListener(this);
            try {
                mpButtonClick.prepare();

            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            mpButtonClick.start();
        }

        @Override
        protected void onResume() {
            mydbhelper = dbadapter.getInstance(mainmenu.this);
            mydbhelper.open();
            mpButtonClick = MediaPlayer.create(this, R.raw.button50);
            super.onResume();
        }

        @Override
        protected void onPause() {
            mpButtonClick.release();
            super.onPause();
        }

} 

問題のエラー...

java.lang.NullPointerException
at wanted.pro.madlibslite.mainmenu.onPrepared(mainmenu.java:107)
at wanted.pro.madlibslite.mainmenu$1.onClick(mainmenu.java:45)
at android.view.View.performClick(View.java:2485)
at android.view.View$PerformClick.run(View.java:9089)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3806)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)

悲しいことに、私は彼らがどのデバイスを使用しているかわかりません。しかし、ここで誰かが私が間違っていることを見て、onprepareedがエラーになることを期待しています。

4

1 に答える 1

0

onPrepared メソッドで NullPointerException を引き起こす唯一の変数は次のとおりmpButtonClickです。mpButtonClickそれでは、どのようにしてnull になることができるかを考えてみましょう...

onResume メソッドでは、新しい MediaPlayer を作成し、それを変数 mpButtonClick に割り当てます。ただし、見落としている可能性があるのは、MediaPlayers の作成に失敗する場合があることです。Android ドキュメントが静的メソッドについて述べているようにMediaPlayer.create(Context context, int resid):

戻り値

MediaPlayer オブジェクト、または作成に失敗した場合は null

その通りです。そのメソッドは必ずしも有効な MediaPlayer を返すとは限りません。MediaPlayer を作成できなかった場合は常に null を返します。これにより、onPrepared メソッドが null 変数にアクセスするため、NullPointerException が発生します。

于 2012-04-20T01:15:38.417 に答える