【问题标题】:Java InputMismatchException ErrorsJava InputMismatchException 错误
【发布时间】:2014-08-01 17:50:45
【问题描述】:

我正在尝试为我的 Java 类编写一个 Inventory 程序。该程序需要从.txt 文件中读取初始库存数据(迭代一定次数 - 由我们正在使用的inv.txt 文件中的第一个整数定义)。我的文本文件是正确的,扫描仪、数组和循环似乎是正确的,但是我得到了 InputMismatchException。

.txt 文件格式如下:

XXXX - Count - # of times to iterate


XXXX - Product Code


XXXX -Quantity On Hand


XXXX - Reorder Level

如果每个产品的产品代码、QOH 和再订购级别重复,则 COUNT 仅在文件中出现一次。

必须读取所有值,并将每个值存储在各自的数组中。

import javax.swing.*;
import java.util.*;
import java.sql.*;
import java.math.*;
import java.*;
import java.io.*;

public class Lab7Test2
{
public static void main (String [] args) throws IOException
{
  int count = 0; //To hold Max Count (Max Iterations Expected)
  int countAt = 0; //To hold Current Count.
  int number = 0; //To hold a number.
  int number2 = 0; //To hold a 2nd Number.
  int index = 0; //Index Placeholder.
  int index2 = 0;
  int index3 = 0;

  int[] partNumb;
  int[] qoh; //Holds Product's Quantity On Hand (QOH)
  int[] reorder; //Minimum Reorder Level
  int[] transNumb;
  int[] transType;
  int[] transAmt;

  String[] status; //Holds Product's Inventory Status as String.
  String[] error; //Holds Error Messages associated with Transactions.
  String input;
  String output; //Holds output for transaction Log.

  Scanner keyboard = new Scanner(System.in);
  File openFile;
  Scanner scanFile;

  //----End of Variable Declaration---    /////////////////////////////////////////////

  //----Begin Program Execution----////////////////////////////////////////////////////

  System.out.println("Enter the Inventory File Name.");
  input = keyboard.nextLine();

  if(!input.contains(".txt")) //If Input has no '.txt' extension, error message.
  {
     while(!input.contains(".txt")) //Repeat error if no '.txt' extension found.
     {
        System.out.println("Invalid Input");
        System.out.println("Enter the Inventory File Name.");
        input = keyboard.nextLine();
     }
     openFile = new File(input); //Set openFile to 'input' if '.txt' extension found.
     scanFile = new Scanner(openFile);
     System.out.println("File Loaded.");
  }
  else
  {
     openFile = new File(input); //Set openFile to 'input' if '.txt' extension found.
     scanFile = new Scanner(openFile);
     System.out.println("File Loaded.");
  }

  number = scanFile.nextInt();
  number *= 3;
  partNumb = new int[number]; //Set partNumb[] Size = to count
  qoh = new int[number]; //Set qoh[] Size = to count
  reorder = new int[number]; //Set reorder[] Size = to count
  count = number;
  number = 0;

引发异常的是下面循环的开始,特别是下面的 5 行:数字 2 = scanFile.nextInt()。只有当我将“计数”和“数字”变量设置为 * 3 时,我才会收到此错误(以确保每个产品都有 3 个值:产品代码、手头数量、重新订购级别)。

 while(countAt < (count * 3)) 
  {
     if(number == 0) // Number 0 = partNumb[]
     {
        number2 = scanFile.nextInt(); 
        partNumb[index] = number;
        index++;
        number++;
        countAt++;
     }
     else if(number == 1) //Number 1 = qoh[]
     {
        number2 = scanFile.nextInt();
        qoh[index2] = number;
        index2++;
        number++;
        countAt++;
     }
     else if(number == 2) //Number 2 = reorder[]
     {
        number2 = scanFile.nextInt();
        reorder[index3] = number;
        index3++;
        number = 0;
        countAt++;
     }
  }

  System.out.println("Data Loaded to Arrays"); //Confirmation of Data Acceptance.

  //Reset all Counter & Index Variables for use with next Loop.
  index = 0;
  index2 = 0;
  index3 = 0;
  countAt = 0;
  number = 0;
  number2 = 0;


  while(countAt < (count * 3))
  {
     System.out.println(partNumb[index]); //Print All Values in the partNumb[] Array.
     index++;
     countAt++;
  }


  //----END PROGRAM -----//////////////////////////////////////////////////////////////
}

}

根据至少 3 天的问题研究,我已经尝试了无数种方法来纠正这个问题,但到目前为止还没有想出 任何方法来解决这个 InputMismatchException 错误?。如果有人有任何建议,请告诉我,谢谢。

堆栈跟踪:

----jGRASP exec: java Lab7Test2

