void input () throws IOException
{
.......
}
这两种扫描仪都可以正常工作
void input ()
{
.......
}
但为什么这会显示缓冲读取器中的编译错误呢
如果发生任何错误,它应该显示在运行时,但为什么必须显式地告诉编译器,在BufferedReader的情况下,而不是在Scanner的情况下
扫描仪
并非仅用于IO操作。
抛出一个IOException
,对于使用扫描器进行非IO操作的客户端来说可能会造成混乱。我之前的回答集中在扫描器
上,显示了使用扫描器
扫描字符串的示例:
class ScannerWrapper implements Iterable<E> {
public Scanner scanner;
public ScannerWrapper(Scanner scanner) {
this.scanner = scanner;
}
public Iterator<String> iterator() {
return scanner;
}
}
Scanner scanner = new Scanner("one,two,three");
scanner.useDelimiter(",");
ScannerWrapper wrapper = new ScannerWrapper(scanner);
for(String s : wrapper) {
System.out.println(s);
}
您仍然可以通过扫描仪#ioExceptions()
监视底层IO组件抛出的任何IOExceptions
:
返回上次由此扫描仪的基础可读抛出的IOExcture。如果不存在此类异常,则此方法返回null。
原因是BufferedReader
方法抛出IOException
,您可以在这里检查:Docs:BufferedReader
添加到上面,下面示例中的FileReader
构造函数也会抛出FileNotFoundException
BufferedReader in = new BufferedReader(new FileReader("foo.in"));
IOException
和FileNotFoundException
都是选中的异常,必须进行处理,或者应该通过使用throws
将异常处理委托给调用方方法(在您的情况下,input()
)
请阅读以下说明:https://javarevisited.blogspot.com/2011/12/checked-vs-unchecked-exception-in-java.html
另一方面,您正在调用的Scanner
方法可能不会抛出任何检查类型
异常
这与您使用的类无关,而是与您正在调用的方法以及它们抛出的异常有关。
一些(大多数)BufferedReader
方法抛出IOExc0019,这是一个检查异常。这意味着您必须指定您的方法何时抛出它(即。没有捕获它)。
粗略地看一下,似乎Scanner
中的方法抛出了uncheck异常(从RuntimeExc0019派生的异常)。如果您的方法抛出它们(不捕获它们),则不必指定它们。
关键在于,它取决于您正在调用的方法引发了哪些异常(已检查的与未检查的),以及您是捕获这些异常还是让它们冒泡到调用html" target="_blank">代码,以确定您是否需要在方法的签名中指定它们。
编辑:为了回答您关于编译器错误的问题,编译器将强制您捕获或显式声明由您的方法(或您正在调用的方法)引发的任何异常。
我试图通过使用命令“java postfix 错误: 请在java.util.scanner.throwfor(未知源) 在java.util.scanner.next(未知源) 在java.util.scanner.nextInt(未知源) 在java.util.scanner.nextInt(未知源) 在java.util.scanner.nextInt(未知源) 在java.util.sca
我在尝试运行此程序时遇到以下异常。我正在使用在线编译器。甚至在读取字符串后尝试使用nextLine(),但没有成功。 我得到了以下异常:输入客户名称:在线程“main”java中输入客户id异常。util。NoSuchElementException:在java中找不到行。util。扫描仪。nextLine(Scanner.java:1585)位于Main。main(main.java:12)
我正在玩Java8中的新lambda特性,发现Java8提供的实践确实很有用。然而,我想知道有没有一个好的方法来解决下面的场景。假设您有一个对象池包装器,它需要某种工厂来填充对象池,例如(使用): 将函数接口转换成lambda表达式后,上面的代码变成了这样: null 和都应该在迁移到Java 8期间删除,但是没有完全匹配。如果lambda表达式可以像未检查一样处理检查过的异常,那么可以在上面的构
问题内容: 编辑 以便进一步阅读:问题是我的输入文件已损坏。 我不明白我在做什么错: 我正在使用此代码: 哪个工作正常。现在,由于某种原因,我想换一个扫描仪。我的代码变成: 这次,我们从不输入while,因为r.hasNextLine()始终返回“ false”。关于我在做什么错的任何想法吗? 我精确地说,没有其他更改,文件仍然相同。 编辑 :我还精确地我尝试了另一个文件,并得到相同的结果,这意味
问题内容: 我正在使用Java 8的新lambda功能,发现Java 8提供的实践确实很有用。但是,我想知道是否有一种 很好的 方法来解决以下情况。假设您有一个对象池包装器,需要某种工厂来填充对象池,例如(使用): 将功能接口转换为lambda表达式后,上面的代码变为: 确实还算不错,但是检查的异常需要在lambda内部加上/ 块。在我公司,我们长时间使用两个接口: 相当于; 还有一个特殊的接口,
问题内容: 发生异常时,如何使扫描仪重试? 考虑此应用程序在CLI模式下运行。 例: 如果用户未输入类型输入,则抛出错误。但我想在错误消息出现之后。应该要求用户再次输入 宽度 。 怎么做? 问题答案: 如果我对您的理解正确,则希望该程序在失败后要求用户重新输入正确的输入。在这种情况下,您可以执行以下操作: 注意:您 只能 捕获并重试一次。这些方法会引发其他异常,如果您尝试重试这些异常,则您的应用程