这是场景。 我根据从数据库获取的数据动态生成要显示在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;
}
请注意变量gbc
和textConstraints
是GridBagConstraints对象,water
是双精度变量,waterdays
和days
是int变量。
我的代码应该有什么问题?
答案 0 :(得分:1)
您尚未提供water
,waterdays
和days
的值,但是基于该错误,我只能得出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);
如您在TIO调试窗口中所见,格式化程序会给出相同的错误java.lang.NumberFormatException: For input string: "∞"
,因为waterdays
为0。
请调试您的代码以检查waterdays
的值。
答案 1 :(得分:1)
简单的解释:
在除法过程中分母为零时,会发生此错误。
(如果使用其他条件,则使用条件)将分母的值不等于零。
或者如果您不能满足条件,
为分母的值等于零设置异常处理,以避免应用程序崩溃。
使用
尝试{//您的代码 }
catch(Exception e){//捕获异常 }