2011-12-07 34 views
0

不知道什么是错的......它应该工作,或者可能错过了某些东西?以下是代码:添加到地图时的Java异常

public class TestOracleMap implements java.io.Serializable{ 
static TreeMap<String, Integer> map; 
static TreeMap<String, Integer> localMap = new TreeMap<String, Integer>(); 

public static void StoreMapInDB(TreeMap<String, Integer> map) throws 
     IOException, FileNotFoundException{ 
    try { 
    PreparedStatement insertMap = null; 
    //String insertString = "INSERT INTO TESTMAP(ID, MPFIELD) VALUES (1, ?)"; 
    Connection con=null; 
    con.setAutoCommit(false); 
    Class.forName("oracle.jdbc.driver.OracleDriver"); 
    con=DriverManager.getConnection(
    "jdbc:oracle:thin:@oXXX", 
    "XXX", 
    "XXX"); 

    ByteArrayOutputStream bos = new ByteArrayOutputStream() ; 
    ObjectOutputStream out = new ObjectOutputStream(bos); 
    out = new ObjectOutputStream(bos) ; 
    out.writeObject(map); 
    out.close(); 

    byte[] buf = bos.toByteArray(); 
    PreparedStatement prepareStatement = con.prepareStatement("insert into 

    TESTMAP(ID,MAPFIELD)values(?,?)"); 
    prepareStatement.setLong(1, 1); 
    prepareStatement.setBinaryStream(2, new ByteArrayInputStream(buf), buf.length); 



// insertMap.executeUpdate(); 
    con.commit(); 
    } catch(Exception e){e.printStackTrace();} 
} 

public static void main(String[] args) 
{ 
    try{ 
    DateTime today = new DateTime(); 
    int x = 1; 
    map.put("Hello!", x); 
    StoreMapInDB(map); 
    }catch(IOException ioe){ 
     System.err.print(ioe); 
    } 
} 
} 

错误是在main方法的线路是:

map.put("Hello!", x); 

它给:

Exception in thread "main" java.lang.NullPointerException 
at core.smd.classes.TestOracleMap.main(TestOracleMap.java:61) 
Java Result: 1 
+0

你是否初始化“地图”?对我看起来是空的。 – duffymo

+0

你有没有初始化'地图'?我只看到localMap的初始化...... – Volker

回答

8

似乎你永远不会实例化map。在这里你将它声明

static TreeMap<String, Integer> map; 

但是当你在这里使用它,它仍然是null给你NullPointerException

map.put("Hello!", x); 

如果您之前

map = new TreeMap<String, Integer>(); 

做到这一点应该没有问题了。

+0

很酷,不会返回null ...现在它所在的行连接con = null;然后我做con.setAutoCommit(false); 这里的东西是它返回null,但很明显,因为我把它设置为null之前。如果我不,它说它没有被初始化。反正出去? –

+0

duffymo给你的解决方案的问题:) – Averroes

+0

是的,谢谢我现在试图..它确实解决了这个问题:) –

2

你永远不会初始化map任何东西,因此它是null。你需要一个有效的TreeMap<String, Integer>分配给它的地方,例如像第2行,当你把它声明,使用:

static TreeMap<String, Integer> map = new TreeMap<String, Integer>(); 
3

你是从哪里初始化“地图”?对我看起来是空的。

改变这一行:

static TreeMap<String, Integer> map = new TreeMap<String, Integer>(); 

您声明这一点,将其设置为空,但我没有看到你在哪里使用它。

PreparedStatement insertMap = null; 

你有更多的心痛领先位置:下

Connection con=null; 
    Class.forName("oracle.jdbc.driver.OracleDriver"); 
    con=DriverManager.getConnection(
    "jdbc:oracle:thin:@oXXX", 
    "XXX", 
    "XXX"); 
  con.setAutoCommit(false); 

移动自动提交,直到你从驱动程序管理器连接后。

你正在序列化映射到INSERT到数据库中?这是不正常的。规范化的模式每个条目都有一行。

我读的代码越多,意义越小。祝你好运。

+0

我知道代码很混乱,但测试表格解决方案之后的地图似乎更适合此目的。我第一次尝试这个,所以你看起来可能不太好。谢谢:) –

+0

也许它被序列化为缓存机制或作为维护状态的一种方式。请参阅Fowler的企业模式书,了解这样做的不同原因。 – Ilan

+0

够公平的。好点,宜兰。 OP只需要认识到它没有正常化。其含义是,他/她将无法搜索地图中的各个值。存储和检索是“全部或全部”操作。 – duffymo

1

变量映射从不初始化,只在构造函数中声明。

map = new TreeMap<String, Integer>(); 
1

你只申报图,而不是将其初始化

static TreeMap<String, Integer> map=new HashMap<String,Integer>(); 
0

你是初始化地图对象为你初始化在声明localMap对象只是检查

1
static TreeMap<String, Integer> map = new TreeMap<String, Integer>(); // <-- in your code, you're not constructing it 
static TreeMap<String, Integer> localMap = new TreeMap<String, Integer>(); 
1

你[R初始化变量连接con = null; 然后你设置con.setAutoCommit(false).. 没有创建对象,如何设置自动提交?