2011-12-07 63 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).. 沒有創建對象,如何設置自動提交?