2011-01-11 3 views
0

자바에서 간단한 네트워킹 프로그램을 작성하여 서버 측의 텍스트 파일에서 텍스트를 읽어 클라이언트로 보냅니다. 클라이언트 프로그램은 텍스트를 클라이언트 컴퓨터의 텍스트 파일에 씁니다.자바 간단한 네트워킹 프로그램이 터미널이 아닌 이클립스에서 작동합니다.

하나의 컴퓨터 (localhost)에서 프로그램을 테스트 중이며 Eclipse에서 작동하지만 터미널에서 실행하려고하면 서버 측에서 런타임 오류가 발생합니다. 서버의 텍스트 파일에서 텍스트를 읽는 스캐너에 문제가있는 것 같지만 확실합니다. 스레드 "메인"java.lang.NullPointerException이 에

예외 java.util.regex.Matcher.toMatchResult (libgcj.so.10)에서 java.util.Scanner에서 : 여기

오류이다. myCoreNext (libgcj.so.10) at java.util.Scanner.myPrepareForNext (libgcj.so.10) at java.util.Scanner.myNextLine (libgcj.so.10) at java.util.Scanner.hasNextLine (libgcj.so.10) at pkg.TextTransmitServer.sendText (TextTransmitServer.java:50) at pkg.TextTransmitServer.main (TextTransmitServer.java:26)

+3

코드를 제공하십시오 대신 GCJ의 Sun의 JVM (리눅스에서 기본 JVM)을 사용하는 것이 좋습니다 수 있습니다. –

+0

이것은 귀하의 코드입니까? pkg.TextTransmitServer.sendText (TextTransmitServer.java:50) at pkg.TextTransmitServer.main (TextTransmitServer.java:26) – Navi

답변

1

두 경우 모두 동일한 입력 파일을 사용하고 있는지 다시 한 번 확인하십시오. 파일을 열 때 정규화 된 경로를 사용하고 있습니까? 파일이 다르면 정규 표현식이 왜 하나가 아닌 다른 정규 표현식과 함께 작동하는지 설명 할 수 있습니다.

두 가지를 질문에 추가하십시오. 1) 파일이 열리는 방법에 대한 코드 스 니펫, 2) 정규식 사용 코드 스 니펫. 흥미로운 관찰 : 왜 java.util.Scanner.hasNextLine(libgcj.so.10)은 정규식을 사용하고 있습니까? 1 대 1을 통과해야 했습니까?

왜 'hasNextLine()'을 사용하는지 잘 모르십니까? 구분 기호를 줄 구분 기호로 설정 한 후 hasNext()를 시도하십시오. 더 많은 예제는 this page을 참조하십시오.

private static void readFile(String fileName) { 
    try { 
     Scanner scanner = new Scanner(new File(fileName)); 
     scanner.useDelimiter 
     (System.getProperty("line.separator")); 
     while (scanner.hasNext()) { 
     System.out.println(scanner.next()); 
     scanner.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    } 

hasNextLine() 의해 사용되는 구분자 null 않거나 스캔하는 inputline는 null이다. NPE가 던져 질 때 문제가되는 입력 줄을 파일에서 인쇄하십시오.

[pkg.TextTransmitServer.sendText (TextTransmitServer.java:50) 또는 가까운]

try { 
    String currentLine = null; 
    String previousLine = null; 
    while (scanner.hasNext()) { 
     previousLine = currentLine; 
     currentLine= parseLine(scanner.next()); 
    } 
} 
catch (NullPointerException npe) { 
    System.out.println("previous line: " + previousLine); 
    System.out.println("current line: " + currentLine); 
    npe.printStackTrace(); 
} 
+0

Eclipse에서 실행하면 내 Eclipse 작업 영역에 있습니다. 터미널에서 실행할 때 다른 디렉토리에 있습니다. 그러나 두 위치 모두에서 프로그램에 현재 디렉토리를 출력하고 그 위치에 입력 파일을 배치했습니다. –

0

포인터로 점점 : 코드없이이 같은 단지 어둠 속에서 촬영하지만 뭔가 당신이 당신의 자바에 다음과 같은 매개 변수를 추가하여 명령 줄에서 Java 응용 프로그램을 디버깅 할 수 있습니다 문제의 근본은

-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 

을 Command 키 그리고 8000 포트를 사용하여 원격 디버거에 일식을 연결합니다. 이렇게하면 쉽게 문제의 최하층에 도달하는 데 도움이됩니다.

0

스캐너가 다른 문자셋/콘솔을 올바르게 처리 할 수 ​​있는지 확인하십시오. 두 가지 설정 중 하나가 예를 들어 UTF-8은 단일 문자 (또는 프로토콜이 문자열의 길이를 인코딩 할 경우 다른 방법으로)에 대해 다중 바이트를 볼 수 있습니다.

0

먼저, @Kelly는 두 경우 모두 동일한 파일을 읽고 있는지 확인합니다.

이제 전체 프로젝트를 Sun JVM (바탕 화면의 Eclipese)에서 다른 JVM으로 옮겼다는 느낌이 들었습니다. 예외적으로 Linux, 기본 JVM에서 실행중인 것이 확실합니다.이

인해 a bug in that JVM

관련 문제