почему я получаю эту ошибку, когда я прекращаю проигрывать аудио из слушателя действия кнопки (аудио запускается из Thread), весь код находится внутри - PullRequest
1 голос
/ 21 июля 2011

я запустил аудиофайл в своей теме (эта тема является сигналом тревоги) это код потока:

public void waitForAlarm() {
    waiter = new Thread(new Runnable() {
        public void run() {
            while (Thread.currentThread() == waiter) {
                Calendar d = Calendar.getInstance();
                if (getAlarmHours() == d.get(Calendar.HOUR_OF_DAY)) {
                    if (getAlarmMinutes() == d.get(Calendar.MINUTE)) {
                        UserInterface.setAlarmText("No Alarms");
                        try {
                            AudioPlayer playSound = new AudioPlayer(
                                    UserInterface.getSoundFile());//return the sound choosen by user
                            playSound.play();//play the choosen sound
                            waiter.wait();
                        } catch (NoPlayerException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (CannotRealizeException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } finally {
                            break;
                        }

                    }

                }

            }
        }
    });

    waiter.start();
}

это метод прослушивания действия кнопки:

stopSound.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            AudioPlayer player = new AudioPlayer();
            player.stop();//call stop method(this method will stop & close the audio File)
        }
    });

наконец, это исключение, которое я получаю, когда нажимаю эту кнопку:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at AudioPlayer.stop(AudioPlayer.java:34)
at UserInterface$4.actionPerformed(UserInterface.java:214)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6504)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6269)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4860)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

больше информации:

- есть нить для отображения текущего времени

- я использую этот код для запуска программы SwingUtilities.invokeLater(new Runnable()

- это импорт, используемый в классе AudioPlayer

import javax.media.CannotRealizeException; import javax.media.Manager; import javax.media.NoPlayerException; import javax.media.Player;

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Этот код выглядит так, как будто он не должен ничего делать, и, в частности, не должен останавливать воспроизведение звука:

stopSound.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {
        AudioPlayer player = new AudioPlayer();
        player.stop();
    }
});

Причина в том, что вы создаете новый AudioPlayer внутри этого слушателя, который, кажется, совершенно не связан с любым другим объектом AudioPlayer, включая объект AudioPlayer, который в данный момент воспроизводит ваш сигнал тревоги.

Вот ваш текущий проигрыватель AudioPlayer:

public void waitForAlarm() {
    waiter = new Thread(new Runnable() {
        public void run() {
            while (Thread.currentThread() == waiter) {
                Calendar d = Calendar.getInstance();
                if (getAlarmHours() == d.get(Calendar.HOUR_OF_DAY)) {
                    if (getAlarmMinutes() == d.get(Calendar.MINUTE)) {
                        UserInterface.setAlarmText("No Alarms");
                        try {
                            // **** here ****
                            AudioPlayer playSound = new AudioPlayer(
                                    UserInterface.getSoundFile());
                            //..
                        } catch .... etc..    
                    }
                }    
            }
        }
    });   
    waiter.start();

Было бы гораздо разумнее вызывать stop для текущего воспроизводимого объекта AudioPlayer, а не для фиктивного объекта AudioPlayer, созданного в слушателе. Чтобы получить ссылку на воспроизводимый в данный момент объект AudioPlayer, вам необходимо объявить его как поле класса, а не в методе и блоке try. Затем, если вы хотите остановить его, убедитесь, что он не равен нулю, и если все в порядке, вызовите остановку на нем.

1 голос
/ 21 июля 2011

Я собираюсь нанести удар в темноте здесь ..

Похоже, вы еще не освоили объектно-ориентированное программирование. Вы объявляете AudioPlayer для запуска вашего звукового файла, затем вы создаете новый AudioPlayer и вызываете остановку на нем. Итак, теперь у вас есть AudioPlayer A, воспроизводящий его звуковой файл, и AudioPlayer B, у которого нет звукового файла. AudioPlayer B пытается остановить воспроизведение файла, который не существует. Вот откуда, вероятно, исходит ваше NullPointerException.

Если вы хотите, чтобы все работало как есть, измените переменную звукового файла AudioPlayer на static. Это ужасная идея, не делай этого.

Лучшая идея - сохранить AudioPlayer, созданный вами в методе waitForAlarm, в переменную, к которой можно будет обратиться позже в вашем методе actionPerformed при нажатии кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...