无法实例化活动ComponentInfo {}:java.lang.NullPointerException

时间:2013-07-16 08:55:47

标签: java android database sqlite

你好,我是android的新手,所以你能帮我解决一下我的错误。发生错误时 我要开始游戏,所以这里是我的logcat数据库和活动

logcat的

  
    
      
        

08-06 04:02:31.350:E / AndroidRuntime(8261):致命异乎寻常:主

                 
          
            
              

08-06 04:02:31.350:E / AndroidRuntime(8261):java.lang.RuntimeException:无法实例化活动ComponentInfo {com.example.windowcard / com.example.windowcard.Grade1}:java.lang。空指针异常               08-06 04:02:31.350:E / AndroidRuntime(8261):在android.content.ContextWrapper.getPackageName(ContextWrapper.java:127)               08-06 04:02:31.350:E / AndroidRuntime(8261):at com.example.windowcard.dbHelp。(dbHelp.java:39)               08-06 04:02:31.350:E / AndroidRuntime(8261):at com.example.windowcard.Grade1。(Grade1.java:41)

            
          
        
      
    
  

数据库

package com.example.windowcard;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
 import android.util.Log;


   public class dbHelp extends SQLiteOpenHelper{

//The Android's default system path of your application database.
private static String TAG = "dbHelp";
private static String DB_PATH = "";

private static String DB_NAME = "sample";

private SQLiteDatabase myDataBase; 

private final Context myContext;

/**
 * Constructor
 * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
 * @param context
 */
public dbHelp(Context context) {

    super(context, DB_NAME, null, 1); //

    DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    this.myContext = context;
}   

/**
 * Creates a empty database on the system and rewrites it with your own database.
 * */
public void createDataBase() throws IOException{

    myContext.deleteDatabase(DB_NAME);
    boolean dbExist = checkDataBase();

    if(!dbExist){
        //do nothing - database already exist
        this.getReadableDatabase();
        this.close();
        try{
            copyDataBase();
            Log.e(TAG, "create Database database created"); 
        }
        catch (IOException e){
            throw new Error ("Error Copying Database");

        }

    }

}

/**
 * Check if the database already exist to avoid re-copying the file each time you open the application.
 * @return true if it exists, false if it doesn't
 */
private boolean checkDataBase(){


    File dbFile = new File (DB_PATH + DB_NAME);
    Log.v("dbFile", dbFile + " " + dbFile.exists());
    return dbFile.exists();

/**
 * Copies your database from your local assets-folder to the just created empty database in the
 * system folder, from where it can be accessed and handled.
 * This is done by transfering bytestream.
 * */
private void copyDataBase() throws IOException{

    //Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DB_NAME);

    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    //Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

}

public boolean openDataBase() throws SQLException{

    //Open the database
    String myPath = DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
    // myDatabase =
    SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    return myDataBase != null;

}

@Override
public synchronized void close() {

    if(myDataBase != null)
        myDataBase.close();

    super.close();

}

@Override
public void onCreate(SQLiteDatabase db) {

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

// Add your public helper methods to access and get content from the database.
// You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
// to you to create adapters for your views.

public Cursor getAllGrade1(){

    this.openDataBase();
    String sql = "Select * from gr1";
    Cursor  c = myDataBase.rawQuery(sql, null);
    c.moveToFirst();
    return c;
}
public String getScore(int score){
    this.openDataBase();
    String sql = "SELECT * FROM gr1 WHERE _id =" + score;
    Cursor c = myDataBase.rawQuery(sql, null);
    c.moveToFirst();
    return c.getString(c.getColumnIndex("score"));
}
public String getMistakes(int Errors){
    this.openDataBase();
    String sql="SELECT * FROM gr1 WHERE _id=" + Errors;
    Cursor c = myDataBase.rawQuery(sql, null);
    c.moveToFirst();
    return c.getString(c.getColumnIndex("Errors"));
}

    }

活动

            package com.example.windowcard;

            import java.util.ArrayList;
            import java.util.Collections;
            import android.app.Activity;
            import android.app.AlertDialog;
            import android.content.DialogInterface;
            import android.content.Intent;
            import android.database.Cursor;
            import android.media.MediaPlayer;
            import android.os.Bundle;
            import android.os.Handler;
            import android.view.View;
            import android.view.View.OnClickListener;
            import android.widget.Button;
            import android.widget.EditText;
            import android.widget.TextView;
            import android.widget.Toast;

            public class Grade1 extends Activity implements OnClickListener {
            TextView tvQuestion,tvQuestionId,tvPlayer1,tvScore,tvMissCount;
            EditText et;
            Button submit,next,start;
            Cursor c;
            MediaPlayer sonic;
            Handler mHandler = new Handler();
            long startTime;
            TextView timer,timems;
            long elapsedTime;
            final int REFRESH_RATE = 100;
            String hours,minutes,seconds,milliseconds;
            long secs,mins,hrs,msecs;
            boolean stopped = false;
            String s,timers;
            int score=1;
            int miss=1;
            dbHelp dbh = new dbHelp(this);
            ArrayList<Integer> rdm = new ArrayList<Integer>();
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);
                setContentView(R.layout.grade1);
                sonic = MediaPlayer.create(Grade1.this,R.raw.sonic);
                sonic.start();
                sonic.setLooping(true);
                sonic.setVolume(100, 100);
                initialize();   

                }
            public void updateTimer (float time){
                secs = (long)(time/1000);
                mins = (long)((time/1000)/60);
                hrs = (long)(((time/1000)/60)/60);


                secs = secs % 60;
                seconds=String.valueOf(secs);
                if(secs == 0){
                    seconds = "00";
                }
                if(secs <10 && secs > 0){
                    seconds = "0"+seconds;
                }



                mins = mins % 60;
                minutes=String.valueOf(mins);
                if(mins == 0){
                    minutes = "00";
                }
                if(mins <10 && mins > 0){
                    minutes = "0"+minutes;
                }


                hours=String.valueOf(hrs);
                if(hrs == 0){
                    hours = "00";
                }
                if(hrs <10 && hrs > 0){
                    hours = "0"+hours;
                }


                milliseconds = String.valueOf((long)time);
                if(milliseconds.length()==2){
                    milliseconds = "0"+milliseconds;
                }
                if(milliseconds.length()<=1){
                    milliseconds = "00";
                }
                //milliseconds = milliseconds.substring(milliseconds.length(), milliseconds.length());

                (timer = (TextView)findViewById(R.id.tvTime)).setText(hours + ":" + minutes + ":" + seconds);
                //((TextView)findViewById(R.id.tvTimeMs)).setText(":" + milliseconds);
            }
            public Runnable startTimer = new Runnable() {
                   public void run() {
                       elapsedTime = System.currentTimeMillis() - startTime;
                       updateTimer(elapsedTime);
                       mHandler.postDelayed(this,REFRESH_RATE);
                    }
                };
                public void startClick (View view){
                    if(stopped){
                        startTime = System.currentTimeMillis() - elapsedTime;
                    }
                    else{
                        startTime = System.currentTimeMillis();
                    }
                    mHandler.removeCallbacks(startTimer);
                    mHandler.postDelayed(startTimer, 0);
                }
                  public void stopClick (View view){
                        mHandler.removeCallbacks(startTimer);
                        stopped = true;
                    }

                    public void resetClick (View view){
                        stopped = false;
                        ((TextView)findViewById(R.id.tvTime)).setText("00:00:00");
                        //((TextView)findViewById(R.id.tvTimeMs)).setText(":0");
                    }
            private void refresh(){

                c = dbh.getAllGrade1();
                c.moveToPosition(rdm.get(0));
                rdm.remove(0);
                tvScore.setText(dbh.getScore(score));
                tvMissCount.setText(dbh.getMistakes(miss));
                tvPlayer1.setText(s);   
                //tvQuestion.setText(c.getString(c.getColumnIndex("Question")));
                tvQuestion.setText(c.getString(1));
                et.setText("");
            }


            private void initialize() {
                // TODO Auto-generated method stub
                submit= (Button) findViewById(R.id.b1);
                //tvQuestionId = (TextView) findViewById(R.id.tvQuestionId);
                tvPlayer1 = (TextView) findViewById(R.id.tvPlayer1);
                tvScore = (TextView) findViewById(R.id.tvScore);
                tvQuestion = (TextView) findViewById(R.id.tvQuestion);
                tvMissCount = (TextView) findViewById(R.id.tvMissCount);
                start = (Button) findViewById(R.id.bStart);
                et = (EditText) findViewById(R.id.et1);
                Intent z = getIntent();
                s = z.getExtras().getString("PlayerName");
                submit.setVisibility(View.INVISIBLE);
                et.setVisibility(View.INVISIBLE);
                tvQuestion.setVisibility(View.INVISIBLE);
                //Bundle receive = getIntent().getExtras();
                //hold =  receive.getString("PlayerName")

                for(int count=0; count<10; count++){
                    rdm.add(count);
                }
                Collections.shuffle(rdm);
                refresh();
                final MediaPlayer mp = MediaPlayer.create(this, R.raw.answerright);
                final MediaPlayer mp2= MediaPlayer.create(this, R.raw.answerwrong);

                start.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View arg0) {
                        // TODO Auto-generated method stub
                        if (start.isClickable()){
                            et.setVisibility(View.VISIBLE);
                            submit.setVisibility(View.VISIBLE);
                            tvQuestion.setVisibility(View.VISIBLE);
                            startClick(arg0);
                            start.setVisibility(View.INVISIBLE);
                        }
                    }
                });
                submit.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        if(et.getText().toString().equalsIgnoreCase("")){
                            Toast.makeText(getApplicationContext(), "You need to answer first the question before proceeding to the next question", Toast.LENGTH_SHORT).show();
                        }else{
                            if (c.getString(c.getColumnIndex("Answer")).equalsIgnoreCase(et.getText().toString())){
                                mp.start();
                                if(score==10){
                                    stopClick(v);
                                     timers = timer.getText().toString();

                                //  dbh.insertRecord1(s, score,timers,miss);
                                    resetClick(v);
                                    AlertDialog diaBox = makneAndShowDialogBox();
                                    diaBox.show();
                                    diaBox.setCanceledOnTouchOutside(false);

                                    //Toast.makeText(getApplicationContext(), "Congratulations!", Toast.LENGTH_LONG).show();
                                    sonic.release();
                                    //Intent a = new Intent(Grade1.this,Menu.class);
                                    //startActivity(a);
                                    //finish();
                                }
                                String Score = tvScore.getText().toString();
                                score++;
                                //String newScore = dbh.getScore(score);
                                refresh();
                            }
                            else{
                            mp2.start();
                            String Miss = tvMissCount.getText().toString();
                            miss++; 
                        //  String newMiss = dbh.getMistakes(miss);
                            refresh();
                            }
                        }




                }
                });
            }
                private AlertDialog makneAndShowDialogBox() {
                    // TODO Auto-generated method stub
                    AlertDialog myDialogBox = new AlertDialog.Builder(this)
                    .setTitle("Congratulations!!") 
                    .setMessage("Congratulations on finishing the game!")
                    .setPositiveButton("Main Menu", new DialogInterface.OnClickListener() { 
                        public void onClick(DialogInterface dialog, int whichButton) { 
                            Intent i = new Intent(Grade1.this,Menu.class);
                            startActivity(i);
                            finish();
                            dialog.dismiss();
                        }

                })

                .create();
                return myDialogBox;






            /** next.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        int count = 0;
                        // TODO Auto-generated method stub
                        if(count==40){
                            Intent a = new Intent(Grade1.this,Menu.class);
                            startActivity(a);
                            finish();
                        }
                        count++;
                    refreshgame();
                    }
                });

            **/


                        }

                        @Override
                        protected void onPause() {
                            // TODO Auto-generated method stub
                            super.onPause();
                            sonic.release();
                            finish();
                        }
                        @Override
                        public void onClick(View v) {
                            // TODO Auto-generated method stub

                        }
                        }

1 个答案:

答案 0 :(得分:0)

dbHelp dbh = new dbHelp(this);将此行放在OnCreate