为什么Scanner .next()方法返回null?

时间:2016-11-23 05:38:02

标签: java

我正在使用2个不同的Scanner对象从2个单独的文件中读取输入。我有2个嵌套循环,其连续条件取决于Scanner的.hasNext()方法返回的内容。

我正在比较每个文件的内容。如果有匹配,我想打印出来。但是,我当前的代码一直返回null,我不知道为什么。你能告诉我我做错了什么吗?

  Scanner stdin1 = new Scanner("file1.txt");
  Scanner stdin2 = new Scanner("file2.txt");

  while(stdin1.hasNext()){
     while(stdin2.hasNext()){
        if(stdin1.next().equals(stdin2.next()){
           //This line below is giving the error
           System.out.println(stdin1.next() + " " + stdin2.next() );
         }
      }
    }

4 个答案:

答案 0 :(得分:1)

您的hasNext()方法会检查是否还有其他元素。如果它返回true,则表示还有一个元素可以使用next()方法访问。

在您的代码中,对于每个hasNext(),您要拨打next()两次,这不是正确的方法。

您应该将代码修改为有点像这样:

  Scanner stdin1 = new Scanner("file1.txt");
  Scanner stdin2 = new Scanner("file2.txt");

  while(stdin1.hasNext()){
     while(stdin2.hasNext()){
        Object one = stdin1.next();
        Object two = stdin2.next();

        if(one.equals(two)){
           //This line below is giving the error
           System.out.println(one + " " + two );
         }
      }
    }

修改

请注意,next()如果没有下一个令牌,则不会返回null。此技术用于处理枚举的nextElement方法抛出的错误java.util.NoSuchElementException,以指示枚举中没有更多元素。 [source]

答案 1 :(得分:1)

我意识到你要实现的目标并不是你在代码中所做的事情。

构造函数Scanner(String source)不会将文件名作为输入。

请改用此构造函数:Scanner(File file)

要实现您的目标,请尝试以下方法:

  

更新:需要关闭扫描仪对象并在内部while循环内重新打开,这是由于多个i / o操作导致的不必要的开销。要避免这种情况,请将元素捕获到列表中,然后进行比较。试试这段代码:

    Scanner stdin1 = new Scanner(new File("file1.txt"));
    Scanner stdin2 = new Scanner(new File("file2.txt"));

    List list1 = new ArrayList();
    List list2 = new ArrayList();
    while (stdin1.hasNext()) {
        list1.add(stdin1.next());
    }
    while (stdin2.hasNext()) {
        list2.add(stdin2.next());
    }

    for (Object o1 : list1) {
        for (Object o2 : list2) {
            if (o1.equals(o2)) {
                System.out.println(o1 + " " + o2);
            }
        }
    }

希望这有帮助!

答案 2 :(得分:1)

“返回null”表示程序不打印任何内容。

两个问题。

首先,Scanner(String text)在给定字符串上创建扫描程序。 它不会创建扫描程序来读取给定名称的文件。相反,您应该给它一个File

Scanner stdin1 = new Scanner(new File("file1.txt"));

其次,嵌套的while循环是什么?在从中提取令牌之前,您应该检查两个扫描程序。

while (stdin1.hasNext() && stdin2.hasNext()) {
    String one = stdin1.next();
    String two = stdin2.next();
    if (one.equals(two)) {
        // print
    }
}
// Now maybe one of them still got tokens, but we are printing 
// the tokens that are equal, so doesn't matter.

为什么你的代码什么都不打印?由于stdin1.next()返回"file1.txt"stdin2.next()返回"file2.txt"

答案 3 :(得分:1)

两个 while循环是高时间复杂度,尝试用一个循环解决这个问题,并在执行后关闭程序。

public static void main(String[] args) {
        Scanner stdin1 = null, stdin2 = null;
        try {
            stdin1 = new Scanner(new File("C:\\Users\\pechen\\Documents\\file1.txt"));
            stdin2 = new Scanner(new File("C:\\Users\\pechen\\Documents\\file2.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        while (stdin1.hasNext()) {
            if (stdin2.hasNext()) {
                Object o = stdin1.next();
                if (o.equals(stdin2.next())) {
                    System.out.println(o);
                }
            } else {
                break;
            }
        }
    }