2016-05-17 152 views
0

請你幫我解決錯誤「java.lang.NullPointerException」。 當我嘗試通過MainActivity.java中的「Neues Spiel」按鈕啓動我的QuizActivity.java時,我的應用程序在模擬器中崩潰。 (我清理了項目並嘗試了不同的模擬器) 我尋找了一些答案並嘗試了不同的東西,但我沒有找到我的錯誤,也許是因爲我是一個android-java新手。android應用程序中的java.lang.NullPointerException錯誤

MainActivity.java

package com.example.app_name; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.graphics.Typeface; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class MainActivity extends Activity{ 

    TextView titel; 
    Typeface font_alexbrush; 
    long score=0; 


    @Override 
    public void onBackPressed() {} 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final Context context = this; 
     final Button Beenden_btn = (Button) findViewById(R.id.Beenden_btn); 
     final Button NeuesSpiel = (Button) findViewById(R.id.NeuesSpiel_btn); 
     final Button Impressum = (Button) findViewById(R.id.Impressum_btn); 

     Typeface font_alexbrush = Typeface.createFromAsset(getAssets(), "Font/alexbrush.ttf"); 
     TextView titel= (TextView) findViewById(R.id.titel); 
     titel.setTypeface(font_alexbrush); 

     Impressum.setOnClickListener(new OnClickListener(){  
      public void onClick(View x) { 
        Intent intent = new Intent(getApplicationContext(), Impressum.class); 
        startActivity(intent);}}); 

     NeuesSpiel.setOnClickListener(new OnClickListener(){  
      public void onClick(View x) { 
        Intent intent = new Intent(getApplicationContext(), QuizActivity.class); 

        startActivity(intent); 
         finish();}}); 

      Beenden_btn.setOnClickListener(new OnClickListener(){ 
       public void onClick(View arg0) { 

        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); 

        alertDialogBuilder .setMessage("Soll HistoryQuiz beendet werden?") 
             .setCancelable(false) 
             .setPositiveButton("Ja",new DialogInterface.OnClickListener() { 
              public void onClick(DialogInterface dialog,int id) { finish(); 
                            System.exit(0);}}) 
             .setNegativeButton("Nein",new DialogInterface.OnClickListener() { 
              public void onClick(DialogInterface dialog,int id) {dialog.cancel();}}); 

        AlertDialog alertDialog = alertDialogBuilder.create(); 
        alertDialog.show();}});}} 

logcat的

05-17 13:50:22.241: E/AndroidRuntime(3636): Caused by: java.lang.NullPointerException 
05-17 13:50:22.241: E/AndroidRuntime(3636):  at com.example.app_name.QuizActivity.onCreate(QuizActivity.java:39) 
05-17 13:50:22.241: E/AndroidRuntime(3636):  at android.app.Activity.performCreate(Activity.java:5133) 
05-17 13:50:22.241: E/AndroidRuntime(3636):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
05-17 13:50:22.241: E/AndroidRuntime(3636):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
05-17 13:50:22.241: E/AndroidRuntime(3636):  ... 11 more 
05-17 13:58:15.853: E/OpenGLRenderer(3679): Getting MAX_TEXTURE_SIZE from GradienCache 
05-17 13:58:15.857: E/OpenGLRenderer(3679): Getting MAX_TEXTURE_SIZE from Caches::initConstraints() 
05-17 13:58:16.617: E/AndroidRuntime(3679): FATAL EXCEPTION: main 
05-17 13:58:16.617: E/AndroidRuntime(3679): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app_name/com.example.app_name.QuizActivity}: java.lang.NullPointerException 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at android.os.Looper.loop(Looper.java:137) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at java.lang.reflect.Method.invoke(Method.java:525) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at dalvik.system.NativeStart.main(Native Method) 
05-17 13:58:16.617: E/AndroidRuntime(3679): Caused by: java.lang.NullPointerException 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at com.example.app_name.QuizActivity.onCreate(QuizActivity.java:39) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at android.app.Activity.performCreate(Activity.java:5133) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
05-17 13:58:16.617: E/AndroidRuntime(3679):  ... 11 more 
+0

QuizActivity.java中的第39行是什麼? – Lal

回答

0

你就行了frage.setText(currentQ.getQUESTION());currentQ得到一個NPE是你的問題無效。

在使用之前,您將不得不初始化currentQ。因此,爲了解決這個錯誤添加,在使用它之前,需要

currentQ= new Question(); 

。也就是說,添加上述行,行之後

quesList=db.getAllQuestions(); 

因此,應該像

quesList=db.getAllQuestions(); 
currentQ= new Question(); 
+1

它的工作原理,謝謝。 –

+0

好.. :) ..很高興它幫助你.. – Lal

+0

但現在我有另一個問題,問題和答案文本不顯示在應用程序中。 –

0

顯然,在這一行失敗:

frage.setText(currentQ.getQUESTION()); 

這將導致結論fragecurrentQ是空引用。根據你得到的frage實例在這一行:

frage = (TextView)findViewById(R.id.frage); 

我會爲currentQ去爲空引用。

既然你都基於一個條件

if(quesList!= null && quesList.size() !=0){ 
    currentQ=quesList.get(qid);} 
} 

所以questList實例化該變量爲空或空。你是對的,這是一個經典的noob開發者錯誤(不僅僅是Android)。你必須確保currentQ變量在使用它之前有一個參考或要求一個有效的參考,你會被罰款

if (currentQ != null) { 
    frage.setText(currentQ.getQUESTION()); 
    a.setText(currentQ.getOPTA()); 
    b.setText(currentQ.getOPTB()); 
    c.setText(currentQ.getOPTC()); 
    d.setText(currentQ.getOPTD()); 
} 
+0

它的工作原理,謝謝。 –

0

錯誤(空指針異常)意味着你正在嘗試在QuizActivity的39線訪問一個空變量。如果我計算正確,這將是:

frage.setText(currentQ.getQUESTION()); 

這意味着frage或currentQ在那一刻爲空。我的猜測是currentQ,但要確保,你可以登錄它是這樣的:

Log.d("Tag", "Is frage null? " + (frage == null)); 
Log.d("Tag", "Is currentQ null? " + (currentQ == null)); 

你會看到你的logcat的結果(我假設你知道如何使用,因爲它是題外話) 。

如果您發現frage爲空,則表示findViewById(R.id.frage)返回null。當活動在setContentView()的佈局集中找不到具有給定ID的視圖時,就是這種情況。所以無論視圖的ID是錯誤還是佈局錯誤。

如果您發現currentQ爲空,這意味着您在嘗試函數之前尚未啓動對象。在這種情況下,你的條件實例currentQ是:

quesList!= null && quesList.size() !=0 

這意味着它並非如此。

希望這會有幫助

相關問題