Простая сетевая программа на Java работает в Eclipse, а не в терминале - PullRequest
0 голосов
/ 11 января 2011

Я написал простую сетевую программу на Java, которая читает текст из текстового файла на стороне сервера и отправляет его клиенту.Клиентская программа записывает текст в текстовый файл на клиентском компьютере.

Я тестирую программу на одном компьютере (localhost), и она работает в Eclipse, но когда я пытаюсь запустить ее из терминала,Я получаю ошибку во время выполнения на стороне сервера.Кажется, это проблема со сканером, который читает текст из текстового файла сервера, но я уверен, что.

Вот ошибка:

Исключение в потоке "основной" Java.lang.NullPointerException в java.util.regex.Matcher.toMatchResult (libgcj.so.10) в java.util.Scanner.myCoreNext (libgcj.so.10) в java.util.Scanner.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.TextTransmit(TextTransmitServer.java:26)

Ответы [ 4 ]

1 голос
/ 11 января 2011

Дважды проверьте, что вы используете один и тот же входной файл в обоих случаях. Используете ли вы полные пути при открытии файла? Если файлы разные, это объясняет, почему регулярное выражение работает с одним, а не с другим.

Пожалуйста, добавьте две вещи к вопросу. 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();
}
0 голосов
/ 11 января 2011

Хорошо, во-первых, @Kelly заявляет, проверяют, читаете ли вы один и тот же файл в обоих случаях.

Теперь у меня возникает ощущение, что вы переместили весь свой проект из Sun JVM (Eclipese на вашем рабочем столе) в другую JVM (из ваших исключений очевидно, что вы работаете в Linux, JVM по умолчанию). Это может быть связано с ошибкой в ​​этой JVM

Рассмотрите возможность использования JVM от Sun вместо GCJ (JVM по умолчанию в Linux)

0 голосов
/ 11 января 2011

Убедитесь, что ваш сканер может правильно обрабатывать различные наборы символов / консоли. Возможно, одна из двух установок использует, например, UTF-8 и, следовательно, может видеть многобайтовые символы для одного символа (или, наоборот, если ваш протокол кодирует длину строки).

0 голосов
/ 11 января 2011

В качестве указателя для получения доступа к корню проблемы вы можете отладить ваше Java-приложение из командной строки, добавив следующие параметры в вашу команду Java:

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

, а затем подключите Eclipse к удаленному отладчику.используя 8000 порт.Это поможет вам легко добраться до сути вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...