2014-03-18 6 views
0

내 응용 프로그램에 작은 퀴즈를 포함하려고합니다. 테스트를 위해 답변으로 나열된 변형을 사용해 보았습니다. 나의 주요 활동은 버튼을 통해 모든 옵션이 표시된 선택자입니다. 응용 프로그램은 의미, 단어 목록 등의 기능을 제공하기 위해 eGREp.db라는 데이터베이스를 사용합니다. 그 부분이 훌륭하게 작동하면서 새로운 데이터베이스를 만들고 별도로 작업하고 싶었습니다. 클릭 테스트에서 퀴즈 활동이 시작되었습니다. 나는 지금이이 퀴즈 활동을 시작하도록되어 있지만, 몇 가지 예외가 슬로우되는 다음활동 시작시 Nullpointer 예외가 발생했습니다.

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

이있는 openQuiz를 가리 키도록 온 클릭() 필드를 설정 한

. 퀴즈 클래스

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

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

당신이 날이 예외 아칸소 이유를 이해하는 데 도움이 DbHelper 클래스 e가 Throw되고 위의 코드가 잘못된 것입니다.

+0

다음 번에는 "에 의해 발생"을 찾으십시오. 귀하의 로그에서 - 원인 : java.lang.NullPointerException 03-18 14 : 41 : 31.194 : E/AndroidRuntime (901) : android.app.Activity.findViewById (Activity.java:1853) 03-18 14 : 41 : 31.194 : E/AndroidRuntime (901) : 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); 

당신은 당신이 그렇지 않으면 findViewById 반환 null를 레이아웃을 팽창 후 Button를 검색 할 필요가있다. 그래야합니다

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

더 많은 문제가 제기되었고 기본적으로 안드로이드/자바 초보자입니다.그래서 이러한 오류 솔루션을 통해 학습 stackoverflow에서 제공합니다. 위의 게시물을 새로운 오류 목록으로 업데이트했습니다. 감사 03-18 15 : 37 : 13.834 : E/AndroidRuntime (1201) : 03-18 java.lang.NullPointerException이 15 : 37 : 13.834 의해 발생 : E/AndroidRuntime (1201)에서 com.example \t. 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을 확인하십시오. IMHO 당신은 dbase를 초기화하지 않았습니다. SQLite에 대한 자습서를 읽을 수도 있습니다. http://www.vogella.com/tutorials/AndroidSQLite/article.html#databasetutorial_database –

1

butNext 버튼이 제대로 초기화되지 않은보기를 만들기 전에 butNext 버튼을 초기화하고 있으므로. 이제

는 초기화 butNext 내부의 onCreate() 방법 ...

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

} 

findViewById가 보이는

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

으로 된 setContentView 후에서 onCreate에서 버튼을 초기화 할 필요가
Button butNext; 

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

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

} 
1

현재 뷰 계층의 뷰 와이. 레이아웃의 내용을 먼저 설정 한 다음보기를 초기화해야합니다.

관련 문제