1

電話またはタブレットを決定するためのスイッチ クラスがあり、インテントの作成時に null ポインター例外が発生します。両方のアクティビティが存在し、タブレットの電話でスイッチでエラーが発生する意図として、スイッチが正しく機能しているため、何が原因なのか疑問に思っています。

それぞれのアクティビティを起動する初期アクティビティのコードは次のとおりです。

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
4

2 に答える 2

1

オブジェクトがまだそこにないため、 this はコンストラクターから呼び出されたメソッドでは使用できません。onCreate() でインテントを作成する必要があります。onCreate() の前に、Activity からのコード (コンストラクターまたは静的イニシャライザーを除く) が実行されることはありません。したがって、onCreate() の前には必要ありません。

于 2012-06-12T18:49:26.290 に答える
0

あなたのコードは適切にインデントされていません。あなたが何をしているのか理解するのは困難です。

これを試すことができますか:(@Dirk Jä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; 
        }
    }
}

それでもエラーが発生する場合は使用してください

于 2013-12-12T14:58:29.683 に答える