【问题标题】:How to resolve this Null pointer exception?如何解决这个空指针异常?
【发布时间】:2013-01-31 17:11:52
【问题描述】:

我在principal==0.0 收到一个错误,我不明白为什么会发生这种情况。

if(et1.getText()!=null) {
    try {
        principal = Double.valueOf(et1.getText().toString());
}
catch(Exception e) {
    message = "Incorrect value";
}
}
// The problem is in the if statement below!
if(principal==0.00) {
    message = "value cannot be zero";
    title = "error";
}

我得到的错误如下:

   01-31 22:21:37.700: E/AndroidRuntime(985): FATAL EXCEPTION: main
   01-31 22:21:37.700: E/AndroidRuntime(985):
   java.lang.NullPointerException 01-31 22:21:37.700:
   E/AndroidRuntime(985):   at
   com.compoundinterest.MainActivity$1.onClick(MainActivity.java:65)
   01-31 22:21:37.700: E/AndroidRuntime(985):   at
   android.view.View.performClick(View.java:2485) 01-31 22:21:37.700:
   E/AndroidRuntime(985):   at
   android.view.View$PerformClick.run(View.java:9080) 01-31
   22:21:37.700: E/AndroidRuntime(985):     at
   android.os.Handler.handleCallback(Handler.java:587) 01-31
   22:21:37.700: E/AndroidRuntime(985):     at
   android.os.Handler.dispatchMessage(Handler.java:92) 01-31
   22:21:37.700: E/AndroidRuntime(985):     at
   android.os.Looper.loop(Looper.java:123) 01-31 22:21:37.700:
   E/AndroidRuntime(985):   at
   android.app.ActivityThread.main(ActivityThread.java:3683) 01-31
   22:21:37.700: E/AndroidRuntime(985):     at
   java.lang.reflect.Method.invokeNative(Native Method)

此错误的原因可能是什么,我该如何解决?

【问题讨论】:

  • 我假设** 只是在您的代码中以突出显示相关部分?如果是这样,请不要这样做。如果必须,请添加适当的代码注释,但不要添加会导致错误代码的内容。
  • @Bart: 只是我突出显示了该代码
  • 好的,请不要那样做。只需添加评论或其他内容。例如//The problem is in the line below。这仍然很清楚,如果需要,我们实际上可以复制粘贴代码进行测试,没有任何问题。

标签: android android-emulator


【解决方案1】:

试试这个:

// Declaration on top
Double principal=0.00;

使用这个:

EditText et1 = (EditText) findViewById(R.id.myEdit);

if(!et1.getText().toString().equals("")) {
    try {
        principal = Double.parseDouble(et1.getText().toString());
    }
    catch(Exception e) {
        message = "Incorrect value";
    }
}

if(principal==0.00) {
    message = "value cannot be zero";
    title = "error";
}

【讨论】:

  • 我可以用 Double.parseDouble 代替新的 Double
  • @user2019287 你的意思是这样说new Double(string);?
  • if(principalTxt.getText()!=null){ try{ principal=new Double(principalTxt.getText().toString()); } catch(Exception E){ message=message+"初始存款的意外值。\n";标题=“错误!”; } }
  • @user2019287 你也可以使用它,但最好使用Double.parseDouble 而不是调用构造函数。
  • 但是使用 parsedouble 或其他任何东西我在 principal==0.0 遇到同样的问题
【解决方案2】:

如果不知道更多,就很难说。我的猜测是,如果 et1.getText() == null 那么主体永远不会被初始化。

【讨论】:

  • 对,但是什么是主体?因为上面的代码没有初始化它,当你比较它时它是一个空值吗?如果不了解更多信息,很难说出为什么会发生这种情况,但这似乎就是正在发生的事情。
  • 值必须在外部输入,所以我放置了 != 运算符和 0.0 值。发生该值
【解决方案3】:

似乎主体为空。

当您执行此检查时。

if(principal==0.00)

其实是

if(principal.doubleValue() ==0.00)

这会导致 nullPointer 因为主体为空。

所以改成:

if(principal ==null)
//return or do something
else if(principal ==0.00)

【讨论】:

    【解决方案4】:

    valueOf 期间发生异常时,您的变量principal 将不会被设置。并且比较会抛出 NullPointerException,因为它会将 principal 自动拆箱为一个不能为 null 的双精度数。

    应该是这样的

    if (principal == null) {
      // error handling
    } else if (principal==0.00) {
    

    并在valueOf 期间检查您的日志以了解以前的异常情况。


    我知道这是您对同一问题的第四个问题,您刚刚从Kovge's answer 复制了您的代码。如果您尝试理解给出的答案,您将会学到更多。

    以下是您的复制粘贴方法的一些变体:

    1. 显式忽略空值:

      if (principal == null && principal==0.00) {
      
    2. 使用 Doubles 忽略空值:

      if (Double.valueOf(0.0).equals(principal)) {
      

    【讨论】:

    • 如果一切正常,为什么会出现 NullPointerException?
    猜你喜欢
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    相关资源
    最近更新 更多