[英]Less input values than array length
對於一項作業,我被要求創建一個 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。
只需將您的 while 條件更改為while(k < 40 && j.hasNextInt())
,它應該可以正常工作。
values[k] = j.nextInt();
如果沒有 nextInt() 會發生什么? 你必須用 j.hasNextInt() 來管理它
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()
方法來檢查是否有更多的輸入,並且您的代碼可以采取相應的行動。
首先,你的變量名是不可讀的。 i
和j
應始終為int
或Integer
值,而不是FileReader
或其他任何值。
然后,您不需要變量 last 並且在上一個循環中使用它的方式是不正確的,只需使用 k 即可。
最后,這是您真正的問題,如果文件不包含 40 個整數,您應該只處理此異常(或者更好的是,在循環條件中使用 Scanner.hasNextInt() ) 。 在這種情況下,只需退出循環。
在獲取輸入時使用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--;
}
}
}
很抱歉對您的某些代碼進行了小幅重寫。 只是更清楚地說明了變量的含義。
我還修改了您在循環中使用幻數,並將其更改為 for 循環以擺脫上面的變量聲明。
我還將scanner.hasNextInt() 與i < values.length() 一起添加到for 循環的條件中。
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]);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.