2011-01-11 85 views
0

我用Java编写了一个简单的网络程序,它从服务器端的文本文件中读取文本并将其发送给客户端。客户端程序将文本写入客户端计算机上的文本文件。我在一台计算机(本地主机)上测试程序,它在Eclipse中工作,但是当我尝试从终端运行它时,服务器端出现运行时错误。 Scanner从服务器的文本文件中读取文本似乎是个问题,但我很确定。Java简单的网络程序在Eclipse中工作,而不是在终端中

以下是错误:在线程 “主” 显示java.lang.NullPointerException

异常在java.util.regex.Matcher.toMatchResult(libgcj.so.10) 在java.util.Scanner中。在java.util.Scanner.myNextLine(libgcj.so.10)上的myCoreNext(libgcj.so.10) at java.util.Scanner.hasNextLine(java.util.Scanner.myPrepareForNext(libgcj.so.10) (java.util.Scanner.myNextLine(libgcj.so.10) libgcj.so.10) at pkg.TextTransmitServer.sendText(TextTransmitServer.java:50) at pkg.TextTransmitServer.main(TextTransmitServer.java:26)

+3

请提供代码。 – 2011-01-11 15:55:03

+0

这是你的代码? pkg.TextTransmitServer.sendText(TextTransmitServer.java:50)at pkg.TextTransmitServer.main(TextTransmitServer.java:26) – Navi 2011-01-11 15:55:25

回答

1

仔细检查两种情况下是否使用相同的输入文件。打开文件时是否使用完全限定的路径?如果文件不同,这将解释为什么正则表达式与一个正常表达式而不是另一个正常工作。

请在问题中添加两件事。 1)打开文件的代码片段,以及2)正则表达式用法的代码片段。有趣的观察:为什么java.util.Scanner.hasNextLine(libgcj.so.10)使用正则表达式?你有没有通过一个?

不确定你为什么使用'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

的指针于前往您可以通过添加以下参数到Java调试命令行Java应用程序的问题的根源命令 -

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

然后日食连接到使用8000端口远程调试器。这将帮助您轻松找到问题的根本。

0

确保您的扫描仪可以正确处理不同的字符集/控制台。这可能是两个设置中的一个使用例如UTF-8,因此可能会看到单个字符的多个字节(或者,如果您的协议编码字符串的长度,反之亦然)。

0

好的,首先,@Kelly会检查您是否在两种情况下都读取同一文件。

现在,我感觉您已将整个项目从Sun JVM(桌面上的Eclipese)移至另一个JVM(从您的例外中清楚知道您正在Linux上运行,默认JVM)。这可能是由于a bug in that JVM

考虑使用Sun的JVM,而不是GCJ(在Linux默认JVM)

相关问题