Java BufferedReader无明显原因返回Null

Java BufferedReader无明显原因返回Null,java,nullpointerexception,bufferedreader,fileinputstream,Java,Nullpointerexception,Bufferedreader,Fileinputstream,提前谢谢你的帮助。我对Java非常陌生,没有受过任何正式的Java教育。我正在制作一个Minecraft Bukkit服务器用于练习,并在创建时将标志位置记录到一个文件中。我试图创建一个布尔值,如果位置已经在文件中,则返回true;如果位置不在文件中,则返回false。我不能使用while循环,否则它会冻结服务器,所以我使用for循环。无论如何,BufferedReader返回的所有行都是null,我不知道为什么。我有一个整数,它使用工作正常的BufferedReader返回文件中的行数。我不明

提前谢谢你的帮助。我对Java非常陌生,没有受过任何正式的Java教育。我正在制作一个Minecraft Bukkit服务器用于练习,并在创建时将标志位置记录到一个文件中。我试图创建一个布尔值,如果位置已经在文件中,则返回true;如果位置不在文件中,则返回false。我不能使用while循环,否则它会冻结服务器,所以我使用for循环。无论如何,BufferedReader返回的所有行都是null,我不知道为什么。我有一个整数,它使用工作正常的BufferedReader返回文件中的行数。我不明白为什么它会返回带有布尔值的null。以下是布尔值:

代码块:

    private boolean isDuplicate(String in) throws IOException
    {
        File f = file;
        try {
            fr = new FileReader(f);
            br = new BufferedReader(fr);
        } catch (FileNotFoundException e1) {
            log(Level.WARNING, "File not found.");
        }
        String temp;
        in = in.substring(0,in.length() - 1);
        for(int i = 0; i < (countLines(f)); i++)
        {
            if((temp = br.readLine()) != null)
            {
                String s = temp;
                log(temp);
            }
        }
        return false;
    }
private boolean isDuplicate(字符串输入)引发IOException
{
文件f=文件;
试一试{
fr=新文件读取器(f);
br=新的缓冲读取器(fr);
}捕获(FileNotFoundException e1){
日志(Level.WARNING,“未找到文件”);
}
字符串温度;
in=in.substring(0,in.length()-1);
对于(int i=0;i<(countLines(f));i++)
{
如果((temp=br.readLine())!=null)
{
字符串s=温度;
日志(临时);
}
}
返回false;
}
下面是整数:

    private int countLines(File f){
        try {
            fr = new FileReader(f);
            br = new BufferedReader(fr);
        } catch (FileNotFoundException e1) {
            log(Level.WARNING, "File not found!");
        }

        for(int i = 0; i < 100000; i++)
        {
            try
            {
                if(br.readLine() == null)
                {
                    return i;
                }
            }
            catch (NullPointerException e)
            {
                return i;
            }
            catch (IOException e)
            {

            }
        }
        return 0;
    }
private int countLines(文件f){
试一试{
fr=新文件读取器(f);
br=新的缓冲读取器(fr);
}捕获(FileNotFoundException e1){
日志(Level.WARNING,“找不到文件!”);
}
对于(int i=0;i<100000;i++)
{
尝试
{
if(br.readLine()==null)
{
返回i;
}
}
捕获(NullPointerException e)
{
返回i;
}
捕获(IOE异常)
{
}
}
返回0;
}

显而易见的原因是您已经到达了文件的末尾。但是这个代码是胡说八道。您根本不需要预先计算行数,当然也不需要在循环中每次都计算行数,这就是您当前的代码所做的。目前你的处理是O(N2),这是灾难性的。只需调用
readLine()
,直到它返回
null:

while ((line = br.readLine()) != null)
{
    // ...
    log(line);
}

注意:您的
isDuplicate()
方法不可能做任何与其名称稍有相似的事情。

该代码存在很多问题(最明显的是:当您捕获到“FileNotFound”时,您应该返回并记录一个“致命的”-没有继续的意义)。 我还假设您的实际代码不是您显示的代码(它不会编译)

无论如何,下面是用Java读取文件的方法:

public boolean isDuplicate(String lookup, String filename) {
    try {
        BufferedReader reader = new BufferedReader(new FileReader(filename));
        String line;
        int lineNo = 0;
        while ((line = reader.readLine()) != null) {
            lineNo++;
            // best would be to use a regex to match against the line
            // however, the naive approach would be
            if (line.indexOf(lookup) != -1) {
                log.info(String.format"Lookup term %s found on line %d", lookup, lineNo);
                return true;
            }
        }
        log.info(String.format("Lookup term %s not found in %s", lookup, filename);
        return false;
    } catch (IOException e) {
        // log a fatal error and bail
        log.error(String.format("Could not read from %s [%s]", filename, e.getLocalizedMessage()));
        // here best practice would be to throw your own custom application ex
        throw new MyApplicationException(e);
    }
}

while
for
的行为基本相同;您的
while
从未“返回”的原因可能是您在
countlines()
方法中“耗尽”了流。

首先,您不需要countlines函数或使用它的for循环。您可以将if语句替换为

while((temp = br.readLine()) != null)

其次,countLines正在使用全局bufferedReader,并且可能已经读取完整个文件。此后,任何新的br.readLine()都将返回null。因此,当您从countlines函数返回并尝试执行br.readLine()时,您会得到一个空值。

如果您的
fr
br
是类变量(实际上,它们不应该),这就是为什么您在isDuplicate()中得到一个空值:您的countlines()有点“耗尽”br流(我在这里猜测,如果没有实际编译的代码,这有点困难)没有所谓的
O(N^2+N)
-那就是O(N^2);在任何情况下,
countlines()
在循环开始时只计算一次。但是,是的,你是对的:针对readLine()的测试返回null是正确的,谢谢大家的帮助,很抱歉在我的错误代码上浪费了你们的时间。