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

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 回答