2011-12-07 14 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 = new TreeMap<String, Integer>(); 

하기 전에이 작업을 수행하는 경우

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

그것을 잘 실행해야합니다.

+0

더 이상 null을 반환하지 않는 것은 멋지다 ... 이제 connection con = null이라고하는 행; 그럼 내가 할 con.setAutoCommit (거짓); 여기에있는 것은 이전에 줄에 null을 설정했기 때문에 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

당신이지도 객체를 초기화 않았다 초기화하지 Connection 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>(); 
관련 문제