異常なチェーンとは何ですか?
別の例外がスローされた後、例外をキャッチするには、あなたは例外チェーンと呼ばれ、元の例外情報を、保持したい:私たちはしばしばだと思います。
どのような方法は?
前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);
}
}
}
結果は:
行使する私たち自身の能力により助長、コードを読んで、私たち自身!
私たちはあなたに感謝し、助けることができるように願っています!