Enter the Inventory File Name.
inv.txt
File Loaded.
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:909)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at Lab7Test2.main(Lab7Test2.java:74)

 ----jGRASP wedge2: exit code for process is 1.
 ----jGRASP: operation complete.

【问题讨论】:

  • 只有我还是这段代码很难阅读?
  • 哪一行给出了错误?提供有关您的错误的更多信息
  • 发布完整的堆栈跟踪和抛出异常的行。另外,为什么要进行不必要的导入?
  • 代码很难阅读,因为我仍然掌握如何正确格式化它的窍门,对此我深表歉意。我将在此评论之后发布堆栈跟踪,这是第 74 行抛出错误。不幸的是,数据格式是“原样”,由讲师生成。我会检查我是否已经升级了扫描仪。 Stack Trace 将遵循此代码,感谢您的及时回复。
  • 而对于不必要的导入,它们将在程序的后面使用,不幸的是我还没有做到这一点。 -->peeSkillet,我假设通过使用 scanFile.nextInt() 我正在前进到下一行,这是不正确的吗?

标签: java arrays loops file-io inputmismatchexception


【解决方案1】:

我在您的实施中发现了一些小错误。我用我自己的列表尝试过,虽然我不完全确定它是否符合您的格式。 这是我的清单:

2
1000
2  
2
1001
1
3

我稍微修改了您的代码,但样式很容易变得更好。但是您可以在之后执行此操作。我注释掉了您的部分实现,以便您可以轻松看到更改。

    number = scanFile.nextInt();
    //number *= 3;
    partNumb = new int[number]; // Set partNumb[] Size = to count
    qoh = new int[number]; // Set qoh[] Size = to count
    reorder = new int[number]; // Set reorder[] Size = to count
    count = number;
    number = 0;
    //while (countAt < (count * 3)) {
    while (countAt < (count * 3)) {

        //if(number == 0) // Number 0 = partNumb[]
        if (countAt%3 == 0) // Number 0 = partNumb[]
        {
            number = scanFile.nextInt();
            partNumb[index] = number;
            index++;
            //number++;
            countAt++;
            //else if(number == 1) //Number 1 = qoh[]
        } else if (countAt%3 == 1) // Number 1 = qoh[]
        {
            number = scanFile.nextInt();
            qoh[index2] = number;
            index2++;
            //number++;
            countAt++;
            //else if(number == 2) //Number 2 = reorder[]
        } else if (countAt%3 == 2) // Number 2 = reorder[]
        {
            number = scanFile.nextInt();
            reorder[index3] = number;
            index3++;
            //number = 0;
            countAt++;
        }
    }

    System.out.println("Data Loaded to Arrays"); // Confirmation of Data
                                                    // Acceptance.

    // Reset all Counter & Index Variables for use with next Loop.
    index = 0;
    index2 = 0;
    index3 = 0;
    countAt = 0;
    number = 0;
    //number2 = 0;

    //while(countAt < (count * 3))
    while (countAt < (count)) {
        System.out.println(partNumb[index]); // Print All Values in the
                                                // partNumb[] Array.
        index++;
        countAt++;
    }

    // ----END PROGRAM
    // -----//////////////////////////////////////////////////////////////
}

如果我的文件正确,测试显示正确的输出:

Enter the Inventory File Name.
C:\Users\Markus\Desktop\test.txt
File Loaded.
Data Loaded to Arrays
1000
1001

我希望这对您的实施有所帮助。

此致,

最大

【讨论】:

  • Max,那个版本完美运行,谢谢!但是,我仍然不太了解我做错了什么。我看到您使用了 countAt% = 0、1 和 2,并且您没有使用数字 *= 3,而是您在循环中确定了该值。这些是可能导致我的错误的两个主要因素吗?
  • 好吧,首先,数字*= 3:你不需要它,因为数字决定了三个数组的长度。因此,对于每个阵列,您只需要与产品数量一样多的空间。在我的示例中,我有 2 个产品,因此三个数组每个只需要 2 个长度。
  • 现在我们转到 countAt% = 0、1 和 2:countAt 遍历文件。因此,对于每个产品,您将拥有 3 个数字 - 产品代码、现有数量和再订购级别。 countAt 有点算你读了多少数字。列表中的格式表示从开头开始每隔三个数字包含下一个产品代码。(countAt%3==0)。从第二个数字开始的每三个数字将是一个 Qoh,重新排序级别也是如此。所以你必须使用模运算符。例如读取第二个产品的产品代码,当countAt为3时。
  • 有道理,所以我告诉程序将每个数组大小设置为 24,(8 * 3),而不是告诉程序读取 24 行,谢谢 =) 非常有帮助!跨度>
  • 模运算符,这就是我忘记的。我最初试图这样做(每 3 个计数执行一次 this),但我忘记了那个运算符。在课堂上几乎没有触及它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多