2014-03-18 51 views
0

我想在我的應用程序中包含一個小測驗。爲了測試,我嘗試了一個列出的答案作爲答案。我的主要活動是通過按鈕顯示所有選項的選擇器。該應用程序使用名爲eGREp.db的數據庫來提供諸如意義,單詞列表等功能。由於該部分工作得很好,我想創建一個新的數據庫並單獨工作。在點擊測試時,測驗活動應該啓動。活動啓動時拋出的空指針異常

我已經設置的onClick()字段設置爲指向openQuiz它具有以下

public void openQuiz(View view) { 
    // Do something in response to button 
    Intent intent = new Intent(this, Quiz.class); 
    startActivity(intent); 
} 

現在,這是應該推出競猜活動,但除少數例外被拋出。 測驗類

package com.example.egrep; 

import java.util.List; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.RadioButton; 
import android.widget.RadioGroup; 
import android.widget.TextView; 

public class Quiz extends Activity { 
    List<Question> quesList; 
    int score=0; 
    int qid=0; 
    Question currentQ; 
    TextView txtQuestion; 
    RadioButton rda, rdb, rdc; 
    Button butNext=(Button)findViewById(R.id.button1); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_quiz); 
     DbHelper db = new DbHelper(Quiz.this); 
     quesList=db.getAllQuestions(); 
     currentQ=quesList.get(qid); 
     txtQuestion=(TextView)findViewById(R.id.textView1); 
     rda=(RadioButton)findViewById(R.id.radioButton0); 
     rdb=(RadioButton)findViewById(R.id.radioButton1); 
     rdc=(RadioButton)findViewById(R.id.radioButton2); 
     setQuestionView(); 
     butNext.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       RadioGroup grp=(RadioGroup)findViewById(R.id.radioGroup); 
       RadioButton answer=(RadioButton)findViewById(grp.getCheckedRadioButtonId()); 
       Log.d("yourans", currentQ.getANSWER()+" "+answer.getText()); 
       if(currentQ.getANSWER().equals(answer.getText())) 
       { 
        score++; 
        Log.d("score", "Your score"+score); 
       } 
       if(qid<5){ 
        currentQ=quesList.get(qid); 
        setQuestionView(); 
       }else{ 
        Intent intent = new Intent(Quiz.this, ResultActivity.class); 
        Bundle b = new Bundle(); 
        b.putInt("score", score); //Your score 
        intent.putExtras(b); //Put your score to your next Intent 
        startActivity(intent); 
        finish(); 
       } 
      } 
     }); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.quiz, menu); 
     return true; 
    } 
    private void setQuestionView() 
    { 
     txtQuestion.setText(currentQ.getQUESTION()); 
     rda.setText(currentQ.getOPTA()); 
     rdb.setText(currentQ.getOPTB()); 
     rdc.setText(currentQ.getOPTC()); 
     qid++; 
    } 
} 

顯示的錯誤

03-18 15:37:13.834: E/AndroidRuntime(1201): Caused by: java.lang.NullPointerException 
03-18 15:37:13.834: E/AndroidRuntime(1201):  at com.example.egrep.DbHelper.addQuestion(DbHelper.java:67) 
03-18 15:37:13.834: E/AndroidRuntime(1201):  at com.example.egrep.DbHelper.onCreate(DbHelper.java:35) 
03-18 15:37:13.834: E/AndroidRuntime(1201):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 
03-18 15:37:13.834: E/AndroidRuntime(1201):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
03-18 15:37:13.834: E/AndroidRuntime(1201):  at com.example.egrep.DbHelper.getAllQuestions(DbHelper.java:73) 
03-18 15:37:13.834: E/AndroidRuntime(1201):  at com.example.egrep.Quiz.onCreate(Quiz.java:29) 
03-18 15:37:13.834: E/AndroidRuntime(1201):  at android.app.Activity.performCreate(Activity.java:5133) 
03-18 15:37:13.834: E/AndroidRuntime(1201):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
03-18 15:37:13.834: E/AndroidRuntime(1201):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 

問題類

package com.example.egrep; 

