Bizzare System.out.println () в Java-программе - PullRequest
3 голосов
/ 04 августа 2010
String messageFile = ... // Assume messageFile SHOULD have the string "MESSAGE"
System.out.println("The messageFile is: " + messageFile + "!!");

Обычно можно ожидать, что вышеприведенная команда выведет:

The messageFile is: MESSAGE!!!!

Однако вместо этого я получаю:

!!e messageFile is: MESSAGE

Посмотрите, как вышеприведенное утверждение"!!"точки, кажется, обернуть вокруг сообщения.Моя теория состоит в том, что:

String messageFile = ... 

содержит больше символов, чем мое предполагаемое "СООБЩЕНИЕ".В результате он переносит следующий ввод (в данном случае, «!!») в начало сообщения System.out.println ().

Какой персонаж вызывает это?

Дополнительная информация:

Кстати, messageFile инициализируется путем передачи аргумента командной строки в класс Java, myClassA.Конструктор myClassA использует super () для передачи параметра messageFile в myClassB.myClassB передает messageFile в функцию ().

Ответы [ 4 ]

16 голосов
/ 04 августа 2010

Полагаю, у вас есть случайный возврат каретки (\r) в переменной messageFile, который не сопровождается переводом строки (\n).

EDIT -это тесты, как и ожидалось:

class Println {
        public static void main(String[] args) {
                System.out.println("xxxx this \rTEST");
        }
}

Выход:

TEST this 
2 голосов
/ 04 августа 2010

Ваша переменная сообщения может содержать символ '\ r' (возврат каретки) или '\ n' (перевод строки) в конце.Это может привести к тому, что курсор вернется к первому столбцу перед печатью восклицательных знаков.

1 голос
/ 04 августа 2010

Для отладки вы должны напечатать кодовую точку каждого символа messageFile через codePointAt .В результате вы видите именно содержание messageFile.

0 голосов
/ 04 августа 2010

Заменить все возвраты каретки в файле символами новой строки, а затем заменить все двойные строки новой строкой:

messageFile.replace('\r', '\n').replace("\n\n", "\n)

Возврат каретки должен быть запрещен: D

...