2015-05-03 3 views
0

Я пытаюсь написать метод, который добавит информацию о песне (ввод пользователя) в базу данных. Когда пользователь добавит детали композиции (имя, исполнитель, размер файла, продолжительность), их следует сохранить в первом свободном слоте для песни (всего 4 слота для песни), а затем вернуться к интерфейсу меню.Переменные являются нулевыми, даже после присвоения им значения (Java)

Но когда я пытаюсь добавить вторую песню, первый слот всегда пуст, как если бы данные пользовательские входы не были сохранены. Я пробовал переходить через отладчик, и когда я ввожу имя, исполнителя и т. Д., Они все сохраняются в объекте song1. Но когда я вернусь, чтобы ввести вторую песню, объект song1 имеет значения: name = null, artist = null, filesize = 0, duration = 0.

Я был здесь уже часами и сегодня действительно смущенный, любая помощь будет потрясающей!

класс SongDatabase: класс

public class SongDatabase { 

Scanner console = new Scanner(System.in); 

public void addNewSong() { 

    Song song1 = new Song(); 
    Song song2 = new Song(); 
    Song song3 = new Song(); 
    Song song4 = new Song(); 


if (song1.isEmpty()) {   
    System.out.println("Name of song:"); 
    song1.setName(console.next()); 

    System.out.println("Artist:"); 
    song1.setArtist(console.next()); 

    System.out.println("File size (MB):"); 
    song1.setFileSize(console.nextInt()); 

    System.out.println("Duration (seconds):"); 
    song1.setDuration(console.nextInt()); 
    System.out.println("Song successfully added."); 
    System.out.println(""); 
} 

else if (song2.isEmpty()) {   
    System.out.println("Name of song:"); 
    song2.setName(console.next()); 

    System.out.println("Artist:"); 
    song2.setArtist(console.next()); 

    System.out.println("File size (MB):"); 
    song2.setFileSize(console.nextInt()); 

    System.out.println("Duration (seconds):"); 
    song2.setDuration(console.nextInt()); 
    System.out.println("Song successfully added."); 
    System.out.println(""); 
} 

else if (song3.isEmpty()) {   
    System.out.println("Name of song:"); 
    song3.setName(console.next()); 

    System.out.println("Artist:"); 
    song3.setArtist(console.next()); 

    System.out.println("File size (MB):"); 
    song3.setFileSize(console.nextInt()); 

    System.out.println("Duration (seconds):"); 
    song3.setDuration(console.nextInt()); 
    System.out.println("Song successfully added."); 
    System.out.println(""); 
} 

else if (song4.isEmpty()) {   
    System.out.println("Name of song:"); 
    song4.setName(console.next()); 

    System.out.println("Artist:"); 
    song4.setArtist(console.next()); 

    System.out.println("File size (MB):"); 
    song4.setFileSize(console.nextInt()); 

    System.out.println("Duration (seconds):"); 
    song4.setDuration(console.nextInt()); 
    System.out.println("Song successfully added."); 
    System.out.println(""); 
} 

else { 
    System.out.println("The database is currently full. Please delete a song before adding a new one."); 
} 

Песня:

public class Song { 

private String name, artist; 
private int fileSize, duration; 

public Song(String name, String artist, int fileSize, int duration) { 
    name = ""; 
    artist = ""; 
    fileSize = 0; 
    duration = 0; 
} 

public Song(){} 

public boolean isEmpty() { 
    if (this.name == null && this.artist == null && this.fileSize == 0 && this.duration == 0) return true; 
    else return false; 
} 

public void setName(String inputName) { 
    inputName = name; 
} 

public String getName() { 
    return name; 
} 

public void setArtist(String inputArtist) { 
    artist = inputArtist; 
} 

public String getArtist() { 
    return artist; 
} 

public void setFileSize(int inputFileSize) { 
    if (inputFileSize>0){ 
     fileSize = inputFileSize; 
    } 
} 

public int getFileSize() { 
    return fileSize; 
} 

public void setDuration(int inputDuration) { 
    if (inputDuration>0) { 
    duration = inputDuration; 
    } 
} 

public int getDuration() { 
    return duration; 
} 
} 
+0

Я очень рекомендую изучить массивы. – chrylis

+0

ваша программа имеет много избыточного кода, реорганизуйте его. Поместите этот код в метод. – underdog

ответ

1

После ввода addNewSong() метод создания четырех Song объектов и хранить их в локальных переменных. Локальные переменные теряются при выходе из метода, поэтому каждый раз, когда вы вводите addNewSong(), у вас есть четыре совершенно новые песни. Вам, вероятно, нужно сохранить песни в полях классов и инициализировать их раньше (подобно вашему console). Просто переместите эти четыре строки из addNewSong() метода:

Song song1 = new Song(); 
Song song2 = new Song(); 
Song song3 = new Song(); 
Song song4 = new Song(); 

Кроме того, я бы посоветовал вам рассмотреть возможность использования массива или List песен. При добавлении новых функций или увеличении количества песен ваш код быстро станет бесполезным.

+0

Ahh thankyou! Мне не разрешено использовать массивы для этого задания, что немного больно. – Lachie

+0

Как мне «хранить песни в полях классов и инициализировать их раньше»? Когда я перемещаю эти четыре строки из метода, я получаю ошибку «не могу найти символ - переменная song1». – Lachie

0

Вы инициализируете песню1..4 каждый раз, когда вы вызываете метод addNewSong(). Вам нужно выполнить экстернализацию инициализации, возможно, в конструкторе.

Кстати, я бы рассмотреть возможность использования ArrayList<Song> для более гибкой реализации

0

Прежде всего вы должны понять, о локальных переменных и области видимости. Во-вторых, если ваши слоты исправлены, лучше используйте Array.

Song[] songs = new Songs[4]; 
for(int i=0;i<songs.length;i++){ 
    // Get input for song from user and use constructor 
    songs[i] = new Song(name,artist,size,duration); 
} 

Когда у вас есть конструктор, почему вам нужно устанавливать атрибуты индивидуально? Вы должны были использовать сам конструктор. И если слоты не фиксированы, используйте ArrayList.

List<Song> songsList = new ArrayList<Song>(); 
// Get songs from user and add them to list. 
Смежные вопросы