繁体   English   中英

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

[英]Head First Java - creating the first music player error

我在按照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并在regedit上对JavaSoft给予完全的权限。 确实解决了问题,但只能部分解决。 代码符合要求,声音是由计算机发出的,但是如果我按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,而且我是一个新手。 任何帮助,将不胜感激。 谢谢。

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

尝试在player.start();之后添加它player.start(); 线:

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

命令提示符不支持多重编程。 因此,当您运行上述程序时,该程序处于play()方法之后,处于运行状态,并等待某个事件发生(例如Java中另一个基于框架的程序)。 您可以在放置一些延迟后编写System.exit()(这样您的声音就会响起)。 当前,您正在从DOS中终止该进程。

用于player.open()文档[MidiDevice.open()]说:

使用此调用显式打开设备的应用程序必须通过调用close来关闭设备。 这是释放系统资源并允许应用程序正常退出所必需的。

因此,您可以使用try-with-resource-statement (Java 7+)安全地关闭它,并优雅地等待(在try-block的末尾),以完成跟踪:

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

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

在Java 7之前,您应该调用player.close(); 在附加到try-catch-statement的final块中。

注意 :可以通过以下方式禁止root用户Preferences ”的访问警告:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM