对于赋值,我被要求创建一个Java程序,该程序从文件中读取整数值并将它们存储到长度为40的数组中,并以相反的顺序打印这些值。我的问题是,当文件中的值少于40时,赋值也要求它工作。这就是我的尝试:
import java.io.*;
import java.util.Scanner;
public class Set8_Prog3
{
public static void main (String[] args) throws IOException
{
FileReader i = new FileReader("Set8_Prog3 numbers.txt");
Scanner j = new Scanner(i);
int[] values = new int[40];
int k = 0;
int last = -1;
while (k < 40)
{
values[k] = j.nextInt();
last = values[k];
k++;
}
System.out.println("The values from the file in reverse order is: ");
while (last >= 0)
{
System.out.println(values[last]);
last--;
}
}
}
它成功编译,但是当我运行它时,我收到一个错误,说java.util.NoSuchElementException。另外,我不应该使用ArrayList。
答案 0 :(得分:1)
只需将您的while条件更改为while(k < 40 && j.hasNextInt())
即可正常运行。
答案 1 :(得分:0)
values[k] = j.nextInt();
如果没有nextInt(),会发生什么?您必须使用j.hasNextInt()
进行管理答案 2 :(得分:0)
while (k < 40)
{
values[k] = j.nextInt();
last = values[k];
k++;
}
您总是尝试从文件中读取40 ints
,即使数量较少。来自Scanner.nextInt()
的Javadoc:
Throws:
InputMismatchException - if the next token does not match the Integer regular expression, or is out of range
NoSuchElementException - if input is exhausted
IllegalStateException - if this scanner is closed
即使输入已用尽,您仍在阅读。您应该使用Scanner.hasNextInt()
方法检查是否有更多输入,并且您的代码可以相应地执行操作。
答案 3 :(得分:0)
首先,您的变量名称是不可读的。 i
和j
应始终为int
或Integer
值,而不是FileReader
或其他任何内容。
然后,你最后不需要变量,并且在上一次循环中使用它的方式不正确,只需使用k代替。
最后,这是你真正的问题,你应该只处理这个异常(或者更好,在循环条件下使用Scanner.hasNextInt()),以防文件不包含40个整数。在这种情况下,只需退出循环。
答案 4 :(得分:0)
在获取输入时使用hasNextInt
来查找是否存在任何int值
While(k<40 && scanner.hasNextInt()){
}
K已经增加1.因此首先将其减少1.然后将其循环直到0
k--;
while (k>= 0)
{
System.out.println(values[k]);
k--;
}
while (k < 40 && scanner.hasNextInt())
{
values[k] = j.nextInt();
k++;
}
k--;
System.out.println("The values from the file in reverse order is: ");
while (k>= 0)
{
System.out.println(values[k]);
k--;
}
<强> UPDATED CODE
强>
import java.io.*;
import java.util.Scanner;
public class Set8_Prog3
{
public static void main (String[] args) throws IOException
{
FileReader i = new FileReader("Set8_Prog3 numbers.txt");
Scanner j = new Scanner(i);
int[] values = new int[40];
int k = 0;
while (k < 40 && j.hasNextInt())
{
values[k] = j.nextInt();
k++;
}
k--;
System.out.println("The values from the file in reverse order is: ");
while (k>= 0)
{
System.out.println(values[last]);
k--;
}
}
}
答案 5 :(得分:0)
对于您的一些代码的轻微重写感到抱歉。只是更清楚地了解变量的含义。
我还修改了你在循环中对幻数的使用,并将其更改为for循环以摆脱上面的变量声明。
我还将scan.hasNextInt()添加到for循环的条件中以及i&lt; values.length()。
import java.io.*;
import java.util.Scanner;
public class Set8_Prog3 {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("Set8_Prog3 numbers.txt");
Scanner scanner = new Scanner(fileReader);
int[] values = new int[40];
int count = -1;
for (int i = 0; i < values.length && scanner.hasNextInt(); i++) {
values[i] = scanner.nextInt();
count = i;
}
System.out.println("The values from the file in reverse order is: ");
for (int i = count; i >= 0; i--) {
System.out.println(values[i]);
}
}
}