#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 { ArrayListlines = 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 без параметров.
Комментариев нет:
Отправить комментарий