Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使文件读取器不出现异常?_Java_Arraylist_Maps_Bufferedreader_Ioexception - Fatal编程技术网

Java 如何使文件读取器不出现异常?

Java 如何使文件读取器不出现异常?,java,arraylist,maps,bufferedreader,ioexception,Java,Arraylist,Maps,Bufferedreader,Ioexception,任务是读取文件中的每个单词,并使用地图计算每个单词的频率。然后使用给定的方法sortByValue(Map)组织它们。我对如何正确读取文件并为字符串键分配整数值感到困惑。帮忙 import java.util.*; import java.io.*; public class WordFrequency { public static void main(String []args) throws IOException { File textFile = new F

任务是读取文件中的每个单词,并使用地图计算每个单词的频率。然后使用给定的方法sortByValue(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;
}


 }
import java.util.*;
导入java.io.*;
公共类词频{
公共静态void main(字符串[]args)引发IOException{
File textFile=新文件(“book.txt”);
BufferedReader in=new BufferedReader(new FileReader(textFile));
TreeMap frequencyMap=新的TreeMap();
串电流线;
而((currentLine=in.readLine())!=null){
currentLine=currentLine.toLowerCase();
}
StringTokenizer tokenizer=新的StringTokenizer(当前行“\t\n\r\f.;:!?”;
while(tokenizer.hasMoreTokens()){
最后一个字符串currentWord=tokenizer.nextToken();整数频率=frequencyMap.get(currentWord);
如果(frequency==null){frequency=0;}frequencycmap.put(currentWord,frequency+1);
}
阵列列表图;
map=排序值(frequencyMap);
对于(int i=0;i<20;i++)
System.out.println(map.get(i));
}
//按升序对地图及其值进行排序
公共静态ArrayListsortByValue(映射)
{
ArrayLista=新的ArrayList(Map.entrySet());
//通过提供我自己的比较器进行排序
Collections.sort(一个新的比较器()
{
公共整数比较(对象o1、对象o2)
{
Map.Entry e1=(Map.Entry)o1;
Map.Entry e2=(Map.Entry)o2;
return((compariable)e1.getValue()).comparieto(e2.getValue());
}
}) ;
返回a;
}
}
例外情况是

  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)
线程“main”java.lang.NullPointerException中的异常 位于java.util.StringTokenizer。(未知源) 位于java.util.StringTokenizer。(未知源) 位于WordFrequency.main(WordFrequency.java:20)
查看
while((currentLine=in.readLine())!=null){

当此循环退出时,
currentline
null
,这是循环的要求

您应该考虑的是在<代码>中移动<代码> CurrrayLoe<代码>,同时使用Road读取文件…

例如

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);
     }

 }
问题在于:

 while ((currentLine = in.readLine()) != null) {
     currentLine = currentLine.toLowerCase();
 }
基本上只需遍历文件直到结束。然后null保存在currentLine中,并使用null-->NullPointerException调用标记器

添加新变量:

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

然后对标记器使用
text

只需添加另一个字符串,在其变为null之前获取
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;
    }


}
package org.fuzzyananalysis.demo;
导入java.util.*;
导入java.io.*;
公共类词频{
公共静态void main(字符串[]args)引发IOException{
File textFile=新文件(“book.txt”);
BufferedReader in=new BufferedReader(new FileReader(textFile));
TreeMap frequencyMap=新的TreeMap();
串电流线;
字符串entireText=“”;
而((currentLine=in.readLine())!=null){
currentLine=currentLine.toLowerCase();
entireText+=当前行;
}
StringTokenizer tokenizer=新的StringTokenizer(entireText,“\t\n\r\f,;:!?”;
while(tokenizer.hasMoreTokens()){
最后一个字符串currentWord=tokenizer.nextToken();整数频率=frequencyMap.get(currentWord);
如果(frequency==null){frequency=0;}frequencycmap.put(currentWord,frequency+1);
}
阵列列表图;
map=排序值(frequencyMap);
对于(int i=0;i<20;i++)
System.out.println(map.get(i));
}
//按升序对地图及其值进行排序
公共静态ArrayListsortByValue(映射)
{
ArrayLista=新的ArrayList(Map.entrySet());
//通过提供我自己的比较器进行排序
Collections.sort(一个新的比较器()
{
公共整数比较(对象o1、对象o2)
{
Map.Entry e1=(Map.Entry)o1;
Map.Entry e2=(Map.Entry)o2;
return((compariable)e1.getValue()).comparieto(e2.getValue());
}
}) ;
返回a;
}
}

排除了异常,但由于某些原因,现在它没有输出任何内容。有什么想法吗?对我来说似乎很好。您是否尝试过在读完文件后输出
频率贴图的大小。作业的一部分是打印20个最频繁和最不频繁的单词。我尝试过对每个单词使用a循环,但Map.Entry到Object的类型不匹配。为什么不起作用?您可以尝试将
ArrayList Map;
更改为
ArrayList Map;
抱歉,代码确实输出了它,只是花了一段时间。但是当使用指定的分隔符读取文件时,它有时会将两个单词链接在一起,并且不允许我分隔引号marks.有没有办法解决这个问题?(该文件是一本福尔摩斯的书,因此代码编译需要一段时间)它消除了异常,但由于某种原因,现在它没有输出任何东西。有什么想法吗?请确保使用名为“book.txt”的文件将“book.txt”用作包含单词“this is a book ahha”的文件时,我得到了以下输出:a=1 ahha=1 book=1 is=1 this=1它消除了异常,但出于某种原因,现在它什么也不输出。有什么想法吗?