【问题标题】:Scanner scans first line and only the first input of the second line扫描仪扫描第一行并且仅扫描第二行的第一个输入
【发布时间】:2017-06-13 09:39:26
【问题描述】:

我正在创建此代码,其中扫描仪应扫描文本文件中的每个单词,然后继续将每个单词保存在特定数组中。但是每次扫描仪开始扫描时,它只会到达下一行并在第一个单词处停止。我不知道究竟是什么原因造成的。我正在使用分隔符来分隔逗号“,”之间的单词。

这是一段代码:

package ex13a;
import java.util.Scanner;
import java.io.*;
/**
 *
 * @author Work
 */
public class Ex13a {
static Scanner scan = new Scanner(System.in);
static int[] number = new int[100];
static String[] f_users = new String[100];
static String[] l_users = new String[100];
static String[] passwd = new String[100];
static int i = 0;
static String fullName;

/**
 * @param args the command line arguments
 * @throws java.io.IOException
 */
public static void main(String[] args) throws IOException {
String path = "C:\\Users\\Work\\Desktop\\users.txt";
File inFile = new File(path);
Scanner inPut = new Scanner(inFile).useDelimiter(",");
Scanner inPut2 = new Scanner(inFile);
while(inPut.hasNext()){
    System.out.println(number[i] = inPut.nextInt());
    System.out.println(f_users[i] = inPut.next());
    System.out.println(l_users[i] = inPut.next());
    System.out.println(passwd[i] = inPut.next());

    i++;

}

它向我抛出了那个错误:

1
Ahmed
Dhaif
asdf56
Exception in thread "main" java.util.InputMismatchException
2
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 ex13a.Ex13a.main(Ex13a.java:32)
C:\Users\Work\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53:     Java returned: 1
BUILD FAILED (total time: 0 seconds)

【问题讨论】:

  • 使用nextLine()逐行读取文件,然后使用.split(",")解析该行。此外,JavaScript 和 Java 是两种完全独立、不相关的语言,您的问题与 Netbeans 无关。删除 javascript 和 netbeans 标签。
  • 它打印值 2 有点奇怪,大概来自文本文件第二行的 nextInt() 调用,但它在调用 nextInt() 时失败。但是,如果它打印nextInt() 返回的值,它将在下一条语句中,即对next() 的调用,而不是nextInt()。您确定这是您正在运行的代码吗?
  • 阅读错误信息,它们会为您提供帮助。为了帮助人们回答,如果您也提供输入数据会有所帮助。

标签: java


【解决方案1】:

逐行抓取,然后在逗号周围分割行,然后解析返回的字符串。

Scanner inPut = new Scanner(inFile);
while(inPut.hasNextLine()){
    String [] data = inPut.nextLine().split(",");
    System.out.println(Integer.parseInt(data[0]));
    number[i] = Integer.parseInt(data[0]); //to add to your arrays
    System.out.println(Integer.parseInt(data[1]));
    System.out.println(Integer.parseInt(data[2]));
    System.out.println(Integer.parseInt(data[3]));
    i++;
}

请注意,您应该检查数组的大小是否正确,并且字符串实际上是一个整数。你应该能够做到这一点。但这应该可以帮助您入门。

如果要将值存储在数据结构中,请使用动态的而不是固定长度的数据结构,例如数组。

【讨论】:

    【解决方案2】:

    阅读错误信息。在nextInt() 方法中引发了异常。来自documentation,为nextInt()

    InputMismatchException - if the next token does not match the Integer
    regular expression, or is out of range
    

    所以你正在阅读的令牌不是你想象的那样。您可以用其他东西替换nextInt() 调用以查看它是什么,然后从那里开始。

    郑重声明,这段代码非常值得信赖

    1. 循环检查“是否有任何令牌”,然后假定它是 整数。
    2. 您假设如果有 1 个令牌,那么每次循环迭代之后还会有 3 个令牌。
    3. 条目数量不受保护,您假设它将是

    编辑

    我的猜测是行尾有些东西是不可打印的,所以当你阅读它时,它看起来像一个整数,但实际上类似于 ^r###,其中 "^r" 是控制代码和### 是数字。

    我敢打赌,如果您将 hasNext() 更改为 hasNextInt(),它将在处理 1 行后停止。使用二进制编辑器阅读文件,看看你真正在阅读什么。

    【讨论】:

    • 这是一个值得信赖的代码,因为我已经知道它的内容以及它在未来将如何变化。我将 nextInt 替换为 next 以查看它是否为 int。令人惊讶的是,它显示了整个文件,但显示了以下错误消息:中间的线程“main”java.util.NoSuchElementException 中出现异常,随后出现其他错误。
    • 顺便说一下,下一个预期的数字是一个 int。
    • @M.J - 没有看到输入数据(输入数据无论如何都是有用的,正如我上面评论的那样),你的测试结果我只能猜测你的下一个问题是什么,但听起来就像它可能是文件结束边界条件一样。嗯,实际上这听起来像是一个行尾问题,一些不可打印的东西,或者你的行尾的一部分没有被识别为空白。尝试逐字符读取文件的前几行,然后输出字符代码 - 或在二进制编辑器中编辑文件 - 以查找行尾异常。
    猜你喜欢
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    相关资源
    最近更新 更多