【问题标题】:how to return null value when getter have null value instead return java.lang.NullPointerException [duplicate]当getter具有空值而不是返回java.lang.NullPointerException时如何返回空值[重复]
【发布时间】:2020-08-28 23:49:08
【问题描述】:

我查询数据库并将其映射到类

MyDataClass myDataClass = myDataDao.findMyDataByAccountNumber(accountNumber);

我把它映射到像这样的其他类

MyOtherDataclass myOtherDataClass = new MyOtherDataClass();
myOtherDataClass.setBirthDate(myDataClass.getBirthDate().toString);

我知道myDataClass.getBirthDate() 为空,因为我的数据库中的birthdate 值为空。 如果我在数据库中将值插入birthdate,那么它是正常的,一切正常。但如果它没有价值,而不是抛出java.lang.NullPointerException: null,我想在json中将它设置为null

我希望 json 中的结果是这样的

{
AccountNumber: "12313",
BlaBla: "blabla",
BirthDate: null,
}

================================================ ==============================

找出问题所在。

我在myOtherDataClass.getBirthDate().toString() 上使用.toString(),所以它抛出空指针。因为myDataClass 中的birthDate 为空。对不起,这是我的错。

解决了

myOtherDataClass.setBirthDate(myDataClass.getBirthDate() != null ? myDataClass.getBirthDate().toString() : null);

【问题讨论】:

  • 什么是抛出空指针?吸气剂?请使用 stacktrace 发布您的日志
  • 编写一个处理器来处理每个值的空值。
  • @ThomasAndolf 是的,我已经编辑了帖子。谢谢。
  • 这里真正的问题是为什么myOtherDataClass 将日期存储为字符串?不要那样做。尽量使用原始类型,只在需要打印或显示时才转换。
  • 如果您发布了堆栈跟踪,所有这些都可以在一秒钟内被指出。

标签: java postgresql spring-boot spring-rest


【解决方案1】:

我们对您的类(myDataClassmyOtherDataClass)没有任何可见性,因此很难确定 getter 抛出错误的原因。不过,我只是在这里猜测,可能您只是在寻找一种快速的单行代码来处理空值,一个答案是:

myOtherDataClass.setName((myDataClass.getName() != null) ? myDataClass.getName() : "somethingelse");

这个ternary construct 可以用来渲染任何你想要的“其他东西”,包括一个空值(我也不知道你是如何生成 json 的,所以我不知道你是如何处理空值的.)

如果您想查看一个完整的示例,这里有一个带有两个实例(一个已命名,一个未命名)的假 DAO。

import java.util.*;
import java.lang.*;
import java.io.*;

// The main method must be in a class named "Main".

class MyDataClass {
    String accountNumber;
    String blaBla;
    String name;
    
    public MyDataClass(String accountNumber, String blaBla) {
        this.accountNumber = accountNumber;
        this.blaBla = blaBla;
    }
    
    public MyDataClass(String accountNumber, String blaBla, String name) {
        this.accountNumber = accountNumber;
        this.blaBla = blaBla;
        this.name = name;
    }
    
    public String getName() {
        return this.name;
    }
    
}

class MyOtherDataClass {
    String name;
    String foo;

    public MyOtherDataClass() {
        this.foo = "bar";
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public void printIt() {
      System.out.println("Name: "+ name );
      System.out.println("Foo: " + foo );
      System.out.println("\n");
   }
}


class Main {
    public static void main(String[] args) {
        MyDataClass myDataClassHasNoName = new MyDataClass("12345","BlaBla");
        MyDataClass myDataClassHasName = new MyDataClass("12346","BlaBla","Name");

        MyOtherDataClass myOtherDataClassHasName = new MyOtherDataClass();
        MyOtherDataClass myOtherDataClassHasNoName = new MyOtherDataClass();
        myOtherDataClassHasName.setName((myDataClassHasName.getName() != null) ? myDataClassHasName.getName() : "somethingelse");
        myOtherDataClassHasNoName.setName((myDataClassHasNoName.getName() != null) ? myDataClassHasNoName.getName() : "somethingelse");
        
        myOtherDataClassHasName.printIt();
        myOtherDataClassHasNoName.printIt();
        
    }
}

这是一个链接on mycompiler

【讨论】:

  • 感谢回答,但我有 100 个字段要设置。我真的应该将三元运算符放在我必须设置的 100 个字段中吗?
  • 没关系。我发现我在 myDataClass.getBirthDate() 上使用了“.toString()”。所以它抛出空指针。因为数据库中的birthDate 为空。对不起,这是我的愚蠢。谢谢你的回答。我使用三元运算符来验证它,然后执行 .toString().
猜你喜欢
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多