私は 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 は解決したので、新しいスレッドを開始して、別のスレッドでアクティビティとフラグメントのビューを作成する順序で発生している問題について話し合い、これを解決済みとしてマークします。