Javaの例外チェーン

異常なチェーンとは何ですか?

別の例外がスローされた後、例外をキャッチするには、あなたは例外チェーンと呼ばれ、元の例外情報を、保持したい:私たちはしばしばだと思います。

どのような方法は?

前JDK1.4では、プログラマーとして、私たちは生の例外を保存するための独自のコードを記述する必要があります。

さて、Throwableのコンストラクタのすべてのサブクラスにパラメータとして原因(原因)オブジェクトを受け入れることができます。

この原因は、元の例外が新しい例外に渡されることによってので、現在位置が作成し、新しい例外をスローしますが、例外が最初に発生した場所も例外チェーンを追跡するためにしても、元の例外を示すために使用されます。

私たちは皆のために証明するために、次のコードを使用します。

//异常链
class DynamicFieldException extends Exception{}
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};
	}
	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;
			}
		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++)
			tmp[i] = new Object[] {
					null,null
			};
		fields = tmp;
		// Recursive call with expanded fields:
		return makeField(id);
	}
	public Object
	getField(String id) throws NoSuchFieldException{
		return fields[getFieldNumber(id)][1];
	}
	public Object setField(String id,Object value)
	throws DynamicFieldException{
		if(value == null) {
			DynamicFieldException dfe = new DynamicFieldException();
			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(e);
		}
		fields[fieldNumber][1] = value;
		return result;
	}
	public static void main(String[] args) {
		DynamicFields df = new DynamicFields(3);
		System.out.println(df);
		try {
			df.setField("d", "A value for d");
			df.setField("Number",47);
			df.setField("Number2",48);
			System.out.println(df);
			df.setField("d", "A new value for d");
			df.setField("Number3", 11);
			System.out.println("df:"+df);
			System.out.println("df.getField(\"d\"):"+df.getField("d"));
			Object field = df.setField("d", null);
		}catch(NoSuchFieldException e) {
			e.printStackTrace(System.out);
		}catch(DynamicFieldException e) {
			e.printStackTrace(System.out);
		}
	}
}

 

結果は:

 

行使する私たち自身の能力により助長、コードを読んで、私たち自身!

私たちはあなたに感謝し、助けることができるように願っています!

おすすめ

転載: blog.csdn.net/qq_41026809/article/details/92002635