1

如果我将扫描仪对象传递给方法,扫描仪会从输入的开头扫描还是继续扫描输入的剩余部分。这是我的代码:

public class Test {
  public void test(Scanner sc) {
    System.out.println(sc.nextLine());
  }

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String str = sc.nextLine();
    System.out.println(str);

    Test t = new Test(sc);
    t.test();
  }
}

// here is the input file:
1 2 3 4 
5 6 7 8
9 1 2 3

我已经在 Windows 和 Linux 上测试了这段代码,但我得到了两个不同的结果

第一个结果在方法测试中,它打印 5 6 7 8

第二个结果很难理解,它打印 1 2 3 4,仍然是输入的第一行。

这是否与不同版本的Java有关,谁能帮我解释一下,谢谢!

4

3 回答 3

0

首先,您的代码中有一个错误>> Test t = new Test(sc)。它使用参数化构造函数,但我没有看到任何。

Q. if I pass a scanner object to a method, will the scanner scan from the beginning of
the input or continued to scan for the remaining part of the input ?

在 Java 中,对象是通过 Ref(对对象堆地址的引用)而不是值(如在原始类型中)传递的。这就是为什么将对象传递给函数不会改变对象的原因。对象保持不变。

问候,拉维

于 2013-04-12T01:18:27.880 回答
0

扫描仪在这两种方法中都是同一个对象——您传递的是对同一个扫描仪的引用。因此,它不知道它是从程序中的一个新位置使用的——如果调用相同的方法,无论什么代码使用它,它都会忠实地做同样的事情。

于 2013-04-12T01:08:58.210 回答
0

我认为你的问题已经到了断线

从一个操作系统到另一个操作系统,新行的定义方式不同。如果您打印的值

System.getProperty("line.separator");

您将看到该属性的值在 Windows 和 Linux 中是不一样的。

我不知道您在哪里编写了输入文件,但它可能包含特定于操作系统的行分隔符。当您在另一个操作系统上运行程序时,您会以不同的结果结束。

我建议您像这样定义扫描仪文件的分隔符

sc .useDelimiter("\n|\r\n");

如果我没记错的话,\n代表 linux 新行,而 \r\n代表 windows 新行。

于 2013-04-15T12:15:45.140 回答