毕业设计里一个设计查词频的小玩意,最后要把词和词频写到数据库里。词频用的是HASH MAP,最后得到的key是String的,value是Object的,但已经转化成int了:
            Integer l = (Integer)m.get(words[i]);
    int n = l.intValue();
但就是无论如何也写不进数据库,下面是连数据库部分的代码达人救我。。泪奔。。://**********************DataBase Segment****************
    
    
    
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    String dburl ="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\hamtable.mdb";
    Connection conn=DriverManager.getConnection(dburl);
    Statement stmt=conn.createStatement();
    for(i=0;i<words.length;i++)
    {
    String add = new String(words[i]);
    String add1 = add.toString();
    Integer l = (Integer)m.get(words[i]);
    int n = l.intValue();
    String query= "INSERT INTO ham" +
     "VALUES(" + "'"+add1+"',"+n+")";
    
    stmt.executeUpdate(query);
    System.out.println("Successfully add word:"+words[i]+"and its frequency:"+m.get(words[i]));
    }
    System.out.println("Add process succesfully finished,table view will list as follow:");
    ResultSet rs=stmt.executeQuery("select * from hamtable");
    while(rs.next()){
    System.out.println(rs.getInt(2)+"\t"+rs.getString(1)+"\t"+rs.getInt(3));
     }
     rs.close();
     stmt.close();
     conn.close();
//************************************************************* */


这是我统计词频部分的代码,请高手帮我分析下会不会是这段的问题? :
   String[] words = new String[stringlength];
       int i;
       i =0;

       File fileoutput = new File(FODER+outputfilename);
       PrintWriter out = new PrintWriter(fileoutput);
       
       File fileinput = new File(FODER+inputfilename);
    Reader reader= new FileReader(fileinput);
Scanner scanner = new Scanner(reader);
       
System.out.println("The length of array"+words.length);

while(scanner.hasNext()){
words[i]= scanner.next();
System.out.println("successfully read"+words[i]+i);
i++;};



Map m = new TreeMap();
    for(i=0; i<words.length;i++)
    {   String str = new String(words[i]+"");
     //String str= words[i];
     Integer freq=(Integer)m.get(str);
     /* To two lines above, I met a very streng problem,
      *  If I just use :
      *  Integer freq =(Integer)m.get(str);
      *  or
      *  String str= new String(words[i]);
      *  Integer freq = (Integer)m.get(str);
      *  or
      *  String str = words[i];
      *  Integer freq = (Integer)m.get(str);
      *  
      *  IDE will throw 
      *  java.lang.NullPointerException
      *  
      *  But I just add A "" beside words[i], it'll work
      *  I don't know why so far.
      *  @date:12/4/2008
      */
    
    
    
     System.out.println("word:"+words[i]+"'s word freq is processing, plz wait patiently.");
    // m.get(Object object) returns a value of key: words[j], and make freq to point its address
if(freq == null)
{
freq = new Integer(1);
}else
{
freq = new Integer(freq.intValue()+1);
}
m.put(str, freq);
// put words freq into map.
    }
    System.out.println(m.size()+"distinct words detected.");
    System.out.println(m);
//**********************************************************************************
其中中间那一段长长的注释也是一个让我百思不得其解的问题,本来我觉得没有问题的,类型也转化了,可就是在RUN-TIME抛出 java.lang.NullPointerException,可是我在后面加了一个" "就好了高手能顺带帮我解答了当然最好。感激不尽。

解决方案 »

  1.   

    就说明words数组有元素是null 仔细查查吧
      

  2.   

    你的words[]是String数组,而你没有对此数组初始化,因为String是引用类型,所以数组里的元素为Null,一旦用到words[i],就是数组里的元素,肯定会报空指针异常了
    而你在后面加上空串"",那么它就不是空了,也就不会报空指针异常了
      

  3.   

    Map m = new TreeMap(); 
        for(i=0; i <words.length;i++) 
        {   String str = new String(words[i]+""); // 你说的加""是指这里吗?还有,把异常信息完整的拷过来吗?
      

  4.   

    while(scanner.hasNext()){ 
    words[i]= scanner.next(); 
    System.out.println("successfully read"+words[i]+i); 
    i++;}; 这块代码执行的时候 输出的words[i]里有没有值??
      

  5.   

    空,null,简单理解就是啥都没有,一旦调用它的方法就报空指针异常了
    null + "" 结果就是"null",调用此字符串当然不会出现空指针异常了
      

  6.   

    第二个问题已经解决,多谢楼上各位帮忙,原来是我在定义这个数组的数量的时候多定义了几个,然后导致读出NULLPOINTEREXCETION.
      

  7.   

    保证String 初始化
    确定你写入库之前保证所传入值是否为空或者只是""