Setter po wyświetleniu jest pusty - dlaczego?

0

Cześć,
Mam problem z kodem w InteliJ. Kiedy w wywołanej metodzie przy pomocy Scannera inicjalizuję 3 zmienne, z czego dwie typu String, a potem za pomocą innej metody chcę je wyświetlić, to pierwsza w kolejności wyświetlania zmienna typu String jest pusta. Nie mam pojęcia z czego to wynika. Proszę o pomoc w znalezieniu błędu.

screenshot-20200727130310.png

package Aplikacja;

import Dane.Song;
import Metody.AppLogic;

import java.util.Scanner;

public class CdBurnApp {
    public static void main(String[] args) {

        AppLogic appLogic = new AppLogic();
        Scanner scanner = new Scanner(System.in);
        int chooseOption = -1;

        final int dodajPiosenke = 1;
        final int wyswietlListe = 2;
        final int zamknijProgram = 0;

        do {
            System.out.println("Witaj w programie do nagrywania plyt CD Audio. Wybierz opcje: ");
            System.out.println(dodajPiosenke + " .Dodaj piosenke do listy");
            System.out.println(wyswietlListe + " .Wyswietl zapisana liste");
            System.out.println(zamknijProgram + " .Zamknij program");

            chooseOption = scanner.nextInt();

            switch (chooseOption) {

                case dodajPiosenke:
                    Song song = new Song();
                    System.out.println("Podaj wykonawce: ");
                    song.setSinger(scanner.nextLine());
                    scanner.nextLine();
                    System.out.println("Podaj tytul utworu: ");
                    song.setSongTitle(scanner.nextLine());
                    System.out.println("Podaj czas trwania w sekundach: ");
                    song.setSongDuration(scanner.nextInt());
                    appLogic.addSong(song);
                    break;
                case wyswietlListe:
                    appLogic.printInfo();
                    break;
                case zamknijProgram:
                    System.out.println("Nastapi zamkniecie programu.");
                    break;
                default:
                    System.out.println("Nieprawidlowy wybor!");
            }
        } while (chooseOption != zamknijProgram);

        scanner.close();
    }

}
package Dane;

public class Song {
    private String singer;
    private String songTitle;
    private int songDuration;

    public Song() {
    }

    public String getSinger() {
        return singer;
    }

    public void setSinger(String singer) {
        this.singer = singer;
    }

    public String getSongTitle() {
        return songTitle;
    }

    public void setSongTitle(String songTitle) {
        this.songTitle = songTitle;
    }

    public int getSongDuration() {
        return songDuration;
    }

    public void setSongDuration(int songDuration) {
        this.songDuration = songDuration;
    }

    public String getInfo(){
        return ("" + singer + " - " + songTitle + ", " + songDuration + " sec"); 
// **zmienna singer nie jest wyświetlana, tak jakby nie była inicjalizowana**
    }
}

Tutaj klasa z metodami

package Metody;

import Dane.Song;

public class AppLogic {

    private final int durationLimit = 4800;
    private int savedSpace = 0;
    private final int maxSongNr = 50;
    private int songList = 0;

    Song[] songsTab = new Song[maxSongNr];

    public void addSong(Song song){
        if (savedSpace < durationLimit){
            if (songList < maxSongNr){
                savedSpace = savedSpace + song.getSongDuration();
                songsTab[songList] = song;
                songList++;
            } else {
                System.out.println("Przekroczono limit 40 utworow.");
            }
        } else {
            System.out.println("Brak miejsca na plycie, przekroczono 80 min.");
        }
    }

    public void printInfo(){
        for (int i = 0; i < songList; i++)
            System.out.println(songsTab[i].getInfo());
    }
}
3
                case dodajPiosenke:
                    Song song = new Song();
                    System.out.println("Podaj wykonawce: ");
                    song.setSinger(scanner.nextLine());
                    scanner.nextLine();
                    System.out.println("Podaj tytul utworu: ");
                    song.setSongTitle(scanner.nextLine());
                    System.out.println("Podaj czas trwania w sekundach: ");
                    song.setSongDuration(scanner.nextInt());
                    appLogic.addSong(song);
                    break;

czemu po "Podaj wykonawcę:" masz dwa scanner.nextLine(); z czego wyników jedego nie zapisujesz, a po "Podaj tytul utworu: " masz tylko jeden scanner.nextLine()?

W wiele prościej by się to analizowało, jeśli byś powiedział, która zmienna jest null. Umiesz korzystać z debugera?

2

Wymieszałeś jakoś scanner.nextLine(); dziwacznie. Patrząc na to co tam stworzyłeś to zgodnie z jakąś logiką wywołanie scanner.nextLine(); powinno być przed setterem wykonawcy a nie po.

0

Usunąłem tę niepotrzebną linijkę i tak teraz wygląda wprowadzanie:

screenshot-20200727133259.png

0

Zamiast zgadywać i pokazywaś screenshoty weź łaskawie kliknij lewym klawiszem myszy w pole po prawej od numerów linii w edytorze na linii 30. Pojawi sie magiczna czerwona kropka. Następnie klikasz w robaka (tak jak już to robisz) żeby odpalić debuger i potem wykonujesz linijki jedna po drugiej robiąc step-over aż nie odkryjesz gdzie jest problem.

2

Zgaduje hasło - po chooseOption = scanner.nextInt();, ale przed switch, powinien być jeden scanner.nextLine() żeby wczytać koniec linii

0
KamilAdam napisał(a):

Zgaduje hasło - po chooseOption = scanner.nextInt();, ale przed switch, powinien być jeden scanner.nextLine() żeby wczytać koniec linii

Trafiony, zatopiony :) bardzo dziękuję za pomoc, początki są najtrudniejsze :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1