#java #arraylist
#java #arraylist
Вопрос:
Мне было интересно, как ссылаться на ArrayList на метод, отличный от того, в котором он был объявлен. Например, я пишу программу, которая позволяет мне создавать список воспроизведения песен, поэтому в одном методе у меня есть createAPlaylist, а затем в другом методе у меня есть shuffle(). В моем методе воспроизведения я создал ArrayList, но у меня возникли проблемы с использованием этого ArrayList в моем методе shuffle. Ниже приведен некоторый код для контекста:
public static void createAPlaylist() {
try {
System.out.println("We have the following tracks:");
ArrayList<String> songs = new ArrayList<String>();
String firstSong = jukebox.allTracks.get(0).getTitle();
songs.add(firstSong);
for (int index = 0; index < count; index ) {
System.out.println(SPACES (index 1) ". " jukebox.allTracks.get(index).getTitle());
}
System.out.println("Select a track to add to the playlist: ");
int songNumber = input.nextInt();
String songSelected = songs.get(songNumber);
songs.add(songSelected);
input.nextLine();
} catch (Exception e) {
System.out.println("nplease select a valid song number.");
}
}
Комментарии:
1. Не перехватывайте подобные исключения. Вы перехватываете все исключения, включая
RuntimeException
s, такие какNullPointerException
s,ArrayIndexOutOfBoundsException
s иNoSuchElementException
s. Это означает, что вы скрываете причину исключения, просто печатая «пожалуйста, выберите допустимый номер песни». Это затруднит отладку ошибок в вашем коде.2. В идеале вы должны создать
createAPlaylist()
функцию для возврата списка объектов, а затем передать егоshuffle(List<Song> musicList)
функции.3. Вы хотите узнать, что такое «область видимости». Переменные видны только в той области, в которой они определены. Вы объявляете список внутри блока try, поэтому он виден / известен только в этом блоке. Это просто.
Ответ №1:
Для этого и нужны параметры метода:
public static void createAPlaylist() {
ArrayList<String> songs = new ArrayList<>();
shuffle(songs);
}
public static void shuffle(ArrayList<String> songs) {
// Do stuff with your ArrayList here
}
Комментарии:
1. Для записи:
static
может быть опущен, поскольку мы не знаем, что weather Author реализует в Main.java досье.2. Плохой совет. Когда этот метод «заканчивается», список воспроизведения по-прежнему «пропал». Вы решили только половину проблемы с OPs.
Ответ №2:
Вы можете получить arraylist из createAPlaylist
метода и передать его shuffle
методу:
Нравится:
public static List<String> createAPlaylist() {
...
...
...
return songs;
}
/// and then in shuffle method receive that as parameter :
public static void shuffle(List<String> songs){
// access that songs list by
}
Или вы могли бы:
Вместо переменной метода объявите этот arraylist как переменную класса..
Нравится:
public class ClassName{
public static ArrayList<String> songs = new ArrayList<String>();
public static void createAPlaylist() {
...
...
...
// reset the songs.
songs = new ArrayList<String>();
...
}
/// and then in another method:
public static void suffle(){
// access that songs list by
List<String> createdSongs = ClassName.songs;
}
Ответ №3:
В Java переменные доступны только в контексте, в котором они созданы, поэтому, если вы создаете ArrayList
внутри метода, вы не сможете получить к нему доступ за пределами этого метода, если вы не сохраните его в классе метода или не вернете переменную из метода, который она создала.
Вы можете либо объявить ArrayList
внешнюю часть метода как поле класса, например:
public class Foo {
private static ArrayList<String> arrayList = new ArrayList<String>();
public static void createAPlaylist() {
arrayList.add();
etc...
}
}
Или вы могли бы вернуть ArrayList
из метода следующим образом:
public class Foo {
public static void main(String[] args) {
ArrayList<String> arrayList = createAPlaylist();
}
public static ArrayList<String> createAPlaylist() {
ArrayList<String> songs = new ArrayList<String>();
// Your code here
// Note that you have to return the list from
// inside the catch block!
// I’d recommend creating the ‘songs’ ArrayList
// outside of the ‘try’ block, so that you can
// have a fallback if something fails in the ‘try’
return songs;
}
}
Я не знаю, хотите ли вы, чтобы все это было статичным. Я бы подумал, что он будет работать лучше как нестатический, но это вопрос для другого вопроса, поэтому я оставил его как есть в примерах.
Извините, если это не отформатировано идеально — я нахожусь на мобильном устройстве, и у меня нет IDE.