【问题标题】:Problems with NumberFormatExceptionNumberFormatException 的问题
【发布时间】:2014-09-17 11:31:17
【问题描述】:

我注意到我的程序有一个奇怪的问题,我就是想不通。我已经包含了已标记的方法,以及给出的错误。令我困惑的是,我在其他按钮上重复了这种方法大约 40 次,只在需要时将“engtf4”更改为另一个源。它们完美地工作,没有错误,但写得完全相同。更令人困惑的是,该方法完全按照预期执行(即使给出了下面的错误消息)?

我使用关键字在网上寻找类似的问题 - java.lang.NumberFormatException: 对于输入字符串:“”,但我确实注意到我看到的所有示例网站都引用了 qoute 标记中的特定值。例如,-java.lang.NumberFormatException:对于输入字符串:“2345”。如果能得到任何帮助,我将不胜感激,谢谢。

方法源代码:

if (a.getSource() == engBuy4){
    getItems();
q = engtf4.getText();
qq = Long.parseLong(q);  //////////// LINE 13086

if (qq > 1000000 || total > 1000000){
    Error.setText("You can ship a maximum of 1 million items.");
    engtf4.setText("");
}
if (qq <= 1000000 && total <= 1000000){
    if (qq > rem){
    Error.setText("You can ship " + rem + " more items");
    engtf4.setText("");             
}
if (qq <= rem){
    buyShrEng();
    engtf4.setText("");             
}
}

错误信息:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Long.parseLong(Unknown Source)
    at java.lang.Long.parseLong(Unknown Source)
    at DopeWars.DopeWars.mouseReleased(DopeWars.java:13086)
    at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(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.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(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$200(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)

【问题讨论】:

  • LINE 13086- 认真的吗?
  • “我在其他按钮上重复了这种方法大约 40 次,只在需要的地方将 'engtf4' 更改为另一个源” - 您可以从重构代码开始。它可以使调试更容易。
  • 嗯,阅读错误,很明显 q 设置为空字符串。所以这将很难将其转换为数字。
  • @stuXnet,我使用旧手机作为我的互联网来源,使用此手机传输数据不是那么友好。如果我对下面的示例不满意,我将绕过一个伙伴并使用他们的电脑(如果他们在的话)。无论如何感谢您的选择,非常感谢。没想到会有这么多回应,谢谢大家。

标签: java string parsing jlabel numberformatexception


【解决方案1】:

Long.parseLong() 如果传递的字符串不是可解析的 long 值,则抛出 NumberFormatException。在您的情况下,您传递的是一个空字符串(可能是因为用户没有在输入字段中输入任何内容)。您可以轻松验证这一点:

...
Long.parseLong("");
...
java.lang.NumberFormatException: For input string: ""

您应该随时准备好捕获此异常(除了空字符串,如果用户输入不是Longanything,则会引发异常),并向用户,类似

try {
    qq = Long.parseLong(q);
} catch(NumberFormatException nfe) {
    // show error message like "The string ... you entered is not a number."
    ...
}

如果您想将空字符串视为0(如果这对您的用例来说是合理的),您可以执行类似的操作(仍然需要try/catch 块来捕获任何其他无效输入):

try {
    long qq = 0;
    if (q != null && !q.isEmpty()) {
       qq = Long.parseLong(q);
    }

    ...

} catch(NumberFormatException nfe) {
    // show error message like "The string ... you entered is not a number."
    ...
}

除此之外,不要重复代码几十次,你应该检查哪些是代码的可变部分并将它们替换为变量,这样你就可以重用代码而不是重复它。

【讨论】:

  • 要正确执行该方法,必须传递一个值。毫无疑问,您的解决方案我认为我的代码必须工作。事实证明这不是问题,它引发错误的原因是因为我的鼠标侦听器完全指向另一个按钮。一个清楚的例子说明为什么在一个地方有这么多代码是一件坏事,如果我没有编写这么多行代码,我会发现要容易得多。无论如何感谢您的帮助。
【解决方案2】:

它引发了 NumberFormatException,因为传递给 parse() 方法的参数是不可解析的。我的意思是,输入在这里无效。

查看以下链接 :) http://docs.oracle.com/javase/7/docs/api/java/lang/Long.html

【讨论】:

    【解决方案3】:

    输入的值好像是空字符串:java.lang.NumberFormatException: For input string: ""
    因此,在解析为 long 之前,您应该测试字符串值是否为空。 如果解析不成功,您应该以任何方式捕获 java.lang.NumberFormatException 以放置默认值

    【讨论】:

      【解决方案4】:

      我们无法将空格或 null 解析为 long。如果我们尝试这样做,则会出现数字格式异常。 所以在解析之前添加 if 语句来检查值是否存在。

      if(q!=null && !"".equals(q))
      qq=Long.parse(q);
      

      在这些情况下最好使用异常处理

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-07
        • 1970-01-01
        • 2018-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多