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