【问题标题】:Java audio plays fine when run alone, not when run through separate classJava 音频在单独运行时播放正常,而不是在通过单独的类运行时播放
【发布时间】:2015-04-30 03:13:49
【问题描述】:

所以这个类在自己运行时播放声音文件'Theme A.wav'就好了。

这是“PlayAudio.class”

import java.io.*;
import sun.audio.*;

public class PlayAudio {

public static playsound() {

  String sound = "Theme A.wav";

  InputStream audio = new FileInputStream(new File(sound));
  AudioStream aStream = new AudioStream(audio);
  AudioPlayer.player.start(aStream);

    System.out.println("Loaded playaudio.class; playing audio");


}
public static void main(String args[]) {

new playsound();

}
}

但是,在主类中找到的播放按钮在单击时无法调用“playaudio.class”。在我添加音频代码之前它工作正常(除了'System.out.println(“Loaded playaudio.class;正在播放音频”);'行)。直到“抛出异常”sn-p 被添加到第一个类中,错误才出现。

//play button
play = new JButton(new ImageIcon ("UIImages/play.png"));
play.setBackground(Color.WHITE);
play.setFocusPainted(false);

//sets up the action play
play.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {

       PlayAudio.playsound();

    }
  });

有什么帮助吗? 这是编译器抛出的异常。

1 error found:
File: C:\Users\Hunter\workspace\src\rejomedia.java  [line: 74]
Error: Unhandled exception type java.lang.Exception

【问题讨论】:

  • 异常说明了什么?
  • 已添加到问题中。
  • 如果你不介意几个建议:你应该调用你的 playaudio 类 PlayAudio——类以大写字母开头,方法以小写字母开头(所以“main”是正确的)。 #2 你所拥有的是构建错误,而不是异常。仅当您运行程序(java)而不是编译它(javac)时才例外。 #3,从 main 中取出该代码并将其放入另一个方法中,例如“playSound”,然后让您的 main 和事件处理程序都调用“playSound”,这似乎比直接调用“main”要好得多。
  • 已编辑,您的意思是这样吗?然后编译器会抛出“缺少方法的返回类型”。错误。我假设这是因为“playsound”不是类文件的名称?
  • 好的,关闭。 playsound 需要返回一些东西,使其类型为“void”。在你的 main 和 actionPerformed 内部应该是这样的:“new PlayAudio().playsound()”。要么使 playsound 成为静态,它可以是“PlayAudio.playsound()”。很抱歉,这些东西一开始确实令人困惑且毫无意义,但我保证,当你经常使用它时,所有这些奇怪的陷阱都会非常有用。

标签: java audio java-io


【解决方案1】:

在 playaudio.main(null) 周围或 main 中放置一个 Try/Catch(而不是抛出)。

playaudio.main() 调用将抛出到动作事件侦听器中,并且可能会被无声地吃掉。静默异常绝对是 Java 代码中最糟糕的事情。

我的猜测是它被扔掉了,因为它再也找不到文件了(可能是“.”目录移动了,因为你以不同的方式启动它或使用不同的主目录)

如果是这种情况,“修复”它的一种方法是提供完整路径。

如果您发现异常,请将其添加到您的帖子中,我们可以进一步提供帮助。

知道了。这是一个构建错误。当您从 main 中“抛出”异常时,您并没有在调用 main 的方法中处理它。

与我上面给出的解决方案相同。将对 main 的调用包装在 try/catch 中:

try {
    playaudio.main(null);
} catch(Exception e) {
    System.out.println("Caught an exception:"+ e.getMessage());
    e.printStackTrace();
}

【讨论】:

  • 而不是 'System.out.println("Caught an exception:", e.getMessage());'它是' System.out.println("Caught an exception:" + e.getMessage());'这似乎成功了! :D
猜你喜欢
  • 2017-02-06
  • 2019-03-25
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2017-08-15
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多