反射..获取字段值时的 NPE



>我有这个POJO类:

  @Component
  public class ClassOne{
    public int  id;
    public String fname;
    public String lname;
    public String    code;
    super constructor
    fields constructor
    getters & setters
   }

我有这个服务类:

   @Service
   public  class ClassOneServiceImpl implements ClassOneService{
  public ClassOneServiceImpl{}
  @override
  public boolean addUser(String fname,String lname,String code){
    Class<?> theClass = 
    Class.forName("com.somepackage.ClassOne");
    Constructor<?> theClassConstructor = 
   theClass.getConstructor(String.class, String.class,String.class);
    ClassOne theClassObj = (ClassOne) 
   theClassConstructor.newInstance("fname","lname","code");
    Field fnameField = theClass.getDeclaredField("fname");
    Field lnameField = theClass.getDeclaredField("lname");
    Field codeField = theClass.getDeclaredField("code");
    System.out.println("Field name is " + 
    fnameField.getName());  //I get the Field's name
String fnameStr =(String) 
       fnameField.get(theClassObj);  //the NPE caused here 
String lnameStr =(String) 
       lnameField.get(theClassObj);

    System.out.println(fnameStr);  //here getting null
    ...here is the code to persist the form's field data .
  }
}

显然,"theClassObj"没有被实例化,因为服务类没有main方法......我的错误是什么以及如何在这种情况下获取实例?

我尝试从服务类构造函数中放置实例。没用。

  java.lang.NullPointerException: null

根据评论行,您说" fnameField "为空。

这是不可能的。因为"fnameField"不能为空。以下语句将为您提供Field对象或NoSuchFieldException

Field fnameField = theClass.getDeclaredField("fname");

好吧,我得到的NPE是因为我以似乎错误的方式将Field对象包装到字符串中:String fnameStr =(String( fnameField.get(theClassObj(; NPE在这里引起

要正确包装:String fnameStr =String.valueOf(fnameField.get(theClassObj((;

NPE现在消失了.谢谢。

编辑:我替换了答案,因为你似乎已经想通了一些东西,所以我仍然不确定这真的是问题所在。

根据您的答案,您的真正问题可能是您允许用户ID,电子邮件和/或密码的值为"null"。在这种情况下,您的代码需要的只是一些非空检查。

您的答案指向一个方向,即现在只需测试字符串"null",而不是要测试的 null 值。

useridString =(String) useridField.get(signupClassObj);
System.out.println(useridString);
emailString = (String)emailField.get(signupClassObj);
passwordString = (String)passwordField.get(signupClassObj);
... check if values are not null ...
if (!useridString.isEmpty() && !emailString.isEmpty() && !passwordString.isEmpty()) { 

最新更新