Проблема MAP с базой данных JAVA и Sqlite - PullRequest
0 голосов
/ 21 апреля 2011

У меня к вам другой вопрос: приведенный ниже код выполняет следующие действия:

  1. Для каждого файла в папке

  2. Откройте файл ипрочитайте его содержание

  3. Возьмите и разделите каждую строку на токены

  4. Сохраните каждый токен (слово) в hasMap

  5. Подготовить запрос к базе данных (Выбрать слова формы ...)

  6. Для каждого совпадения, найденного между токенами и словами, содержащимися в базе данных, введите 1,0, если true, в противном случае0.0;

В этот момент возникает проблема :

try{
    while (rs_mail.next()) {
        if(result_m.contains(rs_mail.getString("voc_w").toString()))  //HERE I GET THE ERROR! java.lang.NullPointerException
            out_final.print("1.0;"); 
        else
            out_final.print("0.0;"); 
    }//Close While
}       //Close TRY
finally{
    rs_mail.close();
    //result_m.clear();
    mail.clear(); //Clear MAP
}

Ниже полного кода :

String path ="C:/Users/.../file";
File currentDIR = new File("C:/Users/.../file");
File files_mail[]=currentDIR.listFiles();
String tmp_mail="";

// prepares the file tmpTraning.txt to receive value 1.0, 0.0 obtained by comparison with database
PrintWriter out_final=null;
File ff=new File("C:/Users/.../tmpTraning.txt");

//Seach for File in DIR
for( File fX : files_mail ){
    String name_Filex = fX.getName();
    FileReader fr = null;
    BufferedReader fINx = null;
    String sx;
    //Create MAP 
    Map<String, Set<String>> mail = new HashMap<String, Set<String>>();
    //Open File
    try{
        Set<String> sq = new HashSet<String>();

        fr = new FileReader(path+"/"+name_Filex);
        fINx = new BufferedReader(fr);
        sx = fINx.readLine();

        //scroll the file
        while(sx != null) {
            StringTokenizer stq = new StringTokenizer(sx);
            while(stq.hasMoreTokens()) { //Extract form line the single word
                tmp_mail = stq.nextToken();

                sq.add(tmp_mail.toString().toLowerCase()); //add the word to sq -> HashMap
                mail.put(nome_Filex, sq);

            }// Close st.hasMoreTokens()

            sx = fINx.readLine();
        } //Close  while for scroll File
        fr.close(); //Close fileReader
        sq.clear(); //Clear HasSet

    } //Close il TRAY
    catch (FileNotFoundException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }

    Set<String> result_m = mail.get(name_Filex);
    ResultSet rs_mail = stmt.executeQuery("SELECT DISTINCT voc.words as voc_w FROM voc_words as voc");

    //Prepare for writing on the file " tmpTraning.txt " 
    OutputStreamWriter fout_f = new OutputStreamWriter(new FileOutputStream(ff,true));
    out_final = new PrintWriter(fout_f);

    try{
        while (rs_mail.next()) {
            //If the word extract from the database is in MAP (name_Filex) then print 1.0; on the file tmpTraning.txt
            if(result_m.contains(rs_mail.getString("voc_w").toString()))  //HERE I GET THE ERROR! java.lang.NullPointerException
                out_final.print("1.0;"); 
            else
                //else print 0.0;
                out_final.print("0.0;"); 
        }
    }       //Close TRY
    finally{
        rs_mail.close();
        //result_m.clear();
        mail.clear(); //Clear MAP
    }

    out_final.println(""); //Send CR char ASCII to set the coursor for the next file on the new line
    out_final.close();
    out_final.flush();
} // End SCAN DIR

Спасибо за любые советы!

Изменения кода - распечатайте содержимое result_m :

String path ="...";
File currentDIR = new File("...");
File files_mail[]=currentDIR.listFiles();
String tmp_mail="";

// prepares the file tmpTraning.txt to receive value 1.0, 0.0 obtained by comparison with database
PrintWriter out_final=null;
File ff=new File("...");

//Seach for File in DIR
for( File fX : currentDIR.listFiles() ){
    String name_Filex = fX.getName();

    String sx;
    //Create MAP 
    Map<String, Set<String>> mail = new HashMap<String, Set<String>>();
    //Open File
    try{
        Set<String> sq = new HashSet<String>();
        BufferedReader fINx = new BufferedReader(new FileReader(fX));
        sx = fINx.readLine();
        //scroll the file
        while(sx != null) {
            StringTokenizer stq = new StringTokenizer(sx);
            while(stq.hasMoreTokens()) { //Extract form line the single word
                tmp_mail = stq.nextToken();

                sq.add(tmp_mail.toString().toLowerCase()); //add the word to sq -> HashMap
                mail.put(name_Filex, sq);

            }// Close st.hasMoreTokens()

            sx = fINx.readLine();
        } //Close  while for scroll File
        fr.close(); //Close fileReader
        sq.clear(); //Clear HasSet

    } //Close il TRAY
    catch (FileNotFoundException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }

    /*
     * print the contents of  result_m
     */

    System.out.println("----- START FILE -----");
    Set<String> result_m = mail.get(name_Filex);
    Object[] toArray_m = mail.get(name_Filex).toArray();
    for (int ncc=0; ncc<result_m.size();ncc++){
        System.out.println(toArray_m[ncc]);
    }
    System.out.println("----- END  FILE  -----");


} // End SCAN DIR

если файл, считываемый программой, содержит пустые строки (без символа, без строки), сохраняется нулевое значение

Ответы [ 2 ]

0 голосов
/ 21 апреля 2011

К сожалению, с вашим кодом очень много проблем. Вот один , который сразу бросается мне в глаза.

Вы используете строковую манипуляцию для создания имени файла, которое вы передаете конструктору FileReader, несмотря на тот факт, что, насколько я вижу, открываемый файл - это файл, возвращенный из списка каталога. Это просто напрашивается на неприятности. Вместо этого лучше написать код, подобный этому ...

// Lots of things are omitted; this is just a sketch...
String path = "...";
File currentDIR = new File(path);
for (File fX : currentDIR.listFiles()) {
    try {
        BufferedReader fINx = new BufferedReader(new FileReader(fX));
        // ...
    } catch (IOException e) {
        e.printErrorStack();
    }
}

Однако у вас больше проблем, чем это. Например, использование sq.clear() имеет неприятный запах кода. Вы только что убрали ссылку на этот Set в Map; почему вы снова удаляете его содержимое? Переменная выпадает из области видимости; Вы можете просто пропустить этот код. Последствия нисходящего потока этого clear() состоят в том, что позднее result_m будет пустым набором, поэтому его тест contains всегда будет возвращать false. Я не могу опровергнуть, является ли это причиной вашего мошеннического ноля, но это должно быть неправильно исходя из того, что вы утверждаете, что хотите сделать.

Попробуйте преобразовать этот код в несколько небольших частей, которые легче проверить. В качестве первого варианта я предлагаю: закрытый метод для получения набора слов из файла (предоставляется в качестве аргумента), закрытый метод для сравнения набора слов с базой данных и метод, который объединяет эти два с некоторым циклом для достижения Ваша общая цель.

0 голосов
/ 21 апреля 2011

Есть ли веская причина, по которой вы вызываете toString() в строке? Если getString("voc_w") равно null, это приведет к вашему исключению.

Как указал Манджи в комментарии, это либо звонок, который я упомянул, либо result_m Set, которые null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...