[英]User input from scanner results in an infinite loop in try/catch block even when using NextLine in Catch
[英]Using a try/catch block to catch exceptions with input from a file
我很确定我的问题在我的try块中某个地方存在,但我似乎无法查明。 我正在做的是从文件中读取并检查输入。 如果输入> 0,则我想增加goodData,如果不是,则对于值<0,它应该抛出BPIllegalValueException,对于不是整数的东西,它应该抛出InputMismatchException。 我希望你们能帮上忙。
编辑:教授说明:
在您的程序中,您需要两个异常来处理两种不良数据。 对于非整数读取,可以使用nextInt()方法从文件读取整数,如果数据不是整数,则将引发InputMismatchException。 您的程序必须捕获此异常。 要处理否定的读数,您可能需要声明自己的Exception类:BPIllegalValueException(应编写包含该类的BPIllegalValueException.java),并在读取负值时引发此异常。 注意:读取错误数据时,程序不应终止。 因此,您必须使用try / catch块来处理错误数据。 您的程序应在屏幕上打印出良好BP读数的数量和不良数据的数量。
我的代码如下:
import java.io.*;
import java.util.*;
public class DemoEx {
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("BP.txt");
BufferedReader br = new BufferedReader(fr);
Scanner in = new Scanner(new FileReader("BP.txt"));
int badData = 0;
int goodData = 0;
int data;
String str = "";
while((str = br.readLine()) != null)
{
try
{
data = in.nextInt();
if(data>0)
goodData++;
else if(data<0)
throw new BPIllegalValueException(data);
else
throw new InputMismatchException();
}
catch(InputMismatchException ex)
{
badData++;
}
catch(BPIllegalValueException ex)
{
badData++;
}
}
System.out.println("The number of good data: " + goodData);
System.out.println("The number of bad data: " + badData);
}
}
当您只想增加计数器时,为什么会引发异常?
看起来像你想要的
if (data > 0)
goodData++
else
badData++;
现在,在执行此操作之前,请确保数据是整数,如果执行.nextInt(如果有),则将获得该整数,并且所有其他非int值将被跳过。 因此,这取决于您以哪种方式读取数据,为什么要使用扫描仪? 为什么不使用缓冲的阅读器和readLine然后将其拆分成所需的内容呢?
根据您的示例,为什么还要使用例外? 您正在执行的操作不是处理错误,而是您似乎在执行逻辑。 错误应该是显示停止符,而不是用来执行代码中的逻辑。 只是增加不良数据,而不使用异常。 异常也会使您的代码变慢。
您无需遍历两个不同的流。 扫描仪就足够了。
BufferedReader br = new BufferedReader(new FileReader("BP.txt"));
Scanner in = new Scanner(br);
同样,您不应将异常用于控制流,而应使用if / else语句。
if(data > 0){
goodData++;
}else { //if (data <= 0)
badData++;
}
循环应该由扫描仪控制,扫描仪是寻找数字的人:
while(in.hasNext()){ ... }
最后,如果您的文件包含不同于数字的其他标记,请确保对其进行迭代,否则您将编写一个无限循环:
if(in.hasNextInt()){
data = in.nextInt();
}else{
in.next(); //makes sure you move to the next token if it is not an int.
}
总的来说,是这样的:
BufferedReader br = new BufferedReader(new FileReader("BP.txt"));
Scanner in = new Scanner(br);
int badData = 0;
int goodData = 0;
int data = 0; //this must be initialized
while(in.hasNext()){
if(in.hasNextInt()){
data = in.nextInt();
if(data > 0){
goodData++;
}else if (data <= 0){
badData++;
}
}else{
in.next(); //move to the next token when it-s not an int.
}
}
System.out.println("The number of good data: " + goodData);
System.out.println("The number of bad data: " + badData);
如果您的文件BP.txt包含以下内容:1 2 ABC 4 5 6 -1 -2 CB
它会输出:
The number of good data: 8
The number of bad data: 4
该假设与您期望的输出相对应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.