/**
* 书本:《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