• 异常链


    package t20211227;
    
    /**
     * @Author: DengJia
     * @Date: 2021/12/27 21:13
     * @Description:
     */
    
    public class DynamicFields {
        private Object[][] fields;
    
        public DynamicFields(int initialSize) {
            fields = new Object[initialSize][2];
            for (int i = 0; i < initialSize; i++) {
                fields[i] = new Object[]{null, null};
            }
        }
    
        @Override
        public String toString() {
            StringBuilder result = new StringBuilder();
            for (Object[] obj : fields) {
                result.append(obj[0]);
                result.append(" : ");
                result.append(obj[1]);
                result.append("\n");
            }
            return result.toString();
        }
    
        private int hasField(String id) {
            for (int i = 0; i < fields.length; i++) {
                if (id.equals(fields[i][0])) {
                    return i;
                }
            }
            return -1;
        }
    
        private int getFieldNumber(String id) throws NoSuchFieldException {
            int fieldNum = hasField(id);
            if (fieldNum == -1) {
                throw new NoSuchFieldException();
            }
            return fieldNum;
        }
    
        private int makeField(String id) {
            for (int i = 0; i < fields.length; i++) {
                if (fields[i][0] == null) {
                    fields[i][0] = id;
                    return i;
                }
            }
            // 没有空的field,需要新添加一个
            Object[][] tmp = new Object[fields.length + 1][2];
    //        for (int i = 0; i < fields.length; i++) {
    //            tmp[i] = fields[i];
    //        }
            System.arraycopy(fields, 0, tmp, 0, fields.length);
            for (int i = fields.length; i < tmp.length; i++) {
                tmp[i] = new Object[]{null, null};
            }
            fields = tmp;
            // 递归调用来实现增加字段
            return makeField(id);
        }
    
        public Object getFiled(String id) throws NoSuchFieldException {
            return fields[getFieldNumber(id)][1];
        }
    
        public Object setField(String id, Object value) throws DynamicFieldsException {
            if (value == null) {
                DynamicFieldsException dfe = new DynamicFieldsException();
                // 通过initCause方法来传入cause
                dfe.initCause(new NullPointerException());
                throw dfe;
            }
            int fieldNum = hasField(id);
            if (fieldNum == -1) {
                fieldNum = makeField(id);
            }
            Object result;
            try {
                result = getFiled(id); // 获取旧值
            } catch (NoSuchFieldException e) {
                // 调用构造器来传入cause
                throw new RuntimeException(e);
            }
            fields[fieldNum][1] = value;
            return result;
        }
    
        public static void main(String[] args) {
            DynamicFields df = new DynamicFields(3);
            System.out.println(df);
            try {
                df.setField("A", "djosimon.top");
                df.setField("n1", 17);
                df.setField("n2", 99);
                System.out.println(df);
                df.setField("A", "dengjia.top");
                df.setField("n3", 666);
                System.out.println(df);
                System.out.println("df.getFiled(\"A\") = " + df.getFiled("A"));
                Object field = df.setField("d", null); // Exception
            } catch (NoSuchFieldException | DynamicFieldsException e) {
                e.printStackTrace();
            }
        }
    }
    
    class DynamicFieldsException extends Exception {
    }
    
    null : null
    null : null
    null : null
    
    A : djosimon.top
    n1 : 17
    n2 : 99
    
    A : dengjia.top
    n1 : 17
    n2 : 99
    n3 : 666
    
    df.getFiled("A") = dengjia.top
    t20211227.DynamicFieldsException
    	at t20211227.DynamicFields.setField(DynamicFields.java:75)
    	at t20211227.DynamicFields.main(DynamicFields.java:107)
    Caused by: java.lang.NullPointerException
    	at t20211227.DynamicFields.setField(DynamicFields.java:77)
    	... 1 more
    
    DJOSIMON
  • 相关阅读:
    poi管道流的导入导出
    Mysql导入数据库的方法
    MySQL数据库指定字符集
    eclipse 的操作
    Mysql的操作
    第十周作业
    第九周作业
    第八周作业
    第七周作业
    第六周作业
  • 原文地址:https://www.cnblogs.com/DJOSIMON/p/15738150.html
Copyright © 2020-2023  润新知