2

由于我已经上传我的应用程序,我收到了很多java.lang.NullPointerException崩溃报告。我很努力地理解这个问题,因为它不会在模拟器或我亲自测试的物理设备上崩溃。下面是报告的一个示例:我相信这是在“practiceSubscreen”当按下“openNumbersSelect”按钮崩溃Android神秘的空指针异常

java.lang.IllegalStateException: Could not execute method of the activity 
at android.view.View$1.onClick(View.java:2072) 
at android.view.View.performClick(View.java:2408) 
at android.view.View$PerformClick.run(View.java:8817) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:143) 
at android.app.ActivityThread.main(ActivityThread.java:4914) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.reflect.InvocationTargetException 
at com.bryan.barrett.countdownforandroid.practiceSubscreen.openNumbersSelect(Unknown   Source) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at android.view.View$1.onClick(View.java:2067) 
... 11 more 
Caused by: java.lang.NullPointerException 
... 15 more 

。这是我该按钮的代码:

public void openNumbersSelect(View view){ 
    Intent iNum = new Intent(this, numbersSelect.class); 
    String gamemode = "practice"; //practice mode 
    iNum.putExtra("gamemode", gamemode); 
    startActivity(iNum); 

    overridePendingTransition(R.anim.fadein, R.anim.fadeout); 
    if(sound){ 
     soundPool.play(Main.SNDclick, audio.getStreamVolume(AudioManager.STREAM_MUSIC), 
       audio.getStreamVolume(AudioManager.STREAM_MUSIC), 1, 0, 1f); 
    } 
} 

,这是在以下numbersSelect类,它的目的是打开的onCreate代码:

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_numbers_select); 

     Intent i = getIntent(); 
     gamemode = i.getStringExtra("gamemode");  
     gameround = i.getIntExtra("gameround", 0) + 1; 
     points = i.getIntExtra("points", 0);  

     //Shared Preferences 
     prefs = PreferenceManager.getDefaultSharedPreferences(this); 
     sound = prefs.getBoolean("sound", true); 

     //Sounds 
     setVolumeControlStream(AudioManager.STREAM_MUSIC); 
     audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     soundPool = Main.soundPool; 

     //Big Numbers 
     for (int n=25; n<=100; n+=25){  //add 25, 50, 75, 100 
      bignumbers.add(n);    
     } 
     //Small Numbers 
     for (int m=1; m<=10; m++){  //adds 1-10 twice 
      smallnumbers.add(m); 
      smallnumbers.add(m); 
     } 

     //Screen metrics 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     int screenw = metrics.widthPixels; int screenh = metrics.heightPixels; 
     int unitw = (screenw/14); int unith = (screenh/40); //divide screen into 14 columns x 40 rows... 

     num1 = (Button)findViewById(R.id.num1img); nums.add(num1); 
     num2 = (Button)findViewById(R.id.num2img); nums.add(num2); 
     num3 = (Button)findViewById(R.id.num3img); nums.add(num3); 
     num4 = (Button)findViewById(R.id.num4img); nums.add(num4); 
     num5 = (Button)findViewById(R.id.num5img); nums.add(num5); 
     num6 = (Button)findViewById(R.id.num6img); nums.add(num6); 
     for(int n=0; n<6; n++){ 
      nums.get(n).setHeight(screenh/4); nums.get(n).setTextSize(Main.fontSize); 
      nums.get(n).setWidth(screenw/6); nums.get(n).setPadding(1, 1, 1, 1); 
     } 
     lrg = (Button)findViewById(R.id.largebutton); lrg.setWidth((unitw*200)/35); 
     sml = (Button)findViewById(R.id.smallbutton); sml.setWidth((unitw*200)/35); 

     Typeface scribble = Typeface.createFromAsset(getAssets(), "fonts/scribble.ttf"); 

     TextView numbersSeltext = (TextView)findViewById(R.id.numbersSeltext); 
     numbersSeltext.setTypeface(scribble); 
     numbersSeltext.setWidth(screenw); numbersSeltext.setHeight(unith*8); 
     if(gamemode.equals("full")){ 
      numbersSeltext.setText("Round " + gameround + ": Select 6 Numbers"); 
     } 
} 

如果任何人都可以在此有何启示这将不胜感激!这是一个令人沮丧的问题,因为它在我已经测试过的设备上完美工作,并且它似乎可以在许多基于反馈的设备上正常工作,因此我甚至不知道代码是否存在问题,或者某些设备是建立..我可以抛出更多的崩溃报告或代码,如果需要的话!

在此先感谢!

+0

您可以扩展堆栈跟踪的一部分:“... 15 more”并将其添加到问题中吗?这可能会有所帮助。 – 2013-04-23 00:33:17

+0

跟踪中的那些“... XX more”消息是多余的。没有任何之前没有透露的堆栈跟踪。 – MarsAtomic 2013-04-23 01:24:10

+0

show onCreate of numberSelect Class – stinepike 2013-04-23 05:12:16

回答

0

如果我是你,我会测试是否所有的Buttons num1,num2 ...和许多其他视图在它们被使用之前都是空的,因为如果视图还没有创建成存在,那么获取视图可能会引发nullpointerexception无论出于何种原因(例如,可滚动列表视图项目只填充可以放入屏幕的视图)。它可能会帮助更多,如果你让使用知道什么是你的布局xml。

+0

感谢您的回复。我有一个线性布局的按钮来容纳6个数字按钮,全局视图组是一个相对布局。我对大多数屏幕使用相对布局,在这个阶段我几乎每一个屏幕都收到了一个崩溃报告。奇怪的行为我忘记提及有时当我从eclipse运行应用程序时,视图大小都是错误的(我在大多数情况下定义了onCreate中的大小,并且它好像没有被调用或什么东西)。我想知道这与它有什么关系?这种情况很少发生,但不止一次发生了@Neoh – Bryan 2013-04-24 09:20:03

+0

您的错误报告并未反映出错误的真正原因。什么是“由...引发:java.lang.NullPointerException ... 15更多”,如果有的话?有你应该看看的主要来源。 – Neoh 2013-04-24 16:52:53

+0

这就是所有的崩溃报告给出,我不能扩大15更多的一部分..我彻底检查了我的代码,并找不到任何空值传递。这是非常奇特的,它从来没有为我(中兴通讯刀片)崩溃,并没有关于从Galaxy S3崩溃时,我检查(2800下载到S3而不是一个S3崩溃报告,即使我有近200报告这个nullPointerException异常)。我将调查其他设备,它已经在Nexus 7上崩溃,但对于一些人来说,它在它们的联系7上工作得很好。@Neoh – Bryan 2013-04-24 20:35:42