2016-05-17 111 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 

这意味着它并非如此。

希望这会有帮助

相关问题