首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反思问题

反思问题
EN

Stack Overflow用户
提问于 2015-04-06 20:24:04
回答 1查看 88关注 0票数 0
代码语言:javascript
复制
/*
    throws me the next Exception 
    line 66 and 179 java.lang.newInstanceationException:Angajat at java.lang.class.newInstance(unknown source)
    at mySerializer.deserializare.Object(mySerializer_final).java:66
    at Main1.main(myserializer_final).java.179
    caused by java.lang.NoSuchMethodException:Angajat.(init)
    at java.lang.class.getConstructor0(unknown source)
    */

    import java.io.*;
    import java.util.*;
    import java.lang.reflect.*;
    class Angajat {
        public String nume;
        public int salariu;
        private int varsta;
        public Angajat(String nume, int salariu, int varsta)
        {
        this.nume=nume;
        this.salariu=salariu;
        this.varsta=varsta;
        }

        public String toString(){
        return this.nume+ " (" + this.salariu + ")";
        }
    }
    class MySerializer{
        public void serializareObiect(BufferedWriter buffer_out, Object object){
        try{
            Class c=object.getClass();
            buffer_out.write(c.getName()+"\n");
            //  preluarea si adaugarea intr-o listFields a field-urilor dintr-o anumita clasa

            ArrayList<Field> listFields = new ArrayList<Field>();
            Field[] field = c.getDeclaredFields();  //campuri declarate
            for (Field f1 : field) 
                {
                  f1.setAccessible(true);
                listFields.add(f1);
                }

            Field[] inherited_field = c.getFields(); //campuri publice/mostenite
                for (Field f2 : inherited_field) 
                {
                 f2.setAccessible(true);
                 listFields.add(f2);
                }


                //scrierea in fisier a campurilor unui obiect
             for (int i = 0; i < listFields.size(); i++) {

                Field writeField = listFields.get(i);

                if (writeField.get(object) != null)
                    buffer_out.write(writeField.get(object) + "\n");
                else if (writeField.get(object) == null)
                    buffer_out.write("null \n");
            }

            buffer_out.flush();
         }
         catch(Exception e){
         System.out.println("error");
         }

        }

        public Object deserializareObject(BufferedReader buffer_in) throws Exception{

            String name_of_class = buffer_in.readLine();

            Class  c = Class.forName(name_of_class);
            Object serialize_object = c.newInstance();

        //  preluarea si adaugarea intr-o listFields a field-urilor dintr-o anumita clasa

          List<Field> listFields = new ArrayList<Field>();

            Field[] field = c.getDeclaredFields(); //campuri declarate
            for (Field f1 : field) 
                {
                    f1.setAccessible(true);
                    listFields.add(f1);
                }


            Field[] inherited_field = c.getFields(); //campuri mostenite/publice
            for (Field f2 : inherited_field) 
                {
                  f2.setAccessible(true);
                    listFields.add(f2);
                }


            for (int i = 0; i < listFields.size(); i++)
                {
                    String class_name = listFields.get(i).getType().getName().toString();
                    String read_field = buffer_in.readLine();
                Field f;
                    class_name = conversieTipuri(class_name);
                     if (read_field.equals("null") == false) {
                if (class_name.equals("java.lang.Integer")){
                    f=listFields.get(i); //obtinem valoarea campului
                    f.set(serialize_object, Integer.parseInt(read_field)); //o setam la acea valoare!!(pentru a reface sirul de biti)
                    }
                else if (class_name.equals("java.lang.Long")){
                    f=listFields.get(i);
                    f.set(serialize_object, Long.parseLong(read_field));
                }
                else if (class_name.equals("java.lang.Short")){
                  f=listFields.get(i);
                    f.set(serialize_object, Short.parseShort(read_field));
                }
                else if (class_name.equals("java.lang.Character")){
                    f=listFields.get(i);
                    f.set(serialize_object, read_field.charAt(0));
                }
                else if (class_name.equals("java.lang.Float")){
                    f=listFields.get(i);
                    f.set(serialize_object, Float.parseFloat(read_field));
                }
                else if (class_name.equals("java.lang.Double")){
                    f=listFields.get(i);
                    f.set(serialize_object,Double.parseDouble(read_field));
                }else if (class_name.equals("java.lang.Boolean")){
                    f=listFields.get(i);
                    f.set(serialize_object,Boolean.parseBoolean(read_field));
                }
                else if (class_name.equals("java.lang.String")){
                    f=listFields.get(i);
                    f.set(serialize_object, read_field);
                }
                else if (class_name.equals("java.lang.Byte")){
                    f=listFields.get(i);
                    f.set(serialize_object, read_field);
                }
            } else
                listFields.get(i).set(serialize_object, null);

                }
                return serialize_object;
        }

        public String conversieTipuri(String class_name) {

            String name="";
            switch(class_name){
                case "int" :    name="java.lang.Integer";
                break;
                case "double":  name="java.lang.Double";
                break;
                case "float":   name="java.lang.Float";
                break;
                case "boolean": name="java.lang.Boolean";
                break;
                case "char":    name="java.lang.Character";
                break;
                case "byte":    name="java.lang.Byte";
                break;
                case "long":    name="java.lang.Long";
                break;
                case "short":   name="java.lang.Short";
                break;
                default:        name=class_name;
                break;
                }
                return name;
          }
    }
    class Main1{
        public static void main(String args[]){
        try{
        Angajat ang=new Angajat("Adi Vaduva", 20000, 21);
        FileWriter f=new FileWriter("angajati1.ser");
        BufferedWriter fos=new BufferedWriter(f);
        //  BufferedWriter fos=new BufferedWriter(new FileWriter("angajati1.ser"));
        //  ObjectOutputStream out=new ObjectOutputStream(fos);
        //out.writeObject(ang);
        MySerializer ms=new MySerializer();
        ms.serializareObiect(fos, ang);
        //  BufferedReader fis=new BufferedReader(new FileReader("angajati1.ser"));
        //ObjectInputStream in=new ObjectInputStream(fis);
        f.close();
        FileReader f1=new FileReader("angajati1.ser");
        BufferedReader fis=new BufferedReader(f1);
        ms.deserializareObject(fis);
        f1.close();
        }catch(IOException e){
            System.out.println("eroare!");
        }

           catch(NoSuchMethodException e){
            e.printStackTrace();    }
        catch(Exception e){
        e.printStackTrace();
        }
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2015-04-06 20:28:56

问题是你的类Angajat没有一个不带参数的构造函数。

要么添加一个不带参数的构造函数给类Angajat,要么查找带三个参数的构造函数并调用它,而不是调用c.newInstance();

代码语言:javascript
复制
class Angajat {
    // ...

    // Constructor that takes no arguments
    public Angajat() {
    }

    // Constructor that takes three arguments
    public Angajat(String nume, int salariu, int varsta) {
        // ...
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29471273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档