Java简单网络程序在Eclipse中工作,而不是在终端中工作

时间:2011-01-11 15:53:27

标签: java eclipse networking terminal

我用Java编写了一个简单的网络程序,它从服务器端的文本文件中读取文本并将其发送到客户端。客户端程序将文本写入客户端计算机上的文本文件。

我在一台计算机上测试程序(localhost),它在Eclipse中运行但是当我尝试从终端运行它时,我在服务器端遇到运行时错误。扫描程序从服务器的文本文件中读取文本似乎是一个问题,但请注意。

这是错误:

线程中的异常" main"显示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)    在java.util.Scanner.myNextLine(libgcj.so.10)    at java.util.Scanner.hasNextLine(libgcj.so.10)    at pkg.TextTransmitServer.sendText(TextTransmitServer.java:50)    在pkg.TextTransmitServer.main(TextTransmitServer.java:26)

4 个答案:

答案 0 :(得分: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,或者扫描的输入行为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();
}

答案 1 :(得分:0)

作为获取问题根源的指针,您可以通过在java命令中添加以下参数来从命令行调试Java应用程序 -

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

然后使用8000端口将eclipse连接到远程调试器。这将有助于您轻松了解问题的根源。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

好的,首先,正如@Kelly所述,检查两种情况下是否正在阅读同一文件。

现在,我感觉您将整个项目从Sun JVM(桌面上的Eclipese)移动到另一个JVM(从例外情况来看,很明显您在Linux上运行,默认JVM)。这可能是由a bug in that JVM

引起的

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