zyf4005 2016-05-15 14:19 采纳率: 100%
浏览 1177
已采纳

这段代码怎么理解?请各位帮忙分析下

import static net.mindview.util.Print.*;

class DynamicFieldsException 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;  这里啥意思???
  }
// No empty fields. Add one:
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 DynamicFieldsException {
if(value == null) {
  // Most exceptions don't have a "cause" constructor.
  // In these cases you must use initCause(),
  // available in all Throwable subclasses.
  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); // Get old value
} catch(NoSuchFieldException e) {
  // Use constructor that takes "cause":
  throw new RuntimeException(e);
}
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) {
  e.printStackTrace(System.out);
} catch(DynamicFieldsException e) {
  e.printStackTrace(System.out);
}
 }
} /* Output:
null: null
null: null
null: null

d: A value for d
number: 47
number2: 48

df: d: A new value for d
number: 47
number2: 48
number3: 11

df.getField("d") : A new value for d
DynamicFieldsException
    at DynamicFields.setField(DynamicFields.java:64)
    at DynamicFields.main(DynamicFields.java:94)
Caused by: java.lang.NullPointerException
    at DynamicFields.setField(DynamicFields.java:66)
    ... 1 more
*///:~
 这是书上的例子,在书后写“如果客户端程序员调用getField()方法,那麼他就有责任处理这个可能抛出的NoSuchfieldException异常,但如果异常时从setField()方法抛出的,这种情况将视为编程错误,所以就是用接受cause参数的构造器把NoSuchFieldExcepiton异常转换为RuntimeException异常”
  先说我对RuntimeException的理解:如果是此类异常,应该是不用主动抛出,也不一定要catch。这理解对吧。
 而且为什么特意将NoSuchFieldExcepiton异常转换为RuntimeException异常我还是不是很懂。
 高手解释下,我的基础不行,不理解书上的话。  
  • 写回答

1条回答 默认 最新

  • 雨润泽林 博客专家认证 2016-05-16 06:08
    关注

    for(int i = 0; i < fields.length; i++)
    if(fields[i][0] == null) {
    fields[i][0] = id;
    return i; 这里啥意思???
    }
    如果fields[i][0] == null 就返回i 这里应该是找在fields 哪个为空;这个i就是返回下标数。
    2、 return makeField(id); 怎么又返回这个了???
    这是一种递归

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 matlab有限元法求解梁带有若干弹簧质量系统的固有频率
  • ¥15 找一个网络防御专家,外包的
  • ¥100 能不能让两张不同的图片md5值一样,(有尝)
  • ¥15 informer代码训练自己的数据集,改参数怎么改
  • ¥15 请看一下,学校实验要求,我需要具体代码
  • ¥50 pc微信3.6.0.18不能登陆 有偿解决问题
  • ¥20 MATLAB绘制两隐函数曲面的交线
  • ¥15 求TYPCE母转母转接头24PIN线路板图
  • ¥100 国外网络搭建,有偿交流
  • ¥15 高价求中通快递查询接口