1.e.fillInStackTrace()
用于重新记录栈况态。
2.一个样例。在代码中多用异常处理来解决问题。
class DynamicFieldsException extends Exception {
private static final long serialVersionUID = 1556367313428787951L;
}
public class ExceptionList {
private Object[][] fields;
public ExceptionList(int initialSize) {
fields = new Object[initialSize][2];
for (int i = 0; i < initialSize; i++) {
fields[i] = new Object[] { null, null };
}
}
public static void main(String[] args) {
ExceptionList df = new ExceptionList(3);
try {
df.setField("d","A value for d");
df.setField("d",null);
}catch(NullPointerException e) {
e.printStackTrace();
}catch(DynamicFieldsException e) {
e.printStackTrace();
}
}
private 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(DynamicFieldsException e) {
throw new RuntimeException(e);
}
fields[fieldNumber][1]=value;
return result;
}
private Object getField(String id) throws DynamicFieldsException {
for (int i=0;i<fields.length;i++) {
if(id.equals(fields[i][0])) {
return fields[i][1];
}
}
return fields[getFiledNumber(id)][1];
}
private int getFiledNumber(String id) throws DynamicFieldsException {
int fieldNum = hasField(id);
if (fieldNum == -1) {
throw new DynamicFieldsException();
}
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;
return makeField(id);
}
private int hasField(String id) {
for (int i=0; i<fields.length;i++) {
if (id.equals(fields[i][0])) {
return i;
}
}
return -1;
}
}