Это код, который я пытаюсь запустить, но я продолжаю получать IllegalStateException
. Я относительно новичок в java, и мне нужна помощь, чтобы понять это. Спасибо:)
Это код:
import javax.sound.midi.*;
public class MiniMusicApp {
public static void main(String[] args){
MiniMusicApp mini = new MiniMusicApp();
mini.play();
}//Close main
public void play(){
try{
Sequencer player = MidiSystem.getSequencer();
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
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();
}
}//close play
}//close class
И я получаю это:
java.lang.IllegalStateException: sequencer not open
at java.desktop/com.sun.media.sound.RealTimeSequencer.start(RealTimeSequencer.java:232)
at MiniMusicApp.play(MiniMusicApp.java:21)
at MiniMusicApp.main(MiniMusicApp.java:6)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.base/java.lang.reflect.Method.invoke(Method.java:577)
at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:421)
at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)
Да, я так и сделал, и это решило проблему, спасибо
Как сказал @Abra, вам нужно вызвать метод open:
import javax.sound.midi.*;
public class MiniMusicApp {
public static void main(String[] args){
MiniMusicApp mini = new MiniMusicApp();
mini.play();
}//Close main
public void play(){
try{
Sequencer player = MidiSystem.getSequencer();
player.open();
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
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();
}
}//close play
}//close class
Однако вы также должны закрыть его в конце:
import javax.sound.midi.*;
public class MiniMusicApp {
public static void main(String[] args){
MiniMusicApp mini = new MiniMusicApp();
mini.play();
}//Close main
public void play(){
Sequencer player = null;
try{
player = MidiSystem.getSequencer();
player.open();
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
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();
}
finally {if (player!=null) player.close();}
}//close play
}//close class
Но этот способ подвержен ошибкам, поэтому в современной Java вы должны использовать try-with-resource для его автоматического закрытия:
import javax.sound.midi.*;
public class MiniMusicApp {
public static void main(String[] args){
MiniMusicApp mini = new MiniMusicApp();
mini.play();
}//Close main
public void play(){
Sequencer debug = null; // just for demonstrating that it is really closed at the end
try(Sequencer player = MidiSystem.getSequencer())
{
debug = player;
player.open();
Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();
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();
}
System.out.println(debug.isOpen());
}//close play
}//close class
Вы забыли открыть Секвенсор, поэтому получили исключение. Чтобы открыть плеер
Sequencer player = MidiSystem.getSequencer();
player.open();
Я предполагаю, что вам нужно вызвать метод открытым перед вызовом метода
start
. Вы пробовали это? Обратитесь к Использование методов секвенсора из руководств Oracle по Java.