1

私は、電話機またはタブレットを決定するスイッチクラスを持っており、インテントが作成されたときにnullポインタ例外が発生します。私はちょうど両方の活動が存在し、スイッチがタブレットの携帯電話でスイッチに誤っているという意図として正しく動作しているので、何が原因であるのだろうと思っています。ここでNullPointerExeption with and intent Android

は、それぞれの活動を立ち上げ初期活性のためのコードである:ここで

package jack.beastapps.TimerPlus; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.DisplayMetrics; 

public class SplashScreen extends Activity { 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 


public boolean isTablet() { 
try { 
    Context context = this; 
    // Compute screen size 
    DisplayMetrics dm = context.getResources().getDisplayMetrics(); 
    float screenWidth = dm.widthPixels/dm.xdpi; 
    float screenHeight = dm.heightPixels/dm.ydpi; 
    double size = Math.sqrt(Math.pow(screenWidth, 2) + 
          Math.pow(screenHeight, 2)); 

    // Tablet devices should have a screen size greater than 6 inches 
    return size >= 6; 
} catch(Throwable t) { 
    return false; 
} 
}{ 
if (isTablet() == true) { 
     Intent tablet = new Intent(SplashScreen.this, TabletActivity.class); 
     startActivity(tablet); 
} 
else { 
     Intent phone = new Intent(SplashScreen.this, PhoneActivity.class); 
     startActivity(phone); 
} 

は近い起動時にかかる力のためのlogcatです:

09:34:08.454: E/AndroidRuntime(12322): FATAL EXCEPTION: main 
04-07 09:34:08.454: E/AndroidRuntime(12322): java.lang.RuntimeException: Unable to   instantiate activity   
ComponentInfo{jack.beastapps.TimerPlus/jack.beastapps.TimerPlus.SplashScreen}: java.lang.NullPointerException 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1880) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.os.Looper.loop(Looper.java:137) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.app.ActivityThread.main(ActivityThread.java:4424) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at java.lang.reflect.Method.invokeNative(Native Method) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at java.lang.reflect.Method.invoke(Method.java:511) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at dalvik.system.NativeStart.main(Native Method) 
04-07 09:34:08.454: E/AndroidRuntime(12322): Caused by: java.lang.NullPointerException 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:127) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.content.ComponentName.<init>(ComponentName.java:75) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.content.Intent.<init>(Intent.java:3122) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at jack.beastapps.TimerPlus.SplashScreen.<init>(SplashScreen.java:36) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at java.lang.Class.newInstanceImpl(Native Method) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at java.lang.Class.newInstance(Class.java:1319) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.app.Instrumentation.newActivity(Instrumentation.java:1023) 
04-07 09:34:08.454: E/AndroidRuntime(12322): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1871) 
04-07 09:34:08.454: E/AndroidRuntime(12322): ... 11 more 
+0

あなたのソースコードは、あなたのスタックトレースが一致しないエラーを取得した場合。例外はSplashscreenコンストラクタで発生します。しかし、あなたのソースにはコンストラクタは含まれていません。書式も変更してください。私はタブを取り除き、スペースでそれらを置き換えることによってそれを美しくしようとしました。しかし、それは合わないだろう。 –

答えて

1

これはと呼ばれる方法で使用することはできませんオブジェクトはまだ存在しないため、コンストラクタから取得します。 onCreate()でインテントを作成する必要があります。 onCreate()の前にアクティビティのコード(コンストラクタ、または静的初期化子を除く)は実行されません。したがって、あなたはonCreate()の前にそれを必要としません。

0

コードが正しくインデントされていないため、あなたがしていることを理解しにくいです。

は、あなたはこれを試すことができます(@DirkJäckelが示唆したように)

package jack.beastapps.TimerPlus; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.DisplayMetrics; 

public class SplashScreen extends Activity { 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     if (isTablet() == true) { 
      Intent tablet = new Intent(SplashScreen.this, TabletActivity.class); 
      startActivity(tablet); 
     } 
     else { 
      Intent phone = new Intent(SplashScreen.this, PhoneActivity.class); 
      startActivity(phone); 
     } 
    } 


    public boolean isTablet() 
    { 
     try { 
      Context context = this; 
      // Compute screen size 
      DisplayMetrics dm = context.getResources().getDisplayMetrics(); 
      float screenWidth = dm.widthPixels/dm.xdpi; 
      float screenHeight = dm.heightPixels/dm.ydpi; 
      double size = Math.sqrt(Math.pow(screenWidth, 2) + 
         Math.pow(screenHeight, 2)); 

      // Tablet devices should have a screen size greater than 6 inches 
      return size >= 6; 
     } catch(Throwable t) { 
      return false; 
     } 
    } 
} 

テルの使用をあなたはまだ