Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我得到了一个非接触性的例外_Java_Arrays - Fatal编程技术网

Java 我得到了一个非接触性的例外

Java 我得到了一个非接触性的例外,java,arrays,Java,Arrays,此代码在strLastName[x]=inputFile.next()处停止我不知道为什么。它是作为一个java.util.NoSuchElementException找到的。您的问题是每次检查hasNext()时,您都要调用next()四次。如果您的输入在同一行,如下所示: public static void main(String[] args) throws FileNotFoundException { Scanner inputFile = new Scan

此代码在
strLastName[x]=inputFile.next()处停止我不知道为什么。它是作为一个
java.util.NoSuchElementException找到的。

您的问题是每次检查
hasNext()
时,您都要调用
next()
四次。如果您的输入在同一行,如下所示:

public static void main(String[] args) throws FileNotFoundException 
    {
        Scanner inputFile = new Scanner("Employees.txt");
        inputFile.useDelimiter(",");
        String[] strLastName = new String[10];
        String[] strFirstName = new String[10];
        double[] dHours = new double[10];
        double[] dPayRate = new double[10];
        int x = 0;

        while(inputFile.hasNext())
        {
            strLastName[x] = inputFile.next();
            strFirstName[x] = inputFile.next();
            dHours[x] = Double.parseDouble(inputFile.next());
            dPayRate[x] = Double.parseDouble(inputFile.next());
            x++;
        }
        inputFile.close();
        String[] strFullName = FullName(strFirstName, strLastName);
        double[] dGrossPay = GrossPay(dHours, dPayRate);
        Output(strFullName, dHours, dPayRate, dGrossPay);
    }
First
Last
hours
rate
然后应该将
inputFile.hasNext()
替换为
inputFile.hasNextLine()

如果它们都在不同的线路上,如:

First Last hours rate
然后,您需要在所有
inputFile.next()
之前(第一个之后)放置一个if语句。大概是这样的:

public static void main(String[] args) throws FileNotFoundException 
    {
        Scanner inputFile = new Scanner("Employees.txt");
        inputFile.useDelimiter(",");
        String[] strLastName = new String[10];
        String[] strFirstName = new String[10];
        double[] dHours = new double[10];
        double[] dPayRate = new double[10];
        int x = 0;

        while(inputFile.hasNext())
        {
            strLastName[x] = inputFile.next();
            strFirstName[x] = inputFile.next();
            dHours[x] = Double.parseDouble(inputFile.next());
            dPayRate[x] = Double.parseDouble(inputFile.next());
            x++;
        }
        inputFile.close();
        String[] strFullName = FullName(strFirstName, strLastName);
        double[] dGrossPay = GrossPay(dHours, dPayRate);
        Output(strFullName, dHours, dPayRate, dGrossPay);
    }
First
Last
hours
rate
编辑:下面的注释是正确的,您是在字符串而不是文件上调用scanner。您需要在开头添加以下内容:

while(inputFile.hasNext())
    {
        strLastName[x] = inputFile.next();
        if (inputFile.hasNext()) {
          strFirstName[x] = inputFile.next();
        }
        if (inputFile.hasNext()) {
          dHours[x] = Double.parseDouble(inputFile.next());
        }
        if (inputFile.hasNext()) {
          dPayRate[x] = Double.parseDouble(inputFile.next());
        }
        x++;
    }

您指定了
useDelimiter(“,”
),但这真的是所有值的分隔符吗

我猜不是,因为
Employees.txt
可能是一个CSV(逗号分隔值)文件,例如:

Doe,John,40,15.00
史密斯,简,35,12.00
使用逗号拆分时,将得到以下值:

Doe
约翰
40
15.00\n提交
简
35
12
如您所见,行尾没有导致
15.00
Smith
成为两个令牌

解决方案:

  • 使用CSV解析器(强烈建议)

  • 指定正确的分隔符(不推荐,太容易出错)

  • 使用行读取并拆分行:

    inputFile.useDelimiter(",|\\R");
    

  • 您不能在while(hasNext())循环中多次调用.next()。您的循环将检查是否存在下一个元素。但是你打了四次“下一步”。这显然是不安全的,因此您没有任何检查就用完了元素。您在
    字符串上创建了扫描仪。但是字符串构造函数将从作为源的字符串中读取。它不会将其解释为文件。这不是你想象的那样。阅读。为什么使用
    Double.parseDouble(inputFile.next())
    而不是
    inputFile.nextDouble()
    ?OP的实际问题是他是从字符串而不是文件中读取的。这个答案并不能解决问题。是的,你是对的。编辑了我的文章也澄清了这一点。他仍然可能遇到我在原始答案中提到的问题,所以我也留下了。没有看到您的代码或您遇到的具体错误,我无法准确地说。但您可能没有导入文件。如果是这种情况,您只需要在导入Scanner
    import java.io.File的开始处使用这一行