在其他机器上运行代码时获取 Java 异常

问题描述 投票:0回答:1

我用 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 上尝试了代码,它也可以工作。 任何人都可以帮助我吗?

java string exception double numberformatexception
1个回答
0
投票

没有更多上下文,我猜这是一个本地化问题。

您可以先在代码中添加 System.out.println(Locale.getDefault()); 以查看每个平台使用的语言环境。

一般来说,你应该使用JFormattedTextFieldJSpinner来处理输入格式,然后使用他们的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

© www.soinside.com 2019 - 2024. All rights reserved.