我有这个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
答案 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现在不见了。 谢谢 。