Страницы

Поиск по вопросам

среда, 15 апреля 2020 г.

java.lang.InstantiationException

#java #исключения

                    
Здравствуйте!
В данный момент пишу такое учебное задание:
На нашем компьютере есть файл (путь C:\User), в котором храниться такая информация:
int id 1
String name Vasya
int age 25
long salary 2500
Цель, написать такой вот метод,
public Object load (Class cl, int id), который бы сканировал нужный нам файл User,
и возвращал конкретный объект с указанным в параметрах id.

Написал такой код:
public class Main {
public static void main(String[] args) {

    ObjectMapper om = new ObjectMapper();

    try{
    System.out.println((om.load(User.class,1)).toString());
    } catch (Exception e){
        e.printStackTrace();
    }
}

}
public class User {
private int id;
private String name;
private int age;
private long salary;

public User(String name, int age, long salary) {
    this.id=0;
    this.name = name;
    this.age = age;
    this.salary = salary;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public long getSalary() {
    return salary;
}

public void setSalary(long salary) {
    this.salary = salary;
}

@Override
public String toString() {
    return "User{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", age=" + age +
            ", salary=" + salary +
            '}';
}

}
public class ObjectMapper {

public Object load(Class cl, int id) throws IllegalAccessException, InstantiationException,
IOException, NoSuchMethodException, InvocationTargetException {
    ArrayList lines = new ArrayList();   //Сроки файла
    Object obj = cl.newInstance(); //Создаем пустой объект класса User
    Field[] fields = cl.getDeclaredFields(); //Считываем поля

    Scanner sc = new Scanner(new File("C:\\" + cl.getSimpleName())); //Скан. файл
    String line;
    String[] setterNames = new String[fields.length];  //Создаем массив названий
"методов-сеттеров"
    String[] fieldParameters = new String[3]; //Массив слов, которые нах. в одной
строке (мы точно знаем, что слов в каждой строке 3: тип поля - имя поля - значение поля)
    String[] fieldValue = new String[fields.length]; //Массив значений каждого поля
(например, [0]1,[1]Vasya,[2]25,[3]2500)
    String[] fieldType = new String[fields.length];  //Массив типов каждого поля
(например, [0]"int",[1]"String",[2]"int",[3]"long")

    //Построчно сканируем содержимое файла и заносим в наш ArrayList
    while (sc.hasNextLine()) {
        line = sc.nextLine();
        lines.add(line);
    }

    for (int i = 0; i < lines.size(); i++) {    // Считываем каждую строку ArrayList-a и
        String idLine =  "int id " + id;
        if (lines.get(i).equals(idLine)); {  // сравниваем строки из ArrayList-a
со строкой, например "int id 1"
            int temp;
            for (temp = i; temp < i + fields.length; temp++) {
                fieldParameters = lines.get(temp).split(" "); // Дробим строку на 3 слова
                String methName = "set" + fieldParameters[1].toUpperCase().charAt(0)
+ fieldParameters[1].substring(1); // Создаем имя метода (например, setId)
                setterNames[temp - i] = methName; // Заносим имя метода в массив
                fieldType[temp - i] = fieldParameters[0]; // Заносим тип поля в массив
                fieldValue[temp - i] = fieldParameters[2];  // Заносим значение поля
в массив
            }
        }
    }

    //Заполняем наш, пока еще пустой Object obj значениями
    for (int i = 0; i < fields.length; i++) {
        // Значение нужно записать в соотв. ему типе, если поле "int", значит в поле
заносим значение типа int
        if (fieldType[i].equals("int")) {
            cl.getDeclaredMethod(setterNames[i]).invoke(obj, Integer.parseInt(fieldValue[i]));
        }
        if (fieldType[i].equals("long")) {
            cl.getDeclaredMethod(setterNames[i]).invoke(obj, Long.parseLong(fieldValue[i]));
        }
        if (fieldType[i].equals("String")) {
            cl.getDeclaredMethod(setterNames[i]).invoke(obj, fieldValue[i]);
        }
    }
    return obj;  // Возвращаем заполненный объект
}
}

К сожалению данный метод не работает, пока не могу понять почему.
Вылетает такая ошибка:
java.lang.InstantiationException: User
at java.lang.Class.newInstance0(Class.java:357)
at java.lang.Class.newInstance(Class.java:325)
at ObjectMapper.load(ObjectMapper.java:13)
    .......

Кто-то может объяснить, что делаю не так, и как надо сделать так, чтобы заработало ?    


Ответы

Ответ 1



Object obj = cl.newInstance(); //Создаем пустой объект класса User это значит что ожидается конструктор по умолчанию, которого у вас нет. Заведите конструктор класса User без параметров.

Комментариев нет:

Отправить комментарий