public class Question { 
    private int ID; 
    private String QUESTION; 
    private String OPTA; 
    private String OPTB; 
    private String OPTC; 
    private String ANSWER; 
    public Question() 
    { 
    ID=0; 
    QUESTION=""; 
    OPTA=""; 
    OPTB=""; 
    OPTC=""; 
    ANSWER=""; 
    } 
    public Question(String qUESTION, String oPTA, String oPTB, String oPTC, 
    String aNSWER) { 

    QUESTION = qUESTION; 
    OPTA = oPTA; 
    OPTB = oPTB; 
    OPTC = oPTC; 
    ANSWER = aNSWER; 
    } 
    public int getID() 
    { 
    return ID; 
    } 
    public String getQUESTION() { 
    return QUESTION; 
    } 
    public String getOPTA() { 
    return OPTA; 
    } 
    public String getOPTB() { 
    return OPTB; 
    } 
    public String getOPTC() { 
    return OPTC; 
    } 
    public String getANSWER() { 
    return ANSWER; 
    } 
    public void setID(int id) 
    { 
    ID=id; 
    } 
    public void setQUESTION(String qUESTION) { 
    QUESTION = qUESTION; 
    } 
    public void setOPTA(String oPTA) { 
    OPTA = oPTA; 
    } 
    public void setOPTB(String oPTB) { 
    OPTB = oPTB; 
    } 
    public void setOPTC(String oPTC) { 
    OPTC = oPTC; 
    } 
    public void setANSWER(String aNSWER) { 
    ANSWER = aNSWER; 
    } 
} 

DbHelper類

package com.example.egrep; 

import java.util.ArrayList; 
import java.util.List; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
public class DbHelper extends SQLiteOpenHelper { 
private static final int DATABASE_VERSION = 1; 
// Database Name 
private static final String DATABASE_NAME = "triviaQuiz"; 
// tasks table name 
private static final String TABLE_QUEST = "quest"; 
// tasks Table Columns names 
private static final String KEY_ID = "id"; 
private static final String KEY_QUES = "question"; 
private static final String KEY_ANSWER = "answer"; //correct option 
private static final String KEY_OPTA= "opta"; //option a 
private static final String KEY_OPTB= "optb"; //option b 
private static final String KEY_OPTC= "optc"; //option c 
private SQLiteDatabase dbase; 
public DbHelper(Context context) { 
super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 
@Override 
public void onCreate(SQLiteDatabase db) { 
String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_QUEST + " (" 
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_QUES 
+ " TEXT, " + KEY_ANSWER+ " TEXT, "+KEY_OPTA +" TEXT, " 
+KEY_OPTB +" TEXT, "+KEY_OPTC+" TEXT)"; 
db.execSQL(sql); 
Question q1=new Question("Choose the correct alternative that will continue the same pattern and replace the question mark in the given series." + 
" 120, 99, 80, 63, 48, ?","35", "38", "39", "A"); 
this.addQuestion(q1); 
Question q2=new Question("A, P, R, X, S and Z are sitting in a row. S and Z are in the centre. A and P are at the " + 
"ends. R is sitting to the left of A. Who is to the right of P ?", "A", "X", "S", "B"); 
this.addQuestion(q2); 
Question q3=new Question("Which of the following is the fastest" + 
" writable memory?","RAM", "FLASH","Register","C"); 
this.addQuestion(q3); 
Question q4=new Question("Which of the following device" + 
" regulates internet traffic?", "Router", "Bridge", "Hub","A"); 
this.addQuestion(q4); 
Question q5=new Question("Which of the following is NOT an" + 
" interpreted language?","Ruby","Python","BASIC","C"); 
this.addQuestion(q5); 
db.close(); 
} 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldV, int newV) { 
// Drop older table if existed 
db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUEST); 
// Create tables again 
onCreate(db); 
} 
// Adding new question 
public void addQuestion(Question quest) { 
//SQLiteDatabase db = this.getWritableDatabase(); 
ContentValues values = new ContentValues(); 
values.put(KEY_QUES, quest.getQUESTION()); 
values.put(KEY_ANSWER, quest.getANSWER()); 
values.put(KEY_OPTA, quest.getOPTA()); 
values.put(KEY_OPTB, quest.getOPTB()); 
values.put(KEY_OPTC, quest.getOPTC()); 
// Inserting Row 
dbase.insert(TABLE_QUEST, null, values); 
} 
public List<Question> getAllQuestions() { 
List<Question> quesList = new ArrayList<Question>(); 
// Select All Query 
String selectQuery = "SELECT * FROM " + TABLE_QUEST; 
dbase=this.getReadableDatabase(); 
Cursor cursor = dbase.rawQuery(selectQuery, null); 
// looping through all rows and adding to list 
if (cursor.moveToFirst()) { 
do { 
Question quest = new Question(); 
quest.setID(cursor.getInt(0)); 
quest.setQUESTION(cursor.getString(1)); 
quest.setANSWER(cursor.getString(2)); 
quest.setOPTA(cursor.getString(3)); 
quest.setOPTB(cursor.getString(4)); 
quest.setOPTC(cursor.getString(5)); 
quesList.add(quest); 
} while (cursor.moveToNext()); 
} 
// return quest list 
return quesList; 
} 
public int rowcount() 
{ 
int row=0; 
String selectQuery = "SELECT * FROM " + TABLE_QUEST; 
SQLiteDatabase db = this.getWritableDatabase(); 
Cursor cursor = db.rawQuery(selectQuery, null); 
row=cursor.getCount(); 
return row; 
} 
} 

