Eclipse开发Swing恶搞音效板点击Play按钮播放音频报空指针异常
问题根因
你遇到的NullPointerException报错,是因为RRSound类中的clip对象未初始化成功就被调用了setFramePosition方法导致的。
现存问题&修复方案
1. 异常被吞导致无法定位故障
你在setFile方法的catch块中没有做任何异常打印,就算音频文件加载失败你也看不到具体报错,自然不知道clip没有被赋值。
首先修改RRSound类的代码:
public class RRSound{ Clip clip; // 加载成功返回true,失败返回false public boolean setFile(String soundFileName) { try { File RickRoll = new File(soundFileName); // 可临时打印绝对路径核对文件是否真的存在 System.out.println("音频文件路径校验:" + RickRoll.getAbsolutePath()); AudioInputStream sound = AudioSystem.getAudioInputStream(RickRoll); clip = AudioSystem.getClip(); clip.open(sound); return true; } catch(Exception e) { // 必须打印异常信息定位问题 e.printStackTrace(); return false; } } public void play() { // 调用前先判空,避免空指针 if(clip != null) { clip.setFramePosition(0); clip.start(); } } // 补充暂停、停止方法给对应按钮使用 public void pause() { if(clip != null && clip.isRunning()) { clip.stop(); } } public void stop() { if(clip != null) { clip.stop(); clip.setFramePosition(0); } } }
2. 按钮未绑定监听器、逻辑不完善
你当前只给Play按钮绑定了事件监听器,Pause和Stop按钮点击后没有反应,而且点击Play时没有判断音频是否加载成功就直接调用播放方法。
首先修改ButtonHandler类逻辑:
public class ButtonHandler implements ActionListener{ public void actionPerformed(ActionEvent event) { String action = event.getActionCommand(); switch (action) { case "Play": if(RRS.setFile(RR)) { RRS.play(); } break; case "Pause": RRS.pause(); break; case "Stop": RRS.stop(); break; } } }
然后在initialize方法中给Pause、Stop按钮也绑定监听器:
Pause.addActionListener(bhandler); Stop.addActionListener(bhandler);
3. 冗余代码清理
main方法里的new RickRoll();是多余的无用代码,直接删除即可,不影响功能但会重复创建无用实例。
额外注意事项
Java内置的Clip仅支持未压缩的PCM编码、16位、44100Hz采样率的WAV文件,如果你的音频文件不符合格式要求,就算路径正确也会加载失败,可先找符合标准的WAV文件测试。
路径写法可简化为"./Sounds/RickRoll.wav",Java兼容正斜杠作为路径分隔符,不需要写双斜杠。
内容的提问来源于stack exchange,提问作者Bryce Duncan
相关产品推荐
相关产品推荐

