我一直在创建Java程序,它在Eclipse中完美运行,没有任何错误。
当我将其编译为.jar并运行它时,出现此错误:

java.lang.NullPointerException
        at javaVoice.Speech.say(Speech.java:12)
        at javaVoice.Respond.toText(Respond.java:58)
        at javaVoice.GUI$2.actionPerformed(GUI.java:85)
        at javax.swing.JTextField.fireActionPerformed(Unknown Source)
        at javax.swing.JTextField.postActionEvent(Unknown Source)
        at javax.swing.JTextField$NotifyAction.actionPerformed(Unknown Source)
        at javax.swing.SwingUtilities.notifyAction(Unknown Source)
        at javax.swing.JComponent.processKeyBinding(Unknown Source)
        at javax.swing.JComponent.processKeyBindings(Unknown Source)
        at javax.swing.JComponent.processKeyEvent(Unknown Source)
        at java.awt.Component.processEvent(Unknown Source)
        at java.awt.Container.processEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
        at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)

        at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
        at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
        at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
        at java.awt.Component.dispatchEventImpl(Unknown Source)
        at java.awt.Container.dispatchEventImpl(Unknown Source)
        at java.awt.Window.dispatchEventImpl(Unknown Source)
        at java.awt.Component.dispatchEvent(Unknown Source)
        at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
        at java.awt.EventQueue.access$500(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.awt.EventQueue$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.awt.EventQueue$4.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)


当我尝试执行voice.allocate()时,我完全确定这些错误来自FreeTTS。 (我用try / catch包围了代码,以确保它在那里捕获了异常。)
这是Speech.java,它是导致错误的类。

package javaVoice;

import com.sun.speech.freetts.Voice;
import com.sun.speech.freetts.VoiceManager;

public class Speech {
    public static void say(String toSay) {
        try {
            Voice voice;
            VoiceManager voiceManager = VoiceManager.getInstance();
            voice = voiceManager.getVoice(Main.speakVoice);
            voice.allocate();
            voice.speak(toSay);
        }
        catch (Exception e) {
            System.out.println("Something went wrong while javaVoice tried to talk!");
            if (Main.debugMode) {
                e.printStackTrace();
            }
        }
    }
    public static void sayPrint(String toSay) {
        try {
            Voice voice;
            VoiceManager voiceManager = VoiceManager.getInstance();
            voice = voiceManager.getVoice(Main.speakVoice);
            voice.allocate();
            voice.speak(toSay);
            System.out.println(toSay);
        }
        catch (Exception e) {
            System.out.println("Something went wrong while javaVoice tried to talk!");
            if (Main.debugMode) {
                e.printStackTrace();
            }
        }
    }
}


错误是在调用任一方法时引起的,错误的行始终在voice.allocate();所在的位置。是。
如何使我的程序作为.jar文件工作,我在做什么错呢?

最佳答案

假设FreeTTS是您依赖的一个单独的jar,则有两个选择:


您可以按照答案here将所有内容放入一个罐中
执行jar时,必须在类路径上指定第二个jar。例如:java -cp .:path/to/your/jar/yourjar.jar:path/to/other/jar/FreeTTS.jar com.main.method.Class

关于java - Java程序-在Eclipse中工作,但在JAR中不工作-FreeTTS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29678265/

10-09 18:18
查看更多