我来自 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,所以我将开始一个新线程来讨论我在另一个线程中的 Activity 和 Fragment 中创建视图的顺序所遇到的问题,并将其标记为已解决。