静态嵌套类中能否实现音频?我的嵌套类格式是否正确?
解答你的静态嵌套类音频集成问题
Hey there! Let's work through your problem together—first off, 静态嵌套类完全可以实现音频功能,你单独运行音频类正常就证明了这一点。问题主要出在代码的几个细节错误上,咱们逐个梳理:
核心问题分析
1. 无限递归实例化(最致命的错误)
你在audio静态嵌套类的类体里直接写了:
out.audio audio = new out.audio ();
这行代码会导致无限递归创建对象:每当你创建一个audio实例,它的类成员会立刻再创建一个新的audio实例,这个新实例又会重复这个过程,直到栈溢出程序崩溃。你完全不需要在类内部定义这个实例,因为main方法里已经创建了t1并启动线程了,直接删掉这行代码!
2. 空指针异常隐患
你注释掉了获取音频数据和创建循环流的代码:
//MD = BGM.getData(); //loop = new ContinuousAudioDataStream(MD);
但后面依然调用了MGP.start (loop);,此时loop是null,运行时会抛出NullPointerException。如果需要循环播放,把注释去掉;如果不需要循环,就删掉MGP.start (loop);这行。
3. 未定义的变量c
在main方法里你直接使用了c = new Console ();,但没有声明变量类型,应该改成:
Console c = new Console();
否则会编译失败。
4. 命名规范问题(非致命但重要)
Java里类名的规范是首字母大写,建议把audio改成Audio,避免和变量名混淆,提升代码可读性。
修正后的代码示例
import java.awt.*; import hsa.Console; import java.awt.image.*; import java.util.Random; import sun.audio.*; import javax.swing.*; import java.awt.event.*; import java.io.*; class out implements ImageObserver { // 其他代码保留不变 public static class Audio extends Thread { // 删掉了错误的内部实例化代码 public void run() { while (true) { AudioPlayer MGP = AudioPlayer.player; AudioStream BGM; AudioData MD; ContinuousAudioDataStream loop = null; try { InputStream test = new FileInputStream("Music long.au"); BGM = new AudioStream(test); AudioPlayer.player.start(BGM); // 恢复循环播放的代码(如果需要循环的话) MD = BGM.getData(); loop = new ContinuousAudioDataStream(MD); } catch (FileNotFoundException e) { System.out.print(e.toString()); } catch (IOException error) { System.out.print(error.toString()); } // 只有当loop不为null时才启动,避免空指针 if (loop != null) { MGP.start(loop); } try { Thread.sleep(200000); } catch (InterruptedException ie) { } try { Thread.sleep(1500); } catch (InterruptedException ie) { } } } public static void main(String[] args) { Console c = new Console(); Audio t1 = new Audio(); t1.start(); for (;;) { c.println(""); break; } } // main method } // Audio class } // out class
总结
- 静态嵌套类的格式是正确的,完全可以用来实现音频播放线程;
- 你的核心问题是错误地在类内部实例化自身导致无限递归,删掉那行代码就能解决大部分崩溃问题;
- 修复空指针和变量定义的小问题后,代码就能正常运行了。
内容的提问来源于stack exchange,提问作者Nicki
相关产品推荐
相关产品推荐

