反射...获得领域价值时的NPE

时间:2019-06-07 11:09:29

标签: java spring reflection

我有这个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 .

  }

}

显然,由于服务类没有main方法,因此尚未实例化“ theClassObj”。 我的错误是什么?在这种情况下如何获取实例?

我尝试将实例从服务类构造函数中放置。无法正常工作。

  java.lang.NullPointerException: null

3 个答案:

答案 0 :(得分:0)

根据注释行,您说的“ fnameField”为空。

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

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

答案 1 :(得分:0)

编辑: 您似乎已经找到答案后,我便替换了答案,所以我仍然不确定这确实是问题所在。

根据您的回答,您的真正问题可能是您允许userId,电子邮件和/或密码的值为“ 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()) { 

答案 2 :(得分:0)

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

正确包装: 字符串fnameStr = String.valueOf(fnameField.get(theClassObj));

NPE现在不见了。 谢谢 。