为什么会出现java.lang.NumberFormatException:对于输入字符串:“∞”?

时间:2018-07-23 14:53:20

标签: java exception runtimeexception

这是场景。 我根据从数据库获取的数据动态生成要显示在JPanel上的组件。 提示用户输入一个整数,并据此完成一些计算。输出应为十进制值。因此,我已将答案分配给double并使用DecimalFormat进行了格式化。

即使我没有输入任何值作为0,当我将我的双精度值传递给DecimalFormat的format()方法时,我也会出错。

这是错误

  

java.lang.NumberFormatException:对于输入字符串:“∞”,位于   sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)     在sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)处   java.lang.Double.parseDouble(Double.java:538)在   java.lang.Double.valueOf(Double.java:502)在   com.boarding.brdrsbllsys.view.Bills.displayOutput(Bills.java:358)位于   com.boarding.brdrsbllsys.view.Bills.btnConfirmActionPerformed(Bills.java:186)     在com.boarding.brdrsbllsys.view.Bills.access处$ 200(Bills.java:27)在   com.boarding.brdrsbllsys.view.Bills $ 3.actionPerformed(Bills.java:123)     在   javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)     在   javax.swing.AbstractButton $ Handler.actionPerformed(AbstractButton.java:2348)     在   javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)     在   javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)     在   javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)     在java.awt.Component.processMouseEvent(Component.java:6533)在   javax.swing.JComponent.processMouseEvent(JComponent.java:3324)在   java.awt.Component.processEvent(Component.java:6298)在   java.awt.Container.processEvent(Container.java:2236)在   java.awt.Component.dispatchEventImpl(Component.java:4889)在   java.awt.Container.dispatchEventImpl(Container.java:2294)在   java.awt.Component.dispatchEvent(Component.java:4711)在   java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)     在   java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)     在java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)     在java.awt.Container.dispatchEventImpl(Container.java:2280)在   java.awt.Window.dispatchEventImpl(Window.java:2746)在   java.awt.Component.dispatchEvent(Component.java:4711)在   java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)在   java.awt.EventQueue.access $ 500(EventQueue.java:97)在   java.awt.EventQueue $ 3.run(EventQueue.java:709)在   java.awt.EventQueue $ 3.run(EventQueue.java:703)在   java.security.AccessController.doPrivileged(本机方法),位于   java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)     在   java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)     在java.awt.EventQueue $ 4.run(EventQueue.java:731)在   java.awt.EventQueue $ 4.run(EventQueue.java:729)在   java.security.AccessController.doPrivileged(本机方法),位于   java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)     在java.awt.EventQueue.dispatchEvent(EventQueue.java:728)在   java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)     在   java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)     在   java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)     在   java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)     在   java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)     在java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

生成错误的代码段,

if (gbc.gridx == 1 && gbc.gridy == i + 1) {
                textConstraints.gridx = 1;
                textConstraints.gridy = i + 1;
                newPanel.add(new JLabel(((JTextField) component).getText()), textConstraints);
                int days = Integer.parseInt(((JTextField) component).getText().trim());
                System.out.println("add num of days");

                DecimalFormat df = new DecimalFormat("#.##");

                textConstraints.gridx = 3;
                double a=water / waterdays * days*1.0;
                double boarderWater = Double.valueOf(df.format(a));//error is given in this line
                newPanel.add(new JLabel(boarderWater + ""), textConstraints);
                continue;

            }

请注意变量gbctextConstraints是GridBagConstraints对象,water是双精度变量,waterdaysdays是int变量。

我的代码应该有什么问题?

2 个答案:

答案 0 :(得分:1)

您尚未提供waterwaterdaysdays的值,但是基于该错误,我只能得出waterdays为0。

由于我们在这里使用双精度数,因此,除以0不会像整数那样产生错误,而是得到Double.POSITIVE_INFINITY作为结果。

下面是带有waterdays = 0的示例代码片段,以重现此错误:

double water = 5.0;
int waterdays = 0;
int days = 3;

DecimalFormat df = new DecimalFormat("#.##");
double a = water / waterdays * days * 1.0;

double boarderWater = Double.valueOf(df.format(a));
System.out.println(boarderWater);

Try it online.

如您在TIO调试窗口中所见,格式化程序会给出相同的错误java.lang.NumberFormatException: For input string: "∞",因为waterdays为0。

请调试您的代码以检查waterdays的值。

答案 1 :(得分:1)

简单的解释:

在除法过程中分母为零时,会发生此错误。

(如果使用其他条件,则使用条件)将分母的值不等于零。

或者如果您不能满足条件,

为分母的值等于零设置异常处理,以避免应用程序崩溃。

使用

尝试{//您的代码 }

catch(Exception e){//捕获异常 }