디버그 할 작은 테스트를 작성했는데 설명하는 내용을 볼 수 있습니다 (JTextField
은 아니지만 Scanner
에 있지만 증상은 비슷합니다). 두 가지 상황에서 결과가 일치하지 않는 것처럼 보이지만 자바가 처리하고 문자를 이스케이프하는 방식에 대해 조금 더 알 수 있습니다.
package com.WindThunderStudio.PrintLine;
import java.util.Scanner;
public class Tester {
public static void main(String[] args) {
System.out.println("Line 1");
System.out.println("\n");
System.out.println("Line 2");
//output:
// Line 1
//
//
//
// Line 2
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
//output: "\n" for "\n", no line feed added.
}
}
일부 디버깅
System.out.println("\n");
의 라인을 실행할 때 문자열이 예는,
[<line_feed>]
, 우리는 자바 디버거를 보면, 탈출없이 처리 알고 우리를 인도 우리가 JDK의 소스 코드에있을 때 "가변"패널. 이 문자열의 아무 것도 변경되지 않으므로 기호가 이스케이프되지 않습니다. 우리가 Scanner
로부터 입력을 읽을 때
그러나 (이 상황에서 둘 다 표준 System.in
스트림에서 사용자의 입력을 읽고 Scanner
에서와 JTextField
에서 읽기 있기 때문에, 매우 비슷하게 귀하의 경우와 가정, 그리고 생산 같은 "불일치") 문자열 "\ n"은
[\\, n] // (the char '\' is escaped properly)
과 같이 처리되며 줄 바꿈이 감지되지 않습니다. 보다 구체적이기 때문에, 우리는 java.io.PrintStream의 클래스의 방법 write(String s)
에 대해 얘기 : 문자가 "\"자동으로 이스케이프되기 때문에
이
private void write(String s) {
try {
synchronized (this) {
ensureOpen();
textOut.write(s);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush && (s.indexOf('\n') >= 0))
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
,이 같은 "N"아무것도 "로 연결되지 않습니다 \ n "이 (가) 감지되었으므로 새 줄 바꿈이 추가되지 않고 입력이있는 그대로 인쇄됩니다.
그것은 JDK는 너무 다른 캐릭터의 두 가지 소스를 취급 지금 왜 실제로 나를 호기심하게, 우리는 일부 특수 문자를 추가하면 내가 (코드에서 자바 String
로 인쇄 할 때, 자바 컴파일러는 이미 제대로 탈출 볼 수 있다고 가정 String에서 컴파일을 통과하려면 제대로 이스케이프 처리해야합니다. 하지만 사용자 입력에 대해서는 시스템에서 "의미"를 확인하지 않고 그대로 이스케이프 처리하는 것이 더 중요합니다.
혼란 스럽습니다. 입력으로'\ n'을 (를) 입력하셨습니까? 왜 그게 새로운 라인을 출력할까요? 당신은'\ n'이 Java _source code_에서 나타내는 것과 혼동스러워합니다. –