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

Java方法调用异常:无法解析start()与pause()方法求助

问题排查与修复方案

核心问题分析

  • 方法嵌套定义语法错误:TextToSpeechExample1类中,start()方法被错误嵌套在main()方法内部,Java不允许方法嵌套定义,直接导致IDE无法识别该方法,触发"cannot resolve method"错误。
  • 跨类调用未指定类名:gui类按钮事件中调用pause()时,未通过TextToSpeechExample1.pause()的完整类名方式调用,IDE会默认在当前gui类中查找方法,自然无法定位。
  • 方法异常未声明:start()和pause()方法内的代码会抛出IOException、EngineException等受检异常,但方法声明未添加throws语句,编译会报错。
  • pause()方法逻辑错误:先执行synthesizer.deallocate()释放合成器,再调用synthesizer.pause(),此时合成器已失效,会抛出非法状态异常;且每次调用都重新创建合成器,无法控制正在运行的播放实例。

修复后的完整代码

import javax.speech.EngineException;
import javax.speech.synthesis.Synthesizer;
import javax.speech.synthesis.SynthesizerModeDesc;
import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import javax.speech.Central;
import javax.speech.AudioException;
import java.io.IOException;

class TextToSpeechExample1 {
    // 全局静态合成器实例,用于统一控制播放、暂停
    private static Synthesizer synthesizer;

    public static void main(String args[]) throws IOException, EngineException, AudioException, InterruptedException {
        initSynthesizer();
    }

    // 抽离合成器初始化逻辑
    private static void initSynthesizer() throws EngineException {
        System.setProperty("freetts.voices", "com.sun.speech.freetts.en.us.cmu_us_kal.KevinVoiceDirectory");
        Central.registerEngineCentral("com.sun.speech.freetts.jsapi.FreeTTSEngineCentral");
        synthesizer = Central.createSynthesizer(new SynthesizerModeDesc(java.util.Locale.US));
    }

    public static void start() throws IOException, EngineException, AudioException, InterruptedException {
        if (synthesizer == null) {
            initSynthesizer();
        }

        String fileName = "/Users/stevenshivayka/Documents/kjv.txt";
        Path path = Paths.get(fileName);
        List<String> allLines = Files.readAllLines(path, StandardCharsets.UTF_8);

        synthesizer.allocate();
        synthesizer.resume();
        // 将列表内容转为连续文本,避免输出格式混乱
        synthesizer.speakPlainText(String.join(" ", allLines), null);
        synthesizer.waitEngineState(Synthesizer.QUEUE_EMPTY);
    }

    public static void pause() throws EngineException, AudioException {
        // 先判断合成器状态,避免无效操作
        if (synthesizer != null && synthesizer.getEngineState() == Synthesizer.RESUMED) {
            synthesizer.pause();
        }
    }

    // 可选:添加继续播放方法,完善功能
    public static void resumePlay() throws EngineException, AudioException {
        if (synthesizer != null && synthesizer.getEngineState() == Synthesizer.PAUSED) {
            synthesizer.resume();
        }
    }
}

class gui {
    public static void main(String args[]) {
        JFrame frame = new JFrame("Babbel Audio Application");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setLayout(new FlowLayout());

        JButton startBtn = new JButton("Start Audio");
        frame.add(startBtn);

        JButton pauseBtn = new JButton("Pause Audio");
        frame.add(pauseBtn);

        JButton resumeBtn = new JButton("Resume Audio");
        frame.add(resumeBtn);

        frame.setVisible(true);

        startBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    TextToSpeechExample1.start();
                } catch (Exception ex) {
                    ex.printStackTrace();
                    JOptionPane.showMessageDialog(frame, "播放失败:" + ex.getMessage());
                }
            }
        });

        pauseBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    TextToSpeechExample1.pause();
                } catch (Exception ex) {
                    ex.printStackTrace();
                    JOptionPane.showMessageDialog(frame, "暂停失败:" + ex.getMessage());
                }
            }
        });

        resumeBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    TextToSpeechExample1.resumePlay();
                } catch (Exception ex) {
                    ex.printStackTrace();
                    JOptionPane.showMessageDialog(frame, "继续播放失败:" + ex.getMessage());
                }
            }
        });
    }
}

关键修复点说明

  1. 修正方法嵌套问题:将start()方法从main()方法中移出,作为类的静态方法独立存在
  2. 规范跨类调用:gui类中调用pause()时,改为TextToSpeechExample1.pause()的完整调用方式
  3. 处理异常逻辑:在方法声明中添加throws语句,或在事件监听中用try-catch捕获异常并提示用户
  4. 重构合成器实例:使用全局静态合成器,确保暂停、继续操作能控制同一播放进程
  5. 优化pause逻辑:移除错误的deallocate()调用,先判断合成器状态再执行操作,避免无效调用

内容的提问来源于stack exchange,提问作者67Mustang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:36:00