【问题标题】:How can I get the file reader to not have the exception?如何让文件阅读器没有异常?
【发布时间】:2013-12-08 01:17:40
【问题描述】:

作业是读取文件的每个单词,并使用map统计每个单词出现的频率。然后使用给定的方法 sortByValue(Map map) 组织它们。我对如何让文件正确读取并将整数值分配给字符串键感到困惑。帮忙?

 import java.util.*;
 import java.io.*;
 public class WordFrequency {
     public static void main(String []args) throws IOException {

     File textFile = new File("book.txt"); 
     BufferedReader in = new BufferedReader(new FileReader(textFile));
     TreeMap<String, Integer> frequencyMap = new TreeMap<String, Integer>();
     String currentLine; 
     while ((currentLine = in.readLine()) != null) {
         currentLine = currentLine.toLowerCase();


     }

     StringTokenizer tokenizer = new StringTokenizer(currentLine, " \t\n\r\f.,;:!?'");

     while (tokenizer.hasMoreTokens()) { 
         final String currentWord = tokenizer.nextToken(); Integer frequency = frequencyMap.get(currentWord);
         if (frequency == null) { frequency = 0; } frequencyMap.put(currentWord,frequency + 1);

     }
     ArrayList map;
     map = sortByValue(frequencyMap);

     for(int i= 0; i < 20; i++)
         System.out.println(map.get(i));

     }

// Sort a map with its values in ascending order
public static ArrayList < Map . Entry > sortByValue ( Map map )
{
ArrayList < Map . Entry > a = new ArrayList ( map . entrySet () );
// sort by providing my own comparator
Collections . sort (a , new Comparator ()
{
public int compare ( Object o1 , Object o2 )
{
Map . Entry e1 = ( Map . Entry ) o1 ;
Map . Entry e2 = ( Map . Entry ) o2 ;
return (( Comparable ) e1 . getValue () ). compareTo ( e2 . getValue () ) ;
}
}) ;
return a;
}


 }

IOException 是

  Exception in thread "main" java.lang.NullPointerException
at java.util.StringTokenizer.<init>(Unknown Source)
at java.util.StringTokenizer.<init>(Unknown Source)
at WordFrequency.main(WordFrequency.java:20)

【问题讨论】:

    标签: java arraylist maps bufferedreader ioexception


    【解决方案1】:

    看看while ((currentLine = in.readLine()) != null) {

    当这个循环退出时,currrentLine 将是null,这是循环的要求。

    你应该考虑做的是在你用来读取文件的while循环中移动currentLine的处理......

    例如...

    while ((currentLine = in.readLine()) != null) {
         currentLine = currentLine.toLowerCase();
         StringTokenizer tokenizer = new StringTokenizer(currentLine, " \t\n\r\f.,;:!?'");
    
         while (tokenizer.hasMoreTokens()) { 
             final String currentWord = tokenizer.nextToken(); 
             Integer frequency = frequencyMap.get(currentWord);
             if (frequency == null) { 
                 frequency = 0; 
             } 
             frequencyMap.put(currentWord,frequency + 1);
         }
    
     }
    

    【讨论】:

    • 这摆脱了异常,但由于某种原因现在它没有输出任何东西。有什么想法吗?
    • 对我来说似乎工作得很好。你有没有试过在读完文件后输出frequencyMap的大小
    • 部分任务是打印20个最频繁和最不频繁的单词。我尝试对每个循环使用 a,但 Map.Entry 到 Object 的类型不匹配。为什么这不起作用?
    • 你可以试试把ArrayList map;改成ArrayList&lt;Map.Entry&gt; map;
    • 对不起,代码确实输出了,只是花了一点时间。但是当使用指定的分隔符读取文件时,它有时会将两个单词链接在一起,并且它不允许我分隔引号。有任何解决这个问题的方法吗? (该文件是一本福尔摩斯的书,所以代码需要一些时间来编译)
    【解决方案2】:

    问题出在这里:

     while ((currentLine = in.readLine()) != null) {
         currentLine = currentLine.toLowerCase();
     }
    

    您基本上只是浏览文件直到结束。然后将 null 保存在 currentLine 中,然后使用 null 调用 Tokenizer ---> NullPointerException。

    添加一个新变量:

     String text = "";
     while ((currentLine = in.readLine()) != null) {
         text += currentLine.toLowerCase();
     }
    

    然后将text 用于标记器。

    【讨论】:

    • 这摆脱了异常,但由于某种原因现在它没有输出任何东西。有什么想法吗?
    【解决方案3】:

    在它变为空之前添加另一个字符串以获取currentLine,例如请参阅下面的entireText

    package org.fuzzyanalysis.demo;
    
    
    import java.util.*;
    import java.io.*;
    
    public class WordFrequency {
    
        public static void main(String []args) throws IOException {
    
             File textFile = new File("book.txt"); 
             BufferedReader in = new BufferedReader(new FileReader(textFile));
             TreeMap<String, Integer> frequencyMap = new TreeMap<String, Integer>();
             String currentLine; 
             String entireText = "";
             while ((currentLine = in.readLine()) != null) {
    
                 currentLine = currentLine.toLowerCase();            
                 entireText += currentLine;
    
             }
    
             StringTokenizer tokenizer = new StringTokenizer(entireText, " \t\n\r\f.,;:!?'");
    
             while (tokenizer.hasMoreTokens()) { 
                 final String currentWord = tokenizer.nextToken(); Integer frequency = frequencyMap.get(currentWord);
                 if (frequency == null) { frequency = 0; } frequencyMap.put(currentWord,frequency + 1);
    
             }
             ArrayList map;
             map = sortByValue(frequencyMap);
    
             for(int i= 0; i < 20; i++)
                 System.out.println(map.get(i));
    
             }
    
        // Sort a map with its values in ascending order
        public static ArrayList < Map . Entry > sortByValue ( Map map )
        {
            ArrayList < Map . Entry > a = new ArrayList ( map . entrySet () );
            // sort by providing my own comparator
            Collections . sort (a , new Comparator ()
            {
                public int compare ( Object o1 , Object o2 )
                {
                    Map . Entry e1 = ( Map . Entry ) o1 ;
                    Map . Entry e2 = ( Map . Entry ) o2 ;
                    return (( Comparable ) e1 . getValue () ). compareTo ( e2 . getValue () ) ;
                }
            }) ;
        return a;
        }
    
    
    }
    

    【讨论】:

    • 这摆脱了异常,但由于某种原因现在它没有输出任何东西。有什么想法吗?
    • 确保在项目所在目录下使用名为“book.txt”的文件,然后在其中输入一些文字。当使用“book.txt”作为包含“这是一本书啊哈”字样的文件时,我得到以下输出:a=1 ahha=1 book=1 is=1 this=1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多