【问题标题】:NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equalsIgnoreCase(java.lang.String)' on a null object reference [duplicate]NullPointerException:尝试在空对象引用上调用虚拟方法“boolean java.lang.String.equalsIgnoreCase(java.lang.String)”[重复]
【发布时间】:2015-03-09 19:30:59
【问题描述】:

我在运行时收到此错误。

java.lang.RuntimeException: 无法启动活动 ComponentInfo java.lang.NullPointerException:尝试调用虚拟方法 'boolean java.lang.String.equalsIgnoreCase(java.lang.String)' 空对象引用

堆栈跟踪:

01-12 03:44:54.270: E/AndroidRuntime(1437): FATAL EXCEPTION: main
01-12 03:44:54.270: E/AndroidRuntime(1437): Process: home.saket, PID: 1437
01-12 03:44:54.270: E/AndroidRuntime(1437): java.lang.RuntimeException: Unable to start activity ComponentInfo{home.saket/home.saket.addmember.Add_Update_User}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equalsIgnoreCase(java.lang.String)' on a null object reference
01-12 03:44:54.270: E/AndroidRuntime(1437):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at android.app.ActivityThread.access$800(ActivityThread.java:144)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at android.os.Looper.loop(Looper.java:135)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at android.app.ActivityThread.main(ActivityThread.java:5221)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at java.lang.reflect.Method.invoke(Native Method)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at java.lang.reflect.Method.invoke(Method.java:372)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
01-12 03:44:54.270: E/AndroidRuntime(1437): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equalsIgnoreCase(java.lang.String)' on a null object reference
01-12 03:44:54.270: E/AndroidRuntime(1437):     at home.saket.addmember.Add_Update_User.onCreate(Add_Update_User.java:38)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at android.app.Activity.performCreate(Activity.java:5933)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
01-12 03:44:54.270: E/AndroidRuntime(1437):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
01-12 03:44:54.270: E/AndroidRuntime(1437):     ... 10 more
01-12 03:44:54.272: W/ActivityManager(472):   Force finishing activity home.saket/.addmember.Add_Update_User
01-12 03:44:54.273: E/ActivityManager(472): Invalid thumbnail dimensions: 384x384

下面我贴出代码并指出错误行。

Add_Update_User.java:

@Override
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_update_screen);

    // set screen
    Set_Add_Update_Screen();

    // set visibility of view as per calling activity
    String called_from = getIntent().getStringExtra("called");

    if (called_from.equalsIgnoreCase("add")) {  --->38th error line
        add_view.setVisibility(View.VISIBLE);
        update_view.setVisibility(View.GONE);
    } else {

        update_view.setVisibility(View.VISIBLE);
        add_view.setVisibility(View.GONE);
        USER_ID = Integer.parseInt(getIntent().getStringExtra("USER_ID"));

        Contact c = dbHandler.Get_Contact(USER_ID);  

        add_name.setText(c.getName());
        add_mobile.setText(c.getPhoneNumber());
        add_email.setText(c.getEmail());
        // dbHandler.close();
    }
    }

【问题讨论】:

  • 你能帮我试试这个吗? if("add".equalsIgnoreCase(call_from)){
  • @KickButtowski 我试过你的。效果很好。你能发布你的答案并解释一下吗?
  • 我无法发布我的答案,因为您的帖子已被标记为重复。 :(
  • 每个人都告诉我建议进行空检查。你的答案已经解决了我。但现在你不能发布你的答案,因为它已关闭。抱歉。 @KickButtowski
  • 你可能也想看看这个讨论chat.stackoverflow.com/rooms/68625/madandi

标签: java android nullpointerexception


【解决方案1】:

called_from 必须是 null。添加针对该条件的测试,例如

if (called_from != null && called_from.equalsIgnoreCase("add")) {

或者您可以使用Yoda conditions(根据链接的维基百科文章中的优势 它还可以解决某些类型的不安全null 行为它们可以描述为将表达式的常量部分放在条件语句的左侧)

if ("add".equalsIgnoreCase(called_from)) { // <-- safe if called_from is null

【讨论】:

  • 我喜欢尤达的条件...+1 为这个想法!
  • 你能解释一下这里的尤达条件吗?
  • @KickButtowski 已编辑以包含一些解释。
  • @ElliottFrisch 我仍然不明白它是如何抛出 NPE 的。怎么样?
  • @Kick Yoda 条件不会抛出 NPE,这就是使用它们的重点。你在问什么?
【解决方案2】:

这是错误行:

if (called_from.equalsIgnoreCase("add")) {  --->38th error line

这意味着called_from 为空。使用前简单检查是否为空:

String called_from = getIntent().getStringExtra("called");

if (called_from != null && called_from.equalsIgnoreCase("add")) {
    // do whatever
} else {
    // do whatever
}

这样,如果called_from 为空,它将执行条件的else 部分。

【讨论】:

    【解决方案3】:

    由于这个语句而发生异常,

    called_from.equalsIgnoreCase("add")
    

    好像之前的说法

    String called_from = getIntent().getStringExtra("called");
    

    返回一个空引用。

    您可以检查启动此活动的意图是否包含“调用”这样的键。

    【讨论】:

      猜你喜欢
      • 2017-02-22
      • 2018-02-10
      • 2021-12-29
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      相关资源
      最近更新 更多