将扫描仪对象传递给方法

时间:2013-04-12 01:01:32

标签: java java.util.scanner

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

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有关,有人可以帮我解释一下,谢谢!

3 个答案:

答案 0 :(得分:0)

扫描程序在两种方法中都是相同的对象 - 您正在传递对同一扫描程序的引用。因此,它无法从程序中的新位置使用它 - 如果调用相同的方法,无论使用什么代码,它都将忠实地执行相同的操作。

答案 1 :(得分:0)

首先,您的代码中存在错误>>测试t =新测试(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(引用对象堆地址)而不是值(如原始类型)传递。这就是为什么将Object传递给函数不会更改Object的原因。对象保持不变。

此致 拉维

答案 2 :(得分:0)

我认为您的问题必须the break line

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

的值
System.getProperty("line.separator");

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

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

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

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

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