你能幫我明白爲什麼這些異常AR e被拋出,上面的代碼出了什麼問題。

+0

對於下一次,尋找「造成」。從你的日誌 - 引發:java.lang.NullPointerException 03-18 14:41:31.194:E/AndroidRuntime(901):at android.app.Activity.findViewById(Activity.java:1853) 03-18 14 :41:31.194:E/AndroidRuntime(901):at com.example.egrep.Quiz。 (Quiz.java:20)' - 確切地告訴你錯誤在哪裏。在這種情況下,Quiz.java的第20行。 – Simon

回答

1
Button butNext=(Button)findViewById(R.id.button1); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_quiz); 

你需要找回你的Button你誇大你的佈局後,否則findViewById回報null。所以它應該是

Button butNext; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_quiz); //layout inflated, now you can get your elements 
     butNext=(Button)findViewById(R.id.button1); 

也學會從logcat中讀取。你會發現你的錯誤比在這裏提出問題要快得多。以下是重要的行:

Caused by: java.lang.NullPointerException 
03-18 14:41:31.194: E/AndroidRuntime(901): at android.app.Activity.findViewById(Activity.java:1853) 
03-18 14:41:31.194: E/AndroidRuntime(901): at com.example.egrep.Quiz.<init>(Quiz.java:20) 
+0

出現了更多的問題,我基本上是在android/Java的初學者。所以通過在stackoverflow提供的這些錯誤解決方案來學習。我已經用新的錯誤列表更新了上面的帖子。謝謝 03-18 15:37:13.834:E/AndroidRuntime(1201):引起:java.lang.NullPointerException 03-18 15:37:13.834:E/AndroidRuntime(1201):\t at com.example。 egrep.DbHelper.addQuestion(DbHelper.java:67) 03-18 15:37:13.834:E/AndroidRuntime(1201):\t at com.example.egrep.DbHelper.onCreate(DbHelper.java:35) – firesword

+0

@firesword然後檢查http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception。恕我直言,你沒有初始化數據庫。你也可以閱讀關於SQLite的教程:http://www.vogella.com/tutorials/AndroidSQLite/article.html#databasetutorial_database –

1

由於您在創建任何視圖之前初始化了butNext按鈕,因此butNext按鈕未正確初始化。

現在,初始化butNextonCreate()方法...

Button butNext; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_quiz); 

    butNext=(Button)findViewById(R.id.button1); 

} 
1

您需要的setContentView後的onCreate初始化按鈕

Button butNext=(Button)findViewById(R.id.button1); 

由於

Button butNext; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_quiz); 
    butNext=(Button)findViewById(R.id.button1); 

} 

findViewById查找當前視圖層次結構中的視圖年。您需要先設置佈局的內容,然後初始化視圖。