2013-12-15 5 views
1

У меня возникли проблемы с созданием очень маленького музыкального плеера в соответствии с рецептом HeadFirstJava. Я последовал код в книге, но она все еще имеет некоторые ошибки ... Когда я первый скомпилирован он дал мне эту ошибку:Head First Java - создание первой ошибки проигрывателя

 
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 на regedit. Это решило проблему, но только частично. Код усложняется, звук сделан компьютером, но программа не закрывается. Я ударил 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 и что я в общей сложности новичок. Любая помощь будет оценена по достоинству. Спасибо.

+0

Связанный: http://stackoverflow.com/q/18109739/1725096 –

ответ

3

MIDI-секвенсор - это специальный поток, который работает в фоновом режиме. Пока он активен (или, фактически, какой-то поток не-демона активен), Java не выйдет сам по себе.

Попробуйте добавить это после player.start(); линии:

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

Он отлично работал ... спасибо. – Alex

1

Командная строка не поддерживает многопрограммное программирование. Поэтому, когда вы запускаете вышеуказанную программу, программа находится в рабочем состоянии после метода play() и ожидает появления какого-либо события (например, другой программы на основе Framed в java). вы можете написать System.exit() после некоторой задержки (чтобы ваш голос пришел). В настоящее время вы убиваете процесс из DOS.

1

docs [MidiDevice.open()] для player.open() говорит:

An application opening a device explicitly with this call has to close the device by calling close. This is necessary to release system resources and allow applications to exit cleanly.

Таким образом, вы можете использовать try-with-resource-statement (Java 7+), чтобы закрыть это безопасно и ждать грациозно (в конце вашего блока try) для вашей дорожки:

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

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

До Java 7 вы бы назвали player.close(); в блоке finally, прикрепленном к вашему try-catch-statement.

Примечание: Предупреждение доступа для корневых пользователей Preferences могло быть подавлено:

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

Для решения первой ошибки, просто запустите ваш компилятор как администратор.

Смежные вопросы