/**
 * 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 "抛出异常";
}
}
}

解决方案 »

  1.   

    你的Sofar2实例在哪里啊??
    就算是静态对象,也需要对象实例啊
      

  2.   

    if(map==null){
     Map<String,String> map = new HashMap<String,String>();
     declareone();
    }你这里去定义一个新的MAP干吗...这样:
    if(map==null){
     map = new HashMap<String,String>();
     declareone();
    }
      

  3.   

    你这个程序主要有几个错误的地方,最大的问题就是单例应用里面的那个Map<String,String> map = new HashMap<String,String>();
    外面已经定义了个全局变量了为啥在这里面再这样声明一个呢?外面那个map始终都是空的这也难怪要报空指针错误了!改成:map = new HashMap<String,String>();另外如果你继续调试你会发现:只能发现first的信息以后得到的都是null!自己调试发现一下原因吧,为什么找不到second 和third?问题在declareone()里面,自己好好想想。还有一点就是一般来说定义成final的变量都是大写的,这是一个习惯问题。
       再就是在就是你的回复: “谢谢你的回答,单例模式返回一个实例.请调试,问题不出在那里  。”个人觉得这样的回答不太礼貌,别人没有义务给你去这样调试的,摆一大堆程序在这里让人去调试一般是行不通的,还是要自己学会分析异常哟。
    就废话这么多了,希望能对你有所帮助。
      

  4.   

    Sofar2:
    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");}
      

  5.   

    private static final      void declareone(){
    demo(first,"first");
    demo(second,"second");
    demo(third,"third");}