输入值小于数组长度

时间:2014-12-15 19:55:42

标签: java arrays

对于赋值,我被要求创建一个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。

6 个答案:

答案 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)

首先,您的变量名称是不可读的。 ij应始终为intInteger值,而不是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]);
        }
    }
}