Java:BufferedReader';什么是readLine()?
我可以用try-catch循环“修复”下面的异常,但我无法理解原因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
$ 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);
}
}