// exceptions/DynamicFields.java// (c)2017 MindView LLC: see Copyright.txt// We make no guarantees that this code is fit for any purpose.// Visit http://OnJava8.com for more book information.// A Class that dynamically adds fields to itself to// demonstrate exception chainingclass 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 };}@Overridepublic 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 ObjectgetField(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);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); // Exception} catch(NoSuchFieldException |DynamicFieldsException e) {e.printStackTrace(System.out);}}}/* Output:null: nullnull: nullnull: nulld: A value for dnumber: 47number2: 48df: d: A new value for dnumber: 47number2: 48number3: 11df.getField("d") : A new value for dDynamicFieldsExceptionatDynamicFields.setField(DynamicFields.java:65)at DynamicFields.main(DynamicFields.java:97)Caused by: java.lang.NullPointerExceptionatDynamicFields.setField(DynamicFields.java:67)... 1 more*/
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。