我用 Java 创建了一个项目,如果我从我的机器上运行该项目一切正常,但是如果我共享 jar 文件并从另一台机器上执行它就不起作用。我得到这个错误:
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "10,00"
at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.base/java.lang.Double.parseDouble(Double.java:651)
at model.components.Transaction.<init>(Transaction.java:33)
at model.events.components.AddTransactionListener.actionPerformed(AddTransactionListener.java:87)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1972)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2313)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6626)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3389)
at java.desktop/java.awt.Component.processEvent(Component.java:6391)
at java.desktop/java.awt.Container.processEvent(Container.java:2266)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5001)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2780)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4833)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:746)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:744)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:743)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
我怀疑这是产生错误的代码:
double transactionAmount = 0;
try {
if (addTransactionPanel.getAmountField().getText().equals("") || Double.parseDouble(addTransactionPanel.getAmountField().getText()) < 0.0)
throw new MyException("Enter a valid amount!");
transactionAmount = Double.parseDouble(addTransactionPanel.getAmountField().getText());
} catch(Exception e) {
errorMessage += e.getMessage() + "\n";
errorCount++;
}
addTransactionPanel.getAmountField().getText
返回 JTextField 的文本。
正如我之前所说,如果我在我的机器上运行该项目,我不会收到错误消息(我在 Pop-os 上)。 我用 Windows 10 制作了一个虚拟机,它运行良好。我在另一个磁盘分区上的 Ubuntu 上尝试了代码,它也可以工作。 任何人都可以帮助我吗?
没有更多上下文,我猜这是一个本地化问题。
您可以先在代码中添加 System.out.println(Locale.getDefault());
以查看每个平台使用的语言环境。
一般来说,你应该使用JFormattedTextField
或JSpinner
来处理输入格式,然后使用他们的getValue
方法,这将实际执行解析,例如...
// By default, my locale is en_AU, so this is just for demonstration
// purposes, don't do this to your users
NumberFormat format = NumberFormat.getNumberInstance(Locale.GERMANY);
format.setMinimumFractionDigits(2);
format.setMaximumFractionDigits(2);
format.setRoundingMode(RoundingMode.HALF_UP);
JFormattedTextField textField = new JFormattedTextField(format);
textField.setColumns(10);
add(textField);
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Will need to cast the result, as it
// returns Object by default
System.out.println(textField.getValue());
}
});
如果我在字段中输入 10.10
,它将输出 1010
,如果我输入 10,10
它将输出 10.10
如果我用 Locale.getDefault()
代替(在我的例子中是 en_AU
),如果我输入 10.10
,它会输出 10.10
,如果我输入 10,10
,它会输出 1010