2

私は C++ の世界から来ましたが、マネージ コードと Android 開発に関して何かが欠けていると思います。文字列などのすべての UI 要素を xml ファイルに分離することは理にかなっています。しかし、ビルド時にエラーがキャッチされることを期待しています。特に、NullPointerExecption エラーは、.xml コンポーネントの不良または欠落が原因で発生することがよくあります。JVM は、ビルド時にキャッチできる問題をランタイムにプッシュするように見えますが、これは非常に悪いことのように思えます。

現在発生しているエラーには NullPointerException がありますが、行番号はありません。したがって、私のxmlリソースのタイプミスが原因である可能性があります。これは、デバッグには非常に非効率的です。さらに悪いことに、コードをステップ実行してデバッグするのが困難です。一部のファイルは正常に動作しますが、他のファイルは行番号が正しく一致せず、他のファイルはデバッガ (PathClassLoader、BootClassLoader) によってロードできません。

確かにこれにアプローチするためのより良い方法があるに違いありませんか? NullPointerException の原因となった行番号を取得するにはどうすればよいですか?

これが私のコードです:

public class FragmentsMainActivity extends FragmentActivity {

public final static int STARTUP_ACTIVITY_RESULT=0;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fragments_main);


    Intent intentStartupActivity = new Intent(this, StartupActivity.class);
    if(intentStartupActivity != null)
        startActivityForResult(intentStartupActivity, STARTUP_ACTIVITY_RESULT);

    // get an instance of FragmentTransaction from your Activity
    FragmentTransaction fragmentTransaction = 
            getSupportFragmentManager().beginTransaction();

    //add a fragment
    StreamingActivity streamingActivity = new StreamingActivity();
    if (streamingActivity != null) {
        fragmentTransaction.add(R.id.streamingactivity, streamingActivity);
        fragmentTransaction.commit();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_fragments_main, menu);
    return true;
}

そして、ここに私の AndroidManifest.xml があります

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="kesten.fragmentstestbed"
      android:versionCode="1"
      android:versionName="1.0">

    <uses-sdk android:minSdkVersion="9"
              android:targetSdkVersion="15" />

    <!--   Sphero permissions -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

    <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

        <activity
            android:name=".FragmentsMainActivity"
            android:label="@string/title_activity_fragments_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- StartupActivity for connecting to a Robot -->
        <activity
            android:name="orbotix.robot.app.StartupActivity">
        </activity>
</application>   
</manifest>

ここにLogCatがあります

07-18 10:37:25.600: W/dalvikvm(4835): threadid=1: thread exiting with uncaught exception (group=0x40020560)
07-18 10:37:25.680: E/AndroidRuntime(4835): FATAL EXCEPTION: main
07-18 10:37:25.680: E/AndroidRuntime(4835): java.lang.RuntimeException: Unable to start activity ComponentInfo{kesten.fragmentstestbed/kesten.fragmentstestbed.FragmentsMainActivity}:java.lang.NullPointerException
07-18 10:37:25.680: E/AndroidRuntime(4835):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1650)
07-18 10:37:25.680: E/AndroidRuntime(4835):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1666)

そしてスタックトレース

Thread [<1> main] (Suspended (exception RuntimeException))  
ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 1650    

ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 1666 

ActivityThread.access$1500(ActivityThread, ActivityThread$ActivityClientRecord, Intent) line: 117   

回答のおかげで、行番号があるlogCatトレースの下に「原因」が見つかりました。これは、私のフラグメント - StreamingActivity.onCreate() が getView() を呼び出しており、これが null を返していることを示していました。これで私の NPE は解決したので、新しいスレッドを開始して、別のスレッドでアクティビティとフラグメントのビューを作成する順序で発生している問題について話し合い、これを解決済みとしてマークします。

4

2 に答える 2

2

NullPointerException の原因となった行番号を取得するにはどうすればよいですか?

情報はそこにありますが、少し不可解です。NullPointerException/Help Reading LogCatからのこの LogCat を検討してください。

06-11 11:56:08.118: W/dalvikvm(593): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
06-11 11:56:08.128: E/AndroidRuntime(593): FATAL EXCEPTION: main
06-11 11:56:08.128: E/AndroidRuntime(593): java.lang.RuntimeException: Unable to start activity ComponentInfo{gaurav.android/gaurav.android.CalcActivity}: java.lang.NullPointerException
06-11 11:56:08.128: E/AndroidRuntime(593):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
06-11 11:56:08.128: E/AndroidRuntime(593):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-11 11:56:08.128: E/AndroidRuntime(593):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-11 11:56:08.128: E/AndroidRuntime(593):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-11 11:56:08.128: E/AndroidRuntime(593):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-11 11:56:08.128: E/AndroidRuntime(593):  at android.os.Looper.loop(Looper.java:137)
06-11 11:56:08.128: E/AndroidRuntime(593):  at android.app.ActivityThread.main(ActivityThread.java:4424)
06-11 11:56:08.128: E/AndroidRuntime(593):  at java.lang.reflect.Method.invokeNative(Native Method)
06-11 11:56:08.128: E/AndroidRuntime(593):  at java.lang.reflect.Method.invoke(Method.java:511)
06-11 11:56:08.128: E/AndroidRuntime(593):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-11 11:56:08.128: E/AndroidRuntime(593):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-11 11:56:08.128: E/AndroidRuntime(593):  at dalvik.system.NativeStart.main(Native Method)
06-11 11:56:08.128: E/AndroidRuntime(593): Caused by: java.lang.NullPointerException
06-11 11:56:08.128: E/AndroidRuntime(593):  at gaurav.android.CalcActivity.reset(CalcActivity.java:341)
06-11 11:56:08.128: E/AndroidRuntime(593):  at gaurav.android.CalcActivity.onCreate(CalcActivity.java:58)
06-11 11:56:08.128: E/AndroidRuntime(593):  at android.app.Activity.performCreate(Activity.java:4465)
06-11 11:56:08.128: E/AndroidRuntime(593):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-11 11:56:08.128: E/AndroidRuntime(593):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)

この場合、LogCat の一番下にある "Caused by: " を見つける必要があります。

06-11 11:56:08.128: E/AndroidRuntime(593): Caused by: java.lang.NullPointerException
06-11 11:56:08.128: E/AndroidRuntime(593):  at gaurav.android.CalcActivity.reset(CalcActivity.java:341)

ここで、CalcActivity が reset() で NullPointerException をスローすることがわかります。具体的(CalcActivity.java:341)には、それが 341 行目にあることを示しています。役立つ場合はスタック トレースをさらにたどることができますが、これは NPE の Android LogCat を読み取る方法です。

それが役立つことを願っています! それ以外の場合は、完全な LogCat を投稿してください。

于 2012-07-18T17:21:20.300 に答える
0

XML と関係がある場合、Eclipse はコンパイル時にエラーにフラグを立てます。そうしないと、アプリケーションをビルドできません。 NullPointerExceptions変数に何かが割り当てられたかどうかに完全に依存するため、実行時にのみ見つけることができます。もちろん、変数を に設定しnullて後で再割り当てしないなどの簡単なケースもありますが、コンパイラがすべてのロジックを検出するのは困難です。null作成した各オブジェクトが、コードで行っているよう であるかどうかを確認する必要はありません。

問題を解決するNullPointerExceptionには、指定された完全なスタック トレースを投稿する必要があります。通常Caused by、エラーが発生した行番号を含む行があります。

于 2012-07-18T17:05:45.447 に答える