我用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)
答案 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)