2013-04-12 7 views
0

메서드에 스캐너 개체를 전달하면 스캐너가 입력의 처음부터 스캔하거나 입력의 나머지 부분을 계속 스캔하게됩니까? 내가 테스트 윈도우와 리눅스 모두에서이 코드를스캐너 개체를 메서드에 전달

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 

,하지만 난 두 개의 서로 다른 결과

첫 번째 결과는 방법 테스트에

, 그것은 5 6 7 8

인쇄 가지고 : 여기 내 코드입니다

두 번째 결과는 이해하기 어렵습니다. 1 2 3 4, 여전히 입력의 첫 번째 줄을 인쇄합니다.

다른 Java 버전과 관련이 있습니까? 누군가 나를 설명해 주시겠습니까? 감사합니다.

+0

반품 배송이란 무엇입니까? – alaska

+0

'\ n'은 캐리지 리턴 문자입니다 – Zyerah

+0

반송 차이가이 결과에 어떻게 영향을 줍니까? – alaska

답변

0

스캐너는 두 가지 방법 모두에서 동일한 개체입니다. 즉, 동일한 스캐너에 대한 참조를 전달하는 것입니다. 따라서 프로그램의 새로운 위치에서 사용된다는 단서가 없습니다. 같은 메서드가 호출되면 코드가 사용하는 것과 상관없이 동일한 작업을 충실하게 수행합니다.

+0

제 생각에는 메소드에 대한 참조를 전달하므로 하나의 객체 만 있습니다. 따라서 테스트 메소드에서 nextLine을 호출하면 파일의 두 번째 줄을 가져와야합니다. 맞습니까? – alaska

+0

@alaska 스캐너가 어디에서 왔는지 알 수 있습니다. – Patashu

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 (개체 힙 주소 참조)에 의해 전달됩니다. 그래서 Object를 함수로 전달해도 Object가 변경되지 않습니다. 객체는 동일하게 유지됩니다.

감사합니다, 라비

+2

실제로 자바에서 대부분의 변수는 객체이기 때문에 자바가 값으로 전달된다고 생각합니다. 실제로 객체 참조의 복사본을 메소드에 전달합니다. – alaska

+0

이것은 c 또는 C++에서 포인터를 전달하는 것과 같습니다. 서브 루틴에서 오브젝트를 수정하면 글로 z 오브젝트도 변경되어야합니다. 사실, 우리는 오직 하나의 객체만을 가지고 있습니다. – alaska

+0

그것은 '변경'이 의미하는 것에 따라 달라지며, 메소드 로컬 참조에 새로운 값을 할당하면 원래 값은 변경되지 않습니다. 그러나, 예를 들어, ArrayList의 메소드 로컬 참조에 항목을 추가하면 'original'ArrayList에 새 값이 포함됩니다. –

0

나는 당신의 문제가 the break line에있다 생각합니다.

개행은 OS마다 다른 방식으로 정의됩니다.

System.getProperty("line.separator"); 

의 값을 인쇄하면 Windows 및 Linux에서 속성 값이 동일하지 않은 것을 알 수 있습니다.

입력 파일을 어디에서 작성했는지 알 수는 없지만 OS 관련 줄 구분 기호가있을 수 있습니다. 다른 OS에서 프로그램을 실행하면 종료되지만 다른 결과가 나타납니다. 내가 잘못 아니에요 경우이

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

처럼 스캐너 파일의 구분 기호를 정의하는 것이

나는 는 \ 연구 \ n 창문 새로운 나타낸다 \ n는 리눅스 새로운 라인을 나타냅니다 제안 선.

관련 문제