Test1.java
package com.test;import java.util.HashMap;public class Test1 {
 public static HashMap hm = new HashMap<String, Test2>();
 
 public synchronized static void add(String uid, Test2 t){
  hm.put(uid, t);
 }
 
 public static Test2 get(String uid){
  return (Test2)hm.get(uid);
 }
}Test2.java
package com.test;public class Test2 {
 public String str;
 public String getStr() {
  return str;
 }
 public void setStr(String str) {
  this.str = str;
 }
}Test3.java
package com.test;public class Test3 {
 
 public static void main(String args[]){
  Test2 t = new Test2();
  t.setStr("test");
  Test1.add("1", t);
  System.out.println("state changed");
 }
}Test5.java
package com.test;public class Test5 {
 public static void main(String args[]){
  Test2 t2 = Test1.get("1");
  System.out.println("str:"+t2.getStr());
 }
}我现在想做的是在Test3中修改Test2中str的值,然后把修改后的Test2保存到Test1中的hm中,然后在Test5中获取改变后的Test2,先运行Test3没问题,再运行Test5时报错,System.out.println("str:"+t2.getStr());这一句报空指针异常,检查了一下发现Test2为null,请问各位大神,有没有什么办法可以让我的这种想法实现呢? 就像是内存共享,一个类变量改变时我在另一个类中也能发现这种改变,只是java不能操作内存,所以不知道究竟该怎么做...

解决方案 »

  1.   


    说的具体点好吗?
    public static HashMap hm = new HashMap<String, Test2>();
    这个不是吗??
      

  2.   

    个人感觉行不通,原因如下:当运行test3的时候JVM加载一次Test1和Test2,当Test3运行结束后会将Test1和Test2都释放掉。所以运行Test5的时候又会重新加载Test1和Test2,因为是新加载的,所以只能是null。综上所述,个人认为此法不行。请各位大侠批评指正。谢谢
      

  3.   

    我现在想做的是在Test3中修改Test2中str的值,然后把修改后的Test2保存到Test1中的hm中,然后在Test5中获取改变后的Test2,先运行Test3没问题,再运行Test5时报错,System.out.println("str:"+t2.getStr());这一句报空指针异常,检查了一下发现Test2为null,请问各位大神,有没有什么办法可以让我的这种想法实现呢?
    有办法实现,只是你不应该用两个main方法去测试,写一个就可以了。
    你写两个main方法去测是不对的。
      

  4.   

    楼主的想法,是想先运行第一个程序,往类中写一些数据,然后用第二个程序来取?按我的理解,你的程序是行不通的,因为你在结束第一个程序运行时,里面的所有类声明和对象都被清空释放了,就是一切都是虚无了。这个时候第二个程序跑去取肯定返回NULL,因为不在同一个虚拟机和内存里面。当然,#4楼说把两个main变成一个,是可以的,但我认为不是楼主的意图。实现楼主的意图有两种方式:
    1.第一个程序在运行的时候,把数据保存到磁盘文件中,这样第二个程序就可以读了
    2.第一个程序写入数据之后,不能结束,而且还要开一个socket监听端口,然后第二个程序向这个监听端口发送数据请求,可以用RMI通信来做。就是搞服务端和客户端。楼主的明白?
      

  5.   


    非常感谢你的回答,你说的用一个main函数我试过了,行得通,但不是我的本意,还是很感谢你哈....