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