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

Java 为什么Scanner.next()方法返回null?,java,Java,我正在使用两个不同的扫描仪对象从两个单独的文件中读取输入。我有两个嵌套循环,其持续条件取决于Scanner的.hasNext()方法返回的内容 我正在比较每个文件的内容。如果有匹配的,我想打印出来。然而,我当前的代码总是返回null,我不知道为什么。你能告诉我我做错了什么吗 Scanner stdin1 = new Scanner("file1.txt"); Scanner stdin2 = new Scanner("file2.txt"); while(stdin1.hasNex

我正在使用两个不同的扫描仪对象从两个单独的文件中读取输入。我有两个嵌套循环,其持续条件取决于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() );
         }
      }
    }
您的
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。此技术用于处理错误
java.util.NoSuchElementException
,该错误由枚举的nextElement方法引发,以指示枚举中没有更多元素

我意识到您试图实现的并不是您在代码中所做的

构造函数
扫描仪(字符串源)
不接受文件名作为输入

改用此构造函数:
Scanner(文件)

要实现您正在做的事情,请尝试以下方法:

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

希望这有帮助

通过“返回null”,您的意思是程序不打印任何内容

两个问题

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

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”
两个,而循环的时间复杂度很高,请尝试用一个循环来解决这个问题,并在执行后关闭程序

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;
            }
        }
    }

有关next():,请参阅文档。你打了两次电话。一个在
if
中,另一个在
System.out.println中,它不是。此代码应该抛出
NoSuchElementException
,而不是从
Scanner.next()
获取
null
。你抢先回答了我的问题!:)全部为true,但两次调用
next()
不会导致返回null。没有。请尝试添加其他解决方案。你以前也发过同样的@rD@Thrasher是的。我终于找到了答案。当我开始回答时,我的答案是唯一的。但在我发帖的时候,rD的回复已经收到了。我将在几分钟内尝试更改或删除我的帖子。
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;
            }
        }
    }