如何摆脱错误?

Posted

技术标签:

【中文标题】如何摆脱错误?【英文标题】:How to get rid of error? 【发布时间】:2011-04-26 11:52:53 【问题描述】:

我正在编写文本编辑器,它实际上应该说出当前按下的键。我设法做到了,我什至准备了文件。一切正常,但是当符号数量超过 29 时,编译器会说:

javax.sound.sampled.LineUnavailableException: unable to obtain a line
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.connect(PulseAudioDataLine.java:279)
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:102)
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:289)
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:402)
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:453)
at TextEditor$AreaListener.keyPressed(Main.java:81)
at java.awt.Component.processKeyEvent(Component.java:6161)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2801)
at java.awt.Component.processEvent(Component.java:5980)
at java.awt.Container.processEvent(Container.java:2105)
at java.awt.Component.dispatchEventImpl(Component.java:4564)
at java.awt.Container.dispatchEventImpl(Container.java:2163)
at java.awt.Component.dispatchEvent(Component.java:4390)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1881)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:749)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1025)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:892)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:713)
at java.awt.Component.dispatchEventImpl(Component.java:4434)
at java.awt.Container.dispatchEventImpl(Container.java:2163)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4390)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649)
at java.awt.EventQueue.access$000(EventQueue.java:96)
at java.awt.EventQueue$1.run(EventQueue.java:608)
at java.awt.EventQueue$1.run(EventQueue.java:606)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116)
at java.awt.EventQueue$2.run(EventQueue.java:622)
at java.awt.EventQueue$2.run(EventQueue.java:620)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:619)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

这是我的源代码的一部分,其中描述了一个实现 KeyListener 接口的类。这个类是我的主要文本区域的监听器。

class AreaListener implements KeyListener 
    @Override public void keyPressed( KeyEvent e) 
        try 
            AudioInputStream result1 = Audiosystem.getAudioInputStream(new File("/home/nikkka/Desktop/alphabet/blank.wav"));;
            if(new Character(e.getKeyChar()).isLetter(e.getKeyChar()))
                result1 = AudioSystem.getAudioInputStream(new File("/home/nikkka/Desktop/alphabet/"+e.getKeyChar()+"_EDITOR.wav"));
            DataLine.Info info = new DataLine.Info(Clip.class, result1.getFormat());
            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(result1);
            clip.start();
         catch(Exception e1) e1.printStackTrace();
    @Override public void keyReleased(KeyEvent e) 
    @Override public void keyTyped(   KeyEvent e) 
    

我看不出有什么问题?...此外,为什么对前 29 个符号有效的东西不应该在更多符号上有效?也许是因为我必须在clip.start() 之后关闭clip.close() 的剪辑?请帮忙:-S

【问题讨论】:

【参考方案1】:

根据here 描述的文档,您收到此错误是因为Line 由于资源限制不可用。

我认为你应该在使用Line.close() 方法后关闭Line

编辑: 正确的做法可能如下:

    在启动应用程序或创建用于处理输入区域的对象时创建 Clip 对象 在输入区域按下键时使用 Clip 对象 stop()close() Clip 当应用程序退出或破坏输入区域时

这样可以节省资源。

【讨论】:

嗯,谢谢,但我实际上无法理解您的意思……您能说得更具体些吗? :S 你是什么意思? :S 你会在Clip clip = (Clip) AudioSystem.getLine(info); 的行中得到一个Line。使用后,您应该使用 close 方法释放资源。 是的,因为ClipLine 的子类。 可能我从来没有使用过ClipLine,所以我说你应该在使用它之后释放它。 顺便说一句,您为什么不在开始时获得Line 并使用该对象播放声音并在退出程序之前释放它。【参考方案2】:

这不是编译器错误消息。

这是一个运行时错误,我认为这意味着它无法读取声音文件中的数据。文件已损坏或格式不受支持。

【讨论】:

实际上,我用于测试的唯一键是“a”键。 29 次它工作得很好。它与程序使用的“a”键和“a_EDITOR.wav”文件相同。而且我还是看不出原因,为什么……

以上是关于如何摆脱错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何摆脱 SIGTERM 错误

Django 如何摆脱迁移错误

如何摆脱 TypeScript 中的 $injector 类型错误?

如何摆脱ffmpeg中的“抖动缓冲区已满”错误?

如何摆脱VS 13中的错误“链接:致命错误LNK1104:无法打开文件'LIBC.lib'”?

如何摆脱python中的ascii编码错误