/** * 书本:《Thinking In Java》 * 功能:捕获一个异常之后抛出另外一个异常,并且希望吧原始的信息保存下来,这个被称为异常链 * 文件:DynamicFields.java * 时间:2015年4月9日16:24:44 * 作者:cutter_point */ package Lesson12_error_handling_with_exceptions; import static net.mindview.util.Print.*; class DynamicFieldsException extends Exception {} public class DynamicFields { private Object[][] fields; //这里是二维数组,在第二维里面只存两个对象,第一个表示字段的标识符,第二个表示任意的一个字段值 /** * 构造函数,初始化fields * @param int initialSize 第一个[]的个数 * @author cutter_point */ public DynamicFields(int initialSize) { fields = new Object[initialSize][2]; //这里是二维数组,在第二维里面只存两个对象,第一个表示字段的标识符,第二个表示任意的一个字段值 //首先把里面的值全都初始化为null for(int i = 0; i < initialSize; ++i) { fields[i] = new Object[]{null, null }; } } /** * 吧这个数组的第[0][]和[1][]两个转化为String类型返回 * @return String * @author cutter_point */ public String toString() { StringBuffer result = new StringBuffer(); //类似String但是有一些String没有的功能,比如下面的额append for(Object[] obj : fields) { result.append(obj[0]); //在String的后面添加相应的字符串 result.append(" : "); result.append(obj[1]); result.append("\n"); } return result.toString(); } /** * 查找是否与字段标识符相对应的字段id * @param String id 字段的标识符 * @return int * @author cutter_point */ private int hasField(String id) { for(int i = 0; i < fields.length; ++i) { if(id.equals(fields[i][0])) { //如果寻找到了 return i; //返回相应的序列号 } } //如果没有找到 return -1; } /** * 查找是否与字段标识符相对应的字段id,如果没有找到,那么抛出异常 * @param String id 字段的标识符 * @return int * @throws NoSuchFieldException * @author cutter_point */ private int getFieldNumber(String id) throws NoSuchFieldException { int fieldNum = this.hasField(id); if(fieldNum == -1) //如果找不到的话,那么久抛出异常 throw new NoSuchFieldException(); return fieldNum; } /** * 为数组添加一个新的标识字段 * @param String id 字段的标识符 * @return int * @author cutter_point */ private int makeField(String id) { for(int i = 0; i < fields.length; ++i) { //判断当前数组的一对对象是否是为空 if(fields[i][0] == null) { //如果为空的话,那么添加一个标识id fields[i][0] = id; return i; //返回当前的位置 } } //如果一轮照下来,发现数组满了,那么我们就要给他创建一些空间 Object[][] tmp = new Object[fields.length + 1][2]; //加一个... for(int i = 0; i < fields.length; ++i) //吧原来的数组的对象移动到新的来 tmp[i] = fields[i]; for(int i = fields.length; i < tmp.length; ++i) //吧新空间创建好,并初始化为null tmp[i] = new Object[]{null, null }; fields = tmp; //创建好空间之后,调用自己,加进去 return this.makeField(id); } /** * 根据id取得相应的值 * @param String id 字段的标识符 * @return Object * @throws NoSuchFieldException * @author cutter_point */ public Object getField(String id) throws NoSuchFieldException { return fields[this.getFieldNumber(id)][1]; } /** * 设置里面的id和对应的对象 * @param String id Object value 字段的标识符 * @return Object * @throws DynamicFieldsException * @author cutter_point */ public Object setField(String id, Object value) throws DynamicFieldsException { if(value == null) { //如果我们要设置的值是空的,我们就连接起来异常链接 DynamicFieldsException dfe = new DynamicFieldsException(); dfe.initCause(new NullPointerException()); //抛出异常 throw dfe; } int fieldNumber = hasField(id); if(fieldNumber == -1) //如果没有对应的标识符,那么就创建一个 fieldNumber = makeField(id); Object result = null; try { result = getField(id); //取得旧值 } catch (NoSuchFieldException e) { throw new RuntimeException(); } fields[fieldNumber][1] = value; return result; } public static void main(String [] args) { DynamicFields df = new DynamicFields(3); print(df); try { df.setField("d", "A value for d"); df.setField("number", 47); df.setField("number2", 48); print(df); df.setField("d", "A new value for d"); df.setField("number3", 11); print("df: " + df); print("df.getField(\"d\") : " + df.getField("d")); Object field = df.setField("d", null); // Exception } catch(NoSuchFieldException e) { } catch (DynamicFieldsException e) { e.printStackTrace(); } } }
输出:
null : null
null : null
null : null
obj1
d : A value for d
number : 47
number2 : 48
obj1
df: d : A new value for d
number : 47
number2 : 48
number3 : 11
obj1
df.getField("d") : A new value for d obj1
Lesson12_error_handling_with_exceptions.DynamicFieldsException
at Lesson12_error_handling_with_exceptions.DynamicFields.setField(DynamicFields.java:144)
at Lesson12_error_handling_with_exceptions.DynamicFields.main(DynamicFields.java:184)
Caused by: java.lang.NullPointerException
at Lesson12_error_handling_with_exceptions.DynamicFields.setField(DynamicFields.java:145)
... 1 more
【ThinkingInJava】24、捕获一个异常之后抛出另外一个异常,并且希望吧原始的信息保存下来
原文地址:http://blog.csdn.net/cutter_point/article/details/45481983