java 将扫描仪对象传递给方法

6fe3ivhb  于 2023-02-15  发布在  Java
关注(0)|答案(3)|浏览(184)

如果我将一个scanner对象传递给一个方法,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
第二个结果很难理解,它打印了1234,仍然是输入的第一行。
这是否与Java的不同版本有关,有人能为我解释一下吗,谢谢!

slwdgvem

slwdgvem1#

在两个方法中,scanner是同一个对象--你传递的是对同一个scanner的引用,所以,它不知道它是从程序中的一个新位置被使用的--如果调用了相同的方法,不管什么代码在使用它,它都会忠实地做同样的事情。

vq8itlhq

vq8itlhq2#

首先,你的代码中有一个错误〉〉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(对象堆地址的引用)传递的,而不是通过值传递的(如在基元类型中)。这就是为什么将对象传递给函数不会改变对象的原因。对象保持不变。
你好拉维

shstlldc

shstlldc3#

我觉得你的问题必须解决。
对于不同的操作系统,新行的定义方式不同。如果打印

System.getProperty("line.separator");

您将看到该属性的值在Windows和Linux中是不同的。
我不知道你在哪里写的输入文件,但它可能包含一个操作系统特定的行分隔符。当你运行你的程序在另一个操作系统,你会结束,但不同的结果。
我建议您像这样定义扫描仪文件的分隔符

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

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

相关问题