java - 为什么 do-while 循环在这个 Java 程序中没有按预期运行?

标签 java do-while

我一直在编写一个程序,它将获取音乐文件名称的数组并播放它们。我成功地做到了这一点,但是,我想修改一些东西并让它变得更好一点。我试图让音乐以随机顺序播放,但在播放整个列表之前不重复任何歌曲。我几乎可以做到,但我认为我的 do-while 循环有问题。该程序按预期运行大约八首歌曲,但随后它停止播放音乐,而 JVM 继续运行。我正在使用 BlueJ,因为我仍然是一名 AP Comp Sci 学生,所以我意识到我可能无法完成这项任务,但我们将不胜感激任何帮助。我有一个驱动程序“MusicDriver”,它与其他两个类“有一个”关系:“MP3”和“音乐”。

我的 MP3 课:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import javazoom.jl.player.Player;

public class MP3 {
    String filename;
    Player player; 

    public void stopMP3() { if (player != null) player.close(); }

    // play the MP3 file to the sound card
    public void playMP3(String filename) {
    try {
        FileInputStream fis = new FileInputStream(filename);
        BufferedInputStream bis = new BufferedInputStream(fis);
        player = new Player(bis);
    }
    catch (Exception e) {
        System.out.println("Problem playing file " + filename);
        System.out.println(e);
    }

    // run in new thread to play in background
    new Thread() {
        public void run() {
            try { player.play(); }
            catch (Exception e) { System.out.println(e); }
        }
    }.start();
}  
}

我的音乐课:

import java.util.*;

public class Music{
private ArrayList<String> music;

public Music(){music = new ArrayList<String>();}

public int size(){return music.size();}

public void addSong(String song){music.add(song);}

public String getSong(){return music.get(music.size());}

public String getSong(int num){return music.get(num);}

public void removeSong(String song){
    for(int i = 0; i < music.size(); i++){
        if(music.get(i).equals(song)) {music.remove(i); return;}
    }
}

public String toString(){
    String s = "";
    for(int i = 0; i < music.size(); i++){
        s += music.get(i);
    }
    return s;
}
}

我的 MusicDriver 类:

import java.util.*;
import java.io.*;
import javazoom.jl.player.Player;
import java.util.Random;
import java.util.Scanner;
import java.io.FileNotFoundException;

public class MusicDriver{
public static void main(String[] args) throws FileNotFoundException{
    Random r = new Random();
    Scanner s = new Scanner(System.in);
    String line = "";
    int number;

    Music song = new Music();
    song.addSong("1-01-overture.mp3");
    song.addSong("1-03-fortune-teller-2.mp3");
    song.addSong("1-07-prayer.mp3");
    song.addSong("1-08-island-atlas.mp3");
    song.addSong("1-12-warren-report.mp3");
    song.addSong("1-13-avilla-hanya.mp3");
    song.addSong("1-20-war-situation.mp3");
    song.addSong("2-10-fog-of-phantom.mp3");
    song.addSong("2-12-religious-precepts.mp3");
    song.addSong("2-14-box-of-sentiment.mp3");
    song.addSong("3-02-light-everlasting.mp3");
    song.addSong("3-09-viking-spirits.mp3");
    song.addSong("3-12-unsealed.mp3");
    song.addSong("3-16-notice-of-death-reprise-.mp3");
    //14 songs

    ArrayList<Integer> songNums = new ArrayList<Integer>();
    MP3 mp3 = new MP3();
    do{
        if(songNums.size() == song.size()) songNums.clear();

        number = r.nextInt(song.size());
        boolean done = false;
        int counter = 0;
        while(!done){
            for(int i = 0; i < songNums.size(); i++){
                if(number == songNums.get(i).intValue()) {number = r.nextInt(song.size()); counter++;}
            }
            if(counter == 0) done = true;
            else done = false;
        }

        songNums.add(number);
        mp3.playMP3(song.getSong(number));
        System.out.println("Now Playing " + song.getSong(number));
        System.out.println("Enter \"Stop\" to stop playing the song");
        System.out.println("Enter \"n\" to play the next song");
        line = s.nextLine();
        mp3.stopMP3();
    }while(line.equals("n"));
    mp3.stopMP3();
}
}

我对为什么我的程序只是停止播放我的歌曲做了很多研究,但我一直无法找到任何东西。我做到了,如果你在有任何输出之前要求输入,我发现 BlueJ 程序不会打开终端窗口(当你执行“System.out.print()”时出现的东西)但我不认为考虑到这个程序。当我想播放下一首歌曲时,我还确保输入了一个字符串“n”,对于前几首歌曲,它有效,但在第八首歌曲之后,它就停止了。我彻底糊涂了。

最佳答案

我认为唯一的问题在于您用于打乱列表的逻辑。

number = r.nextInt(song.size());
boolean done = false;
int counter = 0;
while(!done){
    for(int i = 0; i < songNums.size(); i++){
        if(number == songNums.get(i).intValue()) {number = r.nextInt(song.size()); counter++;}
    }
    if(counter == 0) done = true;
    else done = false;
}

当生成的随机数已经存在于 songNums 列表中时,您正在生成一个新的随机数。这个新的随机数不会与 songNums 列表的所有数字一起检查。以下更改应该可以解决您的问题。

    boolean done = false;
    while(!done){
        number = r.nextInt(song.size());
        if(!songNum.contains(number)) done = true;
    }

或者,您可以使用 Sasha评论中关于洗牌列表的建议 (Collections.shuffle())。

关于java - 为什么 do-while 循环在这个 Java 程序中没有按预期运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36262155/

相关文章:

java - Tomcat servlet 请求的资源不可用

Java 在验证时执行

javascript - Do/While XMLHttpRequest 将所有调用的结果添加到一个数组

c - 如何使 switch 语句正确循环?

java - Do while 循环比较字符串

javascript - 我的代码没有加载(卡在 do/while 循环?)

java - java 将一个json对象附加到另一个json对象

java - 用于查找 Java/Javascript 的类似重复源代码的自动重构工具?

java - 我应该将源代码放在与源代码相同的文件夹中吗?

java - 模态窗口中的事件处理(Java swing)