当前位置: 首页 > 面试题库 >

BufferedReader.ready()方法是否确保readLine()方法不返回NULL?

阎德业
2023-03-14
问题内容

我有这样的代码来使用读取文本文件BufferedReader

BufferedReader reader=null;
    try {
        reader = new BufferedReader(new FileReader("file1.txt"));

        while (reader.ready()) {
            final String line = reader.readLine();
            System.out.println("<"+line+">");
        } catch (..)
    {
        ...
    }

它可以正常工作,但是Findbugs报告警告:

NP_DEREFERENCE_OF_READLINE_VALUE:取消引用调用readLine()的结果,而不检查结果是否为null。如果没有更多的文本行要读取,则readLine()将返回null,并取消引用将生成一个null指针异常。

当我更改FileReader为时StringReader,即

BufferedReader reader=null;
    try {
        reader = new BufferedReader(new StringReader("ABCD"));

        while (reader.ready()) {
            final String line = reader.readLine();
            System.out.println("<"+line+">");
        } catch (..)
    {
        ...
    }

readLine方法返回null而该ready方法始终返回true-实际上这是一个无限循环。

这似乎即使返回readLine也可能返回。但是为什么行为对于不同的s会有所不同?null``ready``true``Reader

更新:

我确实知道读取文本文件的正常方法(就像Peter和Ali所说明的那样)。但是我从同事那里读了这段代码,意识到我不知道这种ready方法。然后,我阅读了JavaDoc,但听不懂block。然后我做了一个测试,并发布了这个问题。因此,提出此问题的更好方法可能是:

输入什么时候会阻塞?如何使用该ready方法(或为什么不使用它)?为什么这2
Readers(FileReaderStringReader)在ready方法上表现不同?


问题答案:

ready方法告诉我们Stream是否准备好被读取。

想象一下,您的流正在从网络套接字读取数据。在这种情况下,流可能尚未结束,因为套接字尚未关闭,但由于html" target="_blank">套接字的另一端还没有推送更多数据,因此它可能尚未为下一个数据块做好准备。

在上述情况下,除非远程端将其推送,否则我们将无法再读取任何数据,因此我们必须等待数据变为可用或套接字被关闭。ready()方法会告诉我们数据何时可用。



 类似资料:
  • 因此,作为家庭作业,我的任务是编写包含5种静态方法的代码。其中两人要求提供以下内容: “编写一个以整数X为参数的方法,如果X为偶数,则返回true;如果X为奇数,则返回false。” 和 “编写一个以正整数N为参数的方法,如果N是素数,则返回true,否则返回false。假设N 我不清楚我是否需要打印出正确或错误的方法。在我将println添加到方法调用之前,它们显然没有打印。所以我想我有两个问题

  • 文件: Authentication authenticate(Authentication Authentication)抛出AuthenticationException使用与AuthenticationManager相同的约定执行身份验证。参数:authentication-身份验证请求对象。返回:包含凭据的经过完全身份验证的对象。如果AuthenticationProvider无法支持传递

  • 问题内容: 我有一个对象,我想知道它的返回类型是否为。 我已经检查了Javadocs,并且有一个返回Class对象的方法。问题是,如果方法无效,他们不会说返回类型是什么。 谢谢! 问题答案: 快速样本:

  • 我对模型映射器进行了以下配置,以将用户类的实例转换为扩展getuserdto的实例。 在注释掉setReceivedExpense之前,我收到了这个错误: 在花费了一些时间并没有找到根本原因之后,我试图删除DTO中所有可疑的循环依赖项(我在GetExpenseDto中引用了GetExpenseDto,expenseDtoConverter的返回结果),我仍然收到相同的错误,我注释掉了map()。s

  • Python3 File(文件) 方法 概述 readline() 方法用于从文件读取整行,包括 "\n" 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 "\n" 字符。 语法 readline() 方法语法如下: fileObject.readline(); 参数 size -- 从文件中读取的字节数。 返回值 返回从字符串中读取的字节。 实例 以下实例演示了 readl