繁体   English   中英

Java简单网络程序可在Eclipse中运行,而不是在终端中运行

[英]Java simple networking program works in Eclipse, not in terminal

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

我正在一台计算机(本地主机)上测试该程序,它可以在Eclipse中运行,但是当我尝试从终端运行该程序时,在服务器端会出现运行时错误。 从服务器的文本文件中读取文本的扫描仪似乎存在问题,但是我要确定。

这是错误:

java.util.Scanner.myCoreNext(libgcj.so.10)处的java.util.regex.Matcher.toMatchResult(libgcj.so.10)处的线程“ main”中的java.lang.NullPointerException。 myPrepareForNext(libgcj.so.10)位于java.util.Scanner.myNextLine(libgcj.so.10)位于java.util.Scanner.hasNextLine(libgcj.so.10)位于pkg.TextTransmitServer.sendText(TextTransmitServer.java:50 )在pkg.TextTransmitServer.main(TextTransmitServer.java:26)

仔细检查两种情况下您是否使用相同的输入文件。 打开文件时,您是否使用标准路径? 如果文件不同,则可以解释为什么一个正则表达式可以使用一个而不使用另一个。

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

不知道为什么要使用“ hasNextLine()”。 将分隔符设置为行分隔符后,尝试使用hasNext()。 有关更多示例,请参见此页面

   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();
}

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

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

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

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

好的,首先,因为@Kelly状态检查两种情况下您是否正在读取同一文件。

现在,我感觉到您将整个项目从Sun JVM(台式机上的Eclipese)迁移到了另一个JVM(从您的例外情况来看,很明显,您正在Linux(默认JVM)上运行)。 这可能是由于该JVM中的错误所致

考虑使用Sun的JVM代替GCJ(Linux上的默认JVM)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM