簡體   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