Java程序 - 在Eclipse中工作但不在JAR中工作 - FreeTTS

时间:2015-04-16 14:46:15

标签: java eclipse jar nullpointerexception freetts

我一直在创建一个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文件工作,我做错了什么?!

1 个答案:

答案 0 :(得分:1)

假设FreeTTS是一个你依赖的独立jar,你有两个选择:

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