JAVA - 主方法中的逻辑错误

时间:2017-11-01 20:09:47

标签: java

我有一项任务,要求我用JAVA编写一个程序,包含10种不同的方法。它从文件获取输入,以便通过各种方法从第二个文件中提取数据。最后,它将结果打印到第三个文件。这是一个介绍类,我们被设法使用hasNext方法。从中检索数据的第二个文件有10行5列,每列代表不同的内容。我使用sc1.nextInt(),因为我们的教授警告我们程序将读取每一段数据,而我们还没有学会如何从一列中提取数据。我一直在接受错误。如果有人可以帮助我,我已经包含了我的代码片段。谢谢。

这是我一直收到的错误:

  

线程“main”中的异常   java.util.InputMismatchException at   java.util.Scanner.throwFor(Scanner.java:864)at   java.util.Scanner.next(Scanner.java:1485)at   java.util.Scanner.nextInt(Scanner.java:2117)at   java.util.Scanner.nextInt(Scanner.java:2076)at   homework4.HomeWork4.checkNumber(HomeWork4.java:47)at   homework4.HomeWork4.main(HomeWork4.java:26)   /Users/xiomarahenriquez/Library/Caches/NetBeans/8.2/executor-snippets/run.xml:53:   Java返回:1 BUILD FAILED(总时间:0秒)“

public static PrintStream ps;

public static void main(String[] args) throws Exception {
    ps = new PrintStream("elementsResults.txt");
    Scanner sc1 = new Scanner(new File("input.txt"));
    int atomicNumber, valid=0, invalid=0, totalProcessed=0;

    while (sc1.hasNext()) {
        atomicNumber = sc1.nextInt();
        checkNumber(atomicNumber);

        if(checkNumber(atomicNumber)== true){
            ++valid;
        } else {
            ++invalid;
        }
        ++totalProcessed;
    }   
}

public static boolean checkNumber (int atomicNumber) throws Exception {
    Scanner sc2 = new Scanner (new File("PeriodicTable.txt"));
    int columnA = sc2.nextInt();
    String columnB;
    int columnC,columnD,columnE;

    while (sc2.hasNext() && (columnA > -1 || columnA < 118)) {    
        columnA=sc2.nextInt();
        columnB=sc2.next();
        columnC=sc2.nextInt();
        columnD=sc2.nextInt();
        columnE=sc2.nextInt();
        if (atomicNumber==columnA) {
            return true;
        }
    } 

    sc2.close();
    return false;
 }

2 个答案:

答案 0 :(得分:1)

这是我的第一个答案。希望能帮助到你。 在while循环中,您运行checkNumber方法两次。那是不必要的。像下面这样做一次。此外,++ i和i ++之间略有不同,请查看此链接:what is the difference between i++ & ++i in for loop (Java)?

while (sc1.hasNext()) {
    atomicNumber = sc1.nextInt();

    if(checkNumber(atomicNumber)== true){
        valid++;
    } else {
        invalid++;
    }
    totalProcessed++;
}

答案 1 :(得分:1)

我认为问题的原因在于异常堆栈跟踪的第一行:

  

线程“main”中的异常java.util.InputMismatchException

以下是InputMismatchException文档的链接。我不能肯定地说,因为我不知道您的输入文件是什么样的,但我很确定当您调用nextInt()时,下一个令牌读取不是可以转换为int。我的猜测是扫描程序遇到了一些文本或其他东西阻止它返回int。为了找出导致问题的令牌,我尝试在try / catch块中包装nextInt()的调用。当扫描程序抛出InputMismatchException时,它不会传递导致异常的令牌,因此在抛出异常后,您可以获取令牌的值(如使用next()方法)或跳过完全令牌。这是一个例子(我现在无权访问IDE,因此未经过测试,但希望您能得到这个想法):

//Some initialization code here...
Scanner myScanner = new Scanner(new File("myFile.txt"));
while(myScanner.hasNext()) {
    try {
        int myIntVariable = myScanner.nextInt();
    } catch (InputMismatchException ex) {
        System.out.println("Here's the token that caused the problem: " + myScanner.next());
    }
}
//The rest of your code here...

顺便说一句,如果你不完全确定你正在检索的令牌是你认为它的类型(在你的情况下是int),那么这可能是一个好主意。将该部分代码包装在try / catch块中,以便您可以处理令牌不符合您认为的情况。