Отражение ... NPE при получении значения поля - PullRequest
0 голосов
/ 07 июня 2019

У меня есть класс 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

Ответы [ 3 ]

0 голосов
/ 07 июня 2019

Редактировать: я заменяю ответ, поскольку вы, кажется, что-то выяснили, поэтому я все еще не уверен, что это действительно было проблемой.

Исходя из вашего ответа, вашей реальной проблемой может быть то, что вы разрешаетезначение 'null' для userId, адреса электронной почты и / или пароля.В этом случае все ваши потребности в коде - это не пустые проверки.

Ваш ответ указывает в направлении, которое теперь вместо того, чтобы иметь нулевое значение для проверки, вы просто проверяете String "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()) { 
0 голосов
/ 08 июня 2019

хорошо, NPE, который я получил, потому что я оборачивал объект Field в String, что кажется неправильным способом: String fnameStr = (String) fnameField.get (theClassObj); // NPE вызвал здесь

правильно обернуть: String fnameStr = String.valueOf (fnameField.get (theClassObj));

NPE теперь нет. Благодарю .

0 голосов
/ 07 июня 2019

Согласно строке комментария, вы говорите, что 'fnameField' является нулевым.

Это невозможно. Потому что "fnameField" не может быть нулевым. Следующее утверждение даст вам либо Field объект, либо NoSuchFieldException.

Field fnameField = theClass.getDeclaredField("fname");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...