【ThinkingInJava】24、捕获一个异常之后抛出另外一个异常,并且希望吧原始的信息保存下来
2015-05-04 15:50
501 查看
/** * 书本:《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
相关文章推荐
- java异常信息保存的一个简单方法
- java中怎么把原始目录下的文件。复制到另外一个目录中,并且文件名不改掉
- 无法捕获异常:Java关于在catch中抛出一个异常给外围函数却捕获不到该异常的思考
- 6.2判断一个数能否被3整除,如果不能整除就抛出一个异常,并让其调用方法来捕获,显示相应的处理信息
- 捕获Java线程池执行任务抛出的异常
- jni异常,c++抛出异常,java捕获
- Java中的异常处理:何时抛出异常,何时捕获异常?
- java异常的捕获与抛出原则
- java中如何靠着throw抛出一个异常来停止线程
- java中给出一个主线程如何捕获子线程异常的例子
- java中给出一个子线程如何捕获主线程异常的例子
- java异常的捕获与抛出原则
- 【学习笔记17】java面向对象-异常处理:捕获异常与抛出异常
- javaBUG处理,关于保存表单信息多了一个,逗号 。
- Java中的异常处理:何时抛出异常,何时捕获异常?
- java事务异常——Spring事务异常回滚,捕获异常不抛出就不会回滚
- Java中的异常处理:何时抛出异常,何时捕获异常,何时处理异常?
- 从数据库中读取信息时抛出异常java.sql.SQLException: Parameter index out of range (1 > number of parameter
- java里自己编写抛出异常的信息
- Java 中 手动抛出异常: throw new Exception("错误信息") 错误信息的获得