您的位置:首页 > 编程语言 > Java开发

【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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: