Head First Java - 创建第一个音乐播放器错误

时间:2013-12-15 14:06:23

标签: java midi

按照HeadFirstJava配方创建一个非常小的音乐播放器我​​遇到了麻烦。我按照书中的代码但它仍然有一些错误...当我第一次编译它时它给了我这个错误:

Dez 15, 2013 4:13:02 PM java.util.prefs.WindowsPreferences 
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

在谷歌搜索错误后,我发现我应该创建HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs,并在注册表中为JavaSoft提供完整的权限。这确实解决了问题但只是部分解决了。代码汇编,声音由计算机发出但程序不会关闭util我点击 CTRL + C 。这是代码:

import javax.sound.midi.*;//importam pachetul sound.mini 

public class MiniMiniMusicApp {

public static void main (String [] args) {

  MiniMiniMusicApp mini = new MiniMiniMusicApp();
  mini.play();
} //inchidem main

public void play() {

  try {

    Sequencer player = MidiSystem.getSequencer();
    player.open();

    Sequence seq = new Sequence(Sequence.PPQ, 4);

    Track track = seq.createTrack();

    //ShortMessage first = new ShortMessage();
    //first.setMessage(192, 1, 102, 0);
    //MidiEvent noteOn1 = new MidiEvent(first, 1);
    //track.add(noteOn1);


    ShortMessage a = new ShortMessage();
    a.setMessage(144, 1, 44, 100);
    MidiEvent noteOn = new MidiEvent(a, 1);
    track.add(noteOn);

    ShortMessage b = new ShortMessage();
    b.setMessage(128, 1, 44, 100);
    MidiEvent noteOff = new MidiEvent(b, 16);
    track.add(noteOff);

    player.setSequence(seq);

    player.start();

  } catch (Exception ex) {
    ex.printStackTrace();
  }
} //inchidem play
} 

我想提一下,我没有使用任何GUI,而且我是一个新手。任何帮助,将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:3)

MIDI音序器是一个在后台运行的特殊线程。只要它处于活动状态(或者,事实上,任何非守护程序线程都处于活动状态),Java就不会自行退出。

尝试在player.start();行之后添加此内容:

Thread.sleep(5000);
player.close();

答案 1 :(得分:1)

命令提示符不支持多编程。所以当你运行上面的程序时,程序处于运行状态,在它的play()方法之后并等待某个事件发生(就像java中的另一个基于Framed的程序)。 你可以在延迟一段时间之后编写System.exit()以便你的声音来。目前你正在从DOS中删除该进程。

答案 2 :(得分:1)

player.open()的{​​{3}}说:

  

使用此调用显式打开设备的应用程序必须通过调用close来关闭设备。这对于释放系统资源并允许应用程序干净地退出是必要的。

因此,您可以使用docs [MidiDevice.open()](Java 7+)安全地关闭它并优雅地等待(在try-block结束时)以完成曲目:

try (Sequencer player = MidiSystem.getSequencer()) {
    ...

    while (player.isRunning()) {
        Thread.sleep(100);
    }
} catch (Exception ex) {
    ex.printStackTrace();
}

在Java 7之前,您可以在附加到try-catch语句的finally块中调用player.close();

注意:root用户Preferences的访问警告可能已被抑制:

PlatformLogger.getLogger("java.util.prefs")
        .setLevel(PlatformLogger.Level.SEVERE);

答案 3 :(得分:0)

要解决第一个错误,只需以管理员身份运行编译器即可。