Java:BufferedReader';什么是readLine()?

Java:BufferedReader';什么是readLine()?,java,exception,ioexception,Java,Exception,Ioexception,我可以用try-catch循环“修复”下面的异常,但我无法理解原因 为什么部分“in.readLine()”会持续引发IOExceptions 抛出这些异常的真正目的是什么,目标可能不仅仅是更多的副作用 代码和IOExceptions $ javac ReadLineTest.java ReadLineTest.java:9: unreported exception java.io.IOException; must be caught or declared to be thrown

我可以用try-catch循环“修复”下面的异常,但我无法理解原因

  • 为什么部分“in.readLine()”会持续引发IOExceptions
  • 抛出这些异常的真正目的是什么,目标可能不仅仅是更多的副作用
  • 代码和IOExceptions

    $ javac ReadLineTest.java 
    ReadLineTest.java:9: unreported exception java.io.IOException; must be caught or declared to be thrown
      while((s=in.readLine())!=null){
                          ^
    1 error
    $ cat ReadLineTest.java 
    import java.io.*;
    import java.util.*;
    
    public class ReadLineTest {
     public static void main(String[] args) {
      String s;
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      // WHY IOException here?
      while((s=in.readLine())!=null){
       System.out.println(s);
      }
     }
    }
    
    IOException是一个异常。您必须捕获它,或者将其扔给调用方法。检查异常是由外部因素引起的,如丢失的文件、发生故障的磁盘或程序代码中无法恢复的任何内容


    但是,像ArrayIndexOutofBoundsException这样的未经检查的异常是由程序中的错误逻辑引起的。您可以在有缺陷的代码之外使用if条件(类似于if currendex>array.length)来破坏它。在检查异常的情况下没有这样的规定

    如果I/O发生异常情况,例如流的源不再可用,则抛出该异常

    在这种情况下,您的程序应该能够恢复。通过重新读取源代码,或者使用一些默认值,或者向用户发出有关问题的警报

    您必须捕获它,因为它是一个已检查的异常,并且您应该能够从这些异常中恢复


    当然,您可以选择声明当前menthod
    将此异常抛出调用方方法,但最终您必须捕获它(或者让它冒泡到主方法,当它被简单地打印在控制台上并且程序执行停止时)

    BufferedReader.readLine()
    被声明为可能引发异常,请参阅:

    您要么需要捕获它,要么将主方法声明为抛出IOException

    也就是说,要么这样做:

    try {
        while((s=in.readLine()) != null){
            System.out.println(s);
         }
    } catch(IOException e) {
        // Code to handle the exception.
    }
    

  • 它不会“持续地点燃”它们,它只会在每次你调用它时抛出它们。在您的情况下,如果它抛出了一些东西,则表示您的标准输入出现了严重错误
  • 我们的目标是确保您,即使用API的程序员,能够处理这个问题,因为一般认为它是一个可恢复的问题——尽管在您的特定情况下,它对整个程序来说是致命的

  • 基本思想是BufferedReader委托给不同类型的读取器,因此它将传递该异常

    不同类型的读取器可以从某种不稳定的外部资源中读取数据,比如FileReader中的文件系统。文件系统读取在任何时候都可能由于多种原因而失败。(如果读卡器从网络流获取其底层数据,情况会更糟)。该文件可能会从您下方被删除(取决于所涉及的文件系统和操作系统)


    因为您无法预测代码会发生什么,所以您会得到一个选中的异常-问题是API告诉您应该考虑这样一个事实,即即使您的代码没有问题,此操作也可能不起作用。

    使用
    扫描器
    读取文件(或其他类型的输入)在中/大规模情况下效率极低。如果您在阅读数千或百万行时存在性能问题,我强烈建议您改用class。使用BufferedReader从
    系统中读取行的示例如下所示:

    public static void main(String[] args) throws Exception {
    
        String line = null;
        BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
    
        try {
            /* This is protected code. If an problem occurs here, catch block is triggered */
            while ( (line = br.readLine()) != null ){
                System.out.println(line); 
            }
        }
        catch (IOException e){
            throw new IOException("Problem reading a line",e);
        }
    }
    
    IOException应在
    try/catch
    块中使用,以便在
    try
    中的受保护代码出现“异常”行为(如错误)时触发。Java有自己的异常,当类似的情况发生时,这些异常会大量出现。例如,当您定义大小为
    n
    的数组
    a
    并尝试访问代码中某个位置
    a[n+1]
    时,就会出现
    ArrayIndexOutOfBoundsException
    。 作为
    ArrayIndexOutOfBoundsException
    ,还有许多其他异常类,您可以使用自己的消息抛出和自定义。 适用于异常的代码应放置在try块中的受保护区域中。当异常发生在该块中时,异常将在catch块中与其一起处理


    请注意,您不需要构建
    if/else
    语句来预测错误情况并为每种情况抛出异常。您只需要在
    try
    catch
    块之间关联可能的异常情况。请参阅更多有关安全编程的信息。

    Sun例外教程:@downvoter-让我来纠正您认为此答案有误的地方。我不是那个否决您的人,但我可以找到很好的理由否决您的“答案”。问题是显示从命令提示符读取输入,所以问题是IOException的用途是什么,是哪里可能出错。您写道:“如果I/O出现异常情况,例如流的源不再可用,则会引发异常。”好吧,请举例说明在问题中,从命令提示符读取时如何发生这种情况。您能否重现问题中的代码会导致IOException的情况?
    public static void main(String[] args) throws Exception {
    
        String line = null;
        BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
    
        try {
            /* This is protected code. If an problem occurs here, catch block is triggered */
            while ( (line = br.readLine()) != null ){
                System.out.println(line); 
            }
        }
        catch (IOException e){
            throw new IOException("Problem reading a line",e);
        }
    }