Java: Почему мой метод toString выводит неверную информацию? - PullRequest
4 голосов
/ 19 апреля 2020

У меня есть абстрактный суперкласс, который имеет два атрибута: int и string. Я переопределил метод toString в нем, а также в его подклассе, который имеет один дополнительный атрибут (LocalDate). Однако по какой-то причине, которую я не понимаю, когда я печатаю информацию подкласса toSring, значение int изменяется.

Это то, что у меня есть в суперклассе:

public abstract class File {
private int id;
private String text;

public File(int newId, String newText) throws IllegalArgumentException {
      id(newId);
      text(newText);
}

public int id() {
   return id;
}

public void id(int e) throws IllegalArgumentException {      
   if (e <= 0) {
      throw new IllegalArgumentException();
   }
   else {
      id = e;
   }
}

public String text() {
   return text;
}

public void text(String aText) throws IllegalArgumentException {
   if (aText == null || aText.length() == 0) {
      throw new IllegalArgumentException();
   }
   else {
      text = aText;
   }
}

@Override
public String toString() {
   return '"' + id() + " - " + text() + '"';
}

Тогда в подклассе у меня есть это:

public class DatedFile extends File {
private LocalDate date;

public DatedFile (int newId, LocalDate newDate, String newText) throws IllegalArgumentException {
   super(newId, newText);
   date(newDate);
}

public LocalDate date() {
   return date;
}

public void date(LocalDate aDate) throws IllegalArgumentException {
   if (aDate == null) {
      throw new IllegalArgumentException();
   }
   else {
      date = aDate;
   }
}
@Override
public String toString() {
   return '"' + id() + " - " + date + " - " + text() + '"';
}

Я проверил это так:

public static void main(String[] args) {
   LocalDate when = LocalDate.of(2020, 1, 1);
   DatedFile datedFile1 = new DatedFile(999, when, "Insert text here");
   System.out.println(datedFile1);

Он напечатал: «1033 - 2020-01-01 - Вставьте текст здесь». Однако, если я использую следующий код

System.out.println(datedFile1.id());

, он напечатает правильный идентификатор (999). Поэтому я предполагаю, что что-то с toString портит это, но я понятия не имею, в чем проблема.

PS. Я новичок, и мне жаль, если я включил слишком много кода, но, поскольку я не знаю, в чем проблема, я действительно не знаю, что имеет отношение, а что нет.

Ответы [ 3 ]

12 голосов
/ 19 апреля 2020

Ваша проблема здесь:

return '"' + id() + " - " + date + " - " + text() + '"';

id() возвращает int, а '"' представляет собой char, который является числительным c типом. Таким образом, '"' + 999 - это 1033, а не "999.

Чтобы решить проблему, используйте строку вместо символа:

return "\"" + id() + " - " + date + " - " + text() + "\"";
1 голос
/ 19 апреля 2020

Измените свой метод toString() с '"' на " \"".

'"' - это символ (который хранится внутри как целое число), поэтому добавление его с помощью id() дает результат, который вы видите.

0 голосов
/ 30 апреля 2020

или с использованием строковой интерполяции :

return '\" ${id()} - ${date} - ${text()} \"';
...