【问题标题】:weird NullPointerException in Android 3.0Android 3.0 中奇怪的 NullPointerException
【发布时间】:2012-04-25 17:15:26
【问题描述】:

我不知道为什么相同的代码在 Android 2.3 上运行良好,但是当涉及到 android 3.1 平板电脑时,它会抛出 NullPointerExceptions...这是代码:

public class CalleeButton extends Button implements OnClickListener, AddressAware {
private AddressText mAddress;
private OnClickListener externalClickListener;
public void setExternalClickListener(OnClickListener e) {externalClickListener = e;}
public void setAddressWidget(AddressText a) {a=mAddress;}

//set Uri SipUri ,so we can initialize the mAddress inside calleebutton --smartclassroom
//because every calleebutton will have one sip account/ext. this will replace the information for original mAddress --smartclassroom
public void setSip(String StudentName,String SipUri, AddressText a)
{
    Log.i("CalleeButton-35");
    super.setText(StudentName);
    //mAddress.setText(SipUri);
    Log.i("CalleeButton-38");
    mAddress.setContactAddress(SipUri, StudentName);
    Log.i("CalleeButton-40");
    setAddressWidget(a);
    Log.i("CalleeButton-42");

}

public CalleeButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    setOnClickListener(this);

    //must use this line or you got null pointer exception...smartclassroom
    Log.i("CalleeButton-50");
    mAddress = new AddressText(context, attrs);
    //mAddress = null;
    Log.i("CalleeButton-52");
}

public void onClick(View v) {
    try {
        if (!LinphoneManager.getInstance().acceptCallIfIncomingPending()) {
            if (mAddress.getText().length() >0) { 
            LinphoneManager.getInstance().newOutgoingCall(mAddress);
                //add new action here
                /*******************************************************/
                /*******************************************************/
            }
        }
    } catch (LinphoneCoreException e) {
        LinphoneManager.getInstance().terminateCall();
        onWrongDestinationAddress();
    };

    if (externalClickListener != null) externalClickListener.onClick(v);
}


protected void onWrongDestinationAddress() {
    Toast toast = Toast.makeText(getContext()
            ,String.format(getResources().getString(R.string.warning_wrong_destination_address),mAddress.getText().toString())
            ,Toast.LENGTH_LONG);
    toast.show();
}


}

其实我在Android 2.3平台上得到过一次NullPointerException,但是在添加之后:

mAddress = new AddressText(context, attrs);

然后它编译并顺利运行...直到我尝试在 android 3.1 平板电脑上安装相同的程序...很奇怪,不是吗?请让我了解我在这方面犯了什么错误,在此先感谢! logcat 的错误信息是:

04-25 23:58:13.308: ERROR/AndroidRuntime(6728): FATAL EXCEPTION: main
04-25 23:58:13.308: ERROR/AndroidRuntime(6728): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.linphone/org.linphone.LinphoneActivity}: java.lang.RuntimeException: Unable to start activity ComponentInfo{org.linphone/org.linphone.DialerActivity}: java.lang.NullPointerException
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1751)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1767)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.ActivityThread.access$1500(ActivityThread.java:122)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1005)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.os.Looper.loop(Looper.java:132)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.ActivityThread.main(ActivityThread.java:4028)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at java.lang.reflect.Method.invokeNative(Native Method)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at java.lang.reflect.Method.invoke(Method.java:491)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at dalvik.system.NativeStart.main(Native Method)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{org.linphone/org.linphone.DialerActivity}: java.lang.NullPointerException
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1751)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1592)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:130)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:342)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:676)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.widget.TabHost.setCurrentTab(TabHost.java:345)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.widget.TabHost.setCurrentTabByTag(TabHost.java:282)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at org.linphone.LinphoneActivity.gotToDialer(LinphoneActivity.java:481)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at org.linphone.LinphoneActivity.fillTabHost(LinphoneActivity.java:207)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at org.linphone.LinphoneActivity.onCreate(LinphoneActivity.java:126)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     ... 11 more
04-25 23:58:13.308: ERROR/AndroidRuntime(6728): Caused by: java.lang.NullPointerException
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at org.linphone.DialerActivity.onCreate(DialerActivity.java:128)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1715)
04-25 23:58:13.308: ERROR/AndroidRuntime(6728):     ... 22 more 

在我看来,logcat msgs 告诉了我这个功能:

    mCallee1.setSip("Jack","sip:xxx@xxx.xxx.xxx.xxx",mAddress);

在DailerActivity.java(这里你可以把它当作main函数)导致了NullPointerExcetion,然后我跟踪代码到CalleeButton.java,但仍然找不到导致空指针异常的点...

【问题讨论】:

    标签: android nullpointerexception android-2.3-gingerbread android-3.1-honeycomb


    【解决方案1】:

    在该行 (setSip()) 上设置断点,并检查 mCallee1 和 mAddress 变量。一个应该为空。那将是你的问题。然后只需追溯它并找出它没有被实例化的原因——或者如果 null 是变量的有效状态,只需在调用 setSip() 之前检查它是否为 null。

    【讨论】:

    • 设置异常断点后,使用eclipse进行调试。我发现变量 mCallee1 的值为空。我找不到原因... mCallee1 的变量类型(即 CalleeButton)与 mCall 的变量类型(即 CallButton)非常相似。我尝试了很多不同的方法试图绕过它,但值仍然是一样的,null...
    • 在您遇到此问题的代码中进行编辑。您发布的内容中没有任何涉及 mCallee1 变量的内容。
    • 我找到了!!!这是因为我的布局问题。我的 android 3.0 平板电脑只使用我忽略的横向布局来初始化那些 xml 布局文件。
    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2013-12-20
    • 2015-01-16
    • 2011-10-12
    相关资源
    最近更新 更多