/**
* Sofar.java,这是个测试类
* @author Sunny
* Intention:本代码主要是演示单例模式的应用及java反射机制的练习
* 主要加载了两个类Sofar.java和Sofar2.java
*
* ideal outcome: toString返回对象自身
* 发现first的信息
* 发现second的信息
* 发现third的信息
* 找到第1个非String类型的变量
*
* Bug: 已标识
*
* 完成日期:2007年8月5号 */
import java.lang.reflect.*;public class Sofar {
private static final String Sofar2 = null; String num; public Sofar(String num) {
this.num = num;
} public String toString() {
return num + "返回对象自身";// 返回此对象本身 } public static void main(String[] args) {
int i = 0;
Sofar t = new Sofar("toString");
System.out.println(t); try {
Class c = Class.forName("tata.Sofar2");
Field[] fields = c.getDeclaredFields();//取得声明的域成员代表对象
for (Field field : fields) { String m = field.getName();//显示域成员名称 if ((field.getType().getName()).equals("java.lang.String")//Sofar2声明的域成员类型为String且不为空
&& !m.equals("")) { System.out.println("发现" + tata.Sofar2.getone(m));//调用Sofar2的getone()方法,传递的为String类型的m } else { System.out.println("找到第" + ++i + "个非String类型"); } }
} catch (ClassNotFoundException e) { System.out.println("找不到指定的类!"); } }
}/***********************************************************************
*************************************************************************
*Sofar2.java
************************************************************************
*/
import java.util.*;public class Sofar2 {
public static final String first="first的信息";
public static final String Second="second的信息";
public static final String Third="third的信息";
private static Map<String,String> map;
//单例模式的应用
public static Map getonereg(){
if(map==null){
Map<String,String> map = new HashMap<String,String>();
declareone();
}
return map ;
}
private static final void declareone(){
demo(first,"first");
demo(Second,"second");
demo(Third,"third");
}
private final static void demo(String value,String key){//注意这里的顺序
try{
map.put(key,value);//代码的问题出在这里,异常处理是自己加的
}
catch(NullPointerException e){
System.out.println(e);
}
}
public static Object getone(String key){
try{
return getonereg().get(key);//这里也抛出异常
}
catch(NullPointerException e){
System.out.println(e);
return "抛出异常";
}
}
}
就算是静态对象,也需要对象实例啊
Map<String,String> map = new HashMap<String,String>();
declareone();
}你这里去定义一个新的MAP干吗...这样:
if(map==null){
map = new HashMap<String,String>();
declareone();
}
外面已经定义了个全局变量了为啥在这里面再这样声明一个呢?外面那个map始终都是空的这也难怪要报空指针错误了!改成:map = new HashMap<String,String>();另外如果你继续调试你会发现:只能发现first的信息以后得到的都是null!自己调试发现一下原因吧,为什么找不到second 和third?问题在declareone()里面,自己好好想想。还有一点就是一般来说定义成final的变量都是大写的,这是一个习惯问题。
再就是在就是你的回复: “谢谢你的回答,单例模式返回一个实例.请调试,问题不出在那里 。”个人觉得这样的回答不太礼貌,别人没有义务给你去这样调试的,摆一大堆程序在这里让人去调试一般是行不通的,还是要自己学会分析异常哟。
就废话这么多了,希望能对你有所帮助。
public static final String second="second的信息";
public static final String third="third的信息";if(map==null){
map = new HashMap<String,String>();
declareone();
}private static final void declareone(){
demo(first,"first");
demo(Second,"second");
demo(Third,"third");}
demo(first,"first");
demo(second,"second");
demo(third,"third");}