Я получаю java.lang.IllegalStateException: секвенсор не открыт. Какое решение?

Это код, который я пытаюсь запустить, но я продолжаю получать 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)

Я предполагаю, что вам нужно вызвать метод открытым перед вызовом метода start. Вы пробовали это? Обратитесь к Использование методов секвенсора из руководств Oracle по Java.

Abra 06.05.2022 08:38

Да, я так и сделал, и это решило проблему, спасибо

nashty 07.05.2022 13:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Только для демонстрации, не делайте этого

Как сказал @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();

Другие вопросы по теме