You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

静态嵌套类中能否实现音频?我的嵌套类格式是否正确?

解答你的静态嵌套类音频集成问题

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:07:42