Странное форматирование текста в Java при ручной компиляции вместо использования netbeans

#java

#java

Вопрос:

В моем университете мы регулярно получаем задания по программированию, которые (по крайней мере, на данный момент) обычно касаются консольного программирования. Когда я создаю свои программы в Netbeans и оттуда компилирую и запускаю, все работает так, как ожидалось… Однако при ручной компиляции с использованием javac filename.java и при запуске с использованием java filename я получаю ошибки форматирования wierd при распечатке строк… (System.out.println и System.out.printf)

Возьмите это в качестве примера. Я распечатываю содержимое таблицы, которая при запуске в Netbeans выглядит следующим образом:

 Hybel Leietager      Saldo
--------------------------
1A    Ole Johan     6000
1B    Erik Smith    12000
1C    TOM HYBEL     0
1D    Alan Turen    9000
1E    Tim Verner    33000
1F    Anders Tanen  4999
2A    Torvald Linus 9000
2B    Rikard Stall  5001
2C    Bill Weitz    10000
2D    Steve Job     15000
2E    Steve Woz     123
2F    Denis Rich    2400
3A    James Goblin  88000
3B    Mark Sukker   456000
3C    Karl Bagasje  6000
3D    TOM HYBEL     0
3E    Ada Love      250
3F    Don Knut      55000

Periode: 9/2011
Total fortjeneste: 1400500
  

Однако при ручной компиляции и запуске я получаю это:

 Hybel Leietager      Saldo
--------------------------
    6000 Johan
   12000k Smith
    0TOM HYBEL
   9000an Turen
   33000 Verner
 4999Anders Tanen
9000 Torvald Linus
 5001Rikard Stall
   10000l Weitz
    15000e Job
    123eve Woz
   2400nis Rich
 88000ames Goblin
  456000k Sukker
 6000Karl Bagasje
    0TOM HYBEL
     250 Love
     55000nut

Periode: 9/2011
Total fortjeneste: 1400500
  

Я не понимаю, функция, выводящая это, представляет собой простой цикл for с System.out.println или printf… Кто-нибудь понимает, почему это происходит?

Вот код, немного сложный для понимания, поскольку он написан на норвежском (я знаю, плохая практика, все это должно быть на английском… но мы обязаны делать это в классе, плохие учителя, ПЛОХИЕ!)

В принципе, lengdenAvLengsteNavn() находит самое длинное имя (указано в разделе «Leietager»). Genereroversiktop() создает строку заголовка с требуемым интервалом (в зависимости от самого длинного имени). Строка заголовка — это то, что гласит «Hybel Leietager …..Saldo». horizontalSkille() выводит разделитель по горизонтали («———….»), и hybelOversiktLinje () фактически печатает строку, представляющую hybel (кондо), с правильным интервалом… Как вы можете видеть, табуляции или / r не используются…

 private void skrivOversikt () {
    System.out.println("*** Hybel Oversikt *** n");
    String oversiktTop = genererOversiktTop();
    System.out.println(oversiktTop);
    System.out.println(horizontalSkille (oversiktTop.length()));

    for(int i = 0; i < etasjer.length; i  ) {
        Etasje etasje = etasjer[i];
        for(int j = 0; j < etasje.hybler().length; j  ) {
            Hybel hybel = etasje.hybler()[j];
            System.out.print(hybelOversiktsLinje (oversiktTop, hybel)   "n");
        }
    }

    System.out.println();
    System.out.println("Periode: "   innevaerendeMaaned   "/"   innevaerendeAar);
    System.out.println("Total fortjeneste: "   totalFortjeneste);
} //Skriver ut en oversikt over alle hybler, leietagere og deres saldo

private String genererOversiktTop () {
    String oversiktsTop = "Hybel Leietager";
    int leietagerSaldoSkille = lengdenAvLengsteNavn() - "Leietager".length();

    for (int i = 0; i < leietagerSaldoSkille; i  ) {
        oversiktsTop  = " ";
    }

    return oversiktsTop   " Saldo";
}

private String horizontalSkille (int lengde) {
    String skille = "";

    for (int i = 0; i < lengde; i  ) {
        skille  = "-";
    }

    return skille;
}

private String hybelOversiktsLinje (String oversiktsTop, Hybel hybel) {
    int leietagerIndex = oversiktsTop.indexOf("Leietager");
    int saldoIndex = oversiktsTop.indexOf("Saldo");
    String linje = hybel.romNavn();

    while (linje.length() < leietagerIndex) {
        linje  = " ";
    }

    linje  = hybel.leietagerNavn();

    while (linje.length() < saldoIndex) {
        linje  = " ";
    }

    return linje   hybel.saldo();
}

private int lengdenAvLengsteNavn () {
    int lengsteLengde = 0;

    for (int i = 0; i < etasjer.length; i  ) {
        for (int j = 0; j < etasjer[i].hybler().length; j  ) {
            Hybel hybel = etasjer[i].hybler()[j];

            if (hybel.leietagerNavn().length() > lengsteLengde)
                lengsteLengde = hybel.leietagerNavn().length();
        }
    }

    return lengsteLengde;
}
  

Комментарии:

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

Ответ №1:

Вы печатаете 'r' символ после имени. Этот символ интерпретируется по-разному на этих двух терминалах.

Комментарии:

1. @RobinHeggelundHansen возможно, это уже включено в hybel.leietagerNavn() строку.

Ответ №2:

Я думаю, потому что выходные консоли разные. Каждый из них обрабатывает специальные символы, такие как табуляция, по-разному.