2011-12-07 11 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; 

それを宣言していますが、ここでそれを使用する場合、それはあなたのNullPointerExceptionを与え、まだnullです。あなたは

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

前にこれを行う場合は

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

それが正常に実行する必要があります。

+0

それはもうnullを返さないクールです...今どこに接続con = nullと言う行;私はcon.setAutoCommit(false)を実行します。 ここにあるものは、前に行にヌルを設定しているので、nullを返しています。私がいなければ、それは初期化されていないと言います。とにかく出かける? –

+0

duffymoはcon問題の解決法を提供します:) – Averroes

+0

はい、ありがとうございました。 –

2

をあなたは何にもmapを初期化することはありません、次のコードです従ってそれはnullです。

static TreeMap<String, Integer> map = new TreeMap<String, Integer>(); 
3
あなたは「マップ」を初期化でした

:あなたはそれを宣言するときは、ライン2上のインスタンスのためのように、どこかに有効なTreeMap<String, Integer>を割り当てるために使用する必要がありますか?私にはヌルに見えます。

変更この行:

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

あなたはこのことを宣言し、これをnullに設定していますが、それを使用する場所を、私は表示されません。

PreparedStatement insertMap = null; 

あなたが先にここでより多くの心痛を持っている:あなたは、ドライバ・マネージャから接続を取得した後にまでダウン

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

移動オートコミット。

マップをシリアル化してデータベースに挿入しますか?それは正規化されていません。正規化されたスキーマには、エントリごとの行があります。

私はあなたのコードを読むほど、意味が薄くなります。がんばろう。

+0

私はコードが乱雑ですが、代わりにこの目的のために良いと思われるテーブルのソリューションをテストした後のマップを知っています。私はこれを初めて試みているので、それはよさそうに見えないかもしれません。しかし、ありがとう:) –

+0

多分そのキャッシュメカニズムまたは状態を維持する方法としてシリアル化されている。 Fowlerのエンタープライズ・パターン・ブックを参照してください。 – Ilan

+0

十分に公正。良い点、イラン。営業は、それが正規化されていないことを認識する必要があります。その意味は、マップ内の個々の値を検索することができないことです。格納および検索は「すべてまたはなし」操作です。 – duffymo

1

変数マップは決して初期化されず、コンストラクタでのみ宣言されます。

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

あなただけちょうどあなたは、変数を初期化rを

0

あなたがマップオブジェクトを初期化した初期化できません接続con = null; 次に、con.setAutoCommit(false)を設定します。 そのためのオブジェクトを作成せずに、どのように自動コミットを設定できますか?

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

ことを確認マップを宣言していますが、宣言でlocalMapオブジェクトを初期化して、それが

static TreeMap<String, Integer> map=new HashMap<String,Integer>(); 
関連する問題