为什么Integer.parseInt在我的java代码中不起作用?

时间:2017-04-21 06:37:40

标签: java java.util.scanner parseint

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

public class MainProgram {
   public static void main(String[] args ) throws IOException{
    String seconds = " ";

     Scanner sc2 = null;
        try {
            sc2 = new Scanner(new File("/Users/mohammadmuntasir/Downloads/customersfile.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();  
        }

        boolean first = true;
        while (sc2.hasNextLine()) {
                Scanner s2 = new Scanner(sc2.nextLine());    
            while (s2.hasNext()) {
                String s = s2.next();
                if (first == true){
                    seconds = s;
                    first = false;
                }

            }
        }
        System.out.println(Integer.parseInt(seconds)); // causes ERROR?

     }
 }

我正在尝试从第一行中的文本文件中读取一个数字。我创建了一个名为seconds的整数,它将接收第一个数字并将被解析为整数。但我总是得到一个数字异常错误,我无法解析它。当我将s显示为字符串时,它会显示一个旁边没有空格的数字。任何人都可以解释为什么会这样吗?

这是stacktrace:

Exception in thread "main" java.lang.NumberFormatException: For input string: "300" 
  at java.lang.NumberFormatException.forInputString(NumberFormatE‌xception.java:65) 
  at java.lang.Integer.parseInt(Integer.java:580) 
  at java.lang.Integer.parseInt(Integer.java:615) 
  at MainProgram.main(MainProgram.java:29)

7 个答案:

答案 0 :(得分:2)

如果异常消息确实如此:

 java.lang.NumberFormatException: For input string: "300"
然后我们开始陷入非常模糊的原因。

  • 这可能是同性恋的问题;即看起来像一个字符但实际上是不同字符的Unicode字符。

  • 它可能是非打印字符。例如,ASCII NUL ...或Unicode BOM(Byte Order Marker)字符。

我可以想出三种诊断方法:

  1. 在调试器中运行代码并在parseInt方法上设置断点。然后查看您尝试解析的String对象,检查其长度(比如N)和字符数组中的前N char值。

  2. 使用文件工具将文件检查为字节。 (在UNIX / Linux / MacOSX上,使用od命令。)

  3. 添加一些代码以将字符串作为字符数组,将它们转换为整数并一次打印一个。

  4. 这三种方式都应该准确地告诉你字符串中的字符是什么,这应该解释为什么parseInt认为它们是错误的。

    另一种可能性是您错误地复制了异常消息。当你进入问题时,堆栈跟踪有点受损......

答案 1 :(得分:0)

如果您尝试解析空间,则会导致问题。请检查您要解析的seconds的值。

Exception in thread "main" java.lang.NumberFormatException: For input string: " "
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:569)
    at java.lang.Integer.parseInt(Integer.java:615)
    at HelloWorld.main(HelloWorld.java:22)

另外,尝试捕获异常并打印导致它的值。像这样:

try{
      System.out.println(Integer.parseInt(seconds));
    }
    catch(Exception e){
      System.out.println("String value: '" + seconds + "'");
    }

您可以使用堆栈跟踪更新问题吗?不确定文件中的内容是什么。

答案 2 :(得分:0)

是否可以使用类似的内容附加您的代码并提出您的答案:

    StringBuilder sb = new StringBuilder();
    for (char c : seconds.toCharArray())
    {
        sb.append((int)c).append(",");
    }
    System.out.println(sb);

答案 3 :(得分:0)

使用十六进制编辑器查看输入文件。它可能以一些名为Byte Order Markers的“奇怪”十六进制代码开头。这可以解释为什么Exception如此误导,因为BOM不会显示在控制台上。

答案 4 :(得分:0)

您可以尝试一下吗,我遇到了同样的问题,Integer.ParseInt(String)对我不起作用,我添加了.trim(),它工作得很好:

int id_of_command;
        try {
             id_of_command = Integer.parseInt(id_of_Commands_str.trim());
            }
            catch (NumberFormatException e)
            {
             id_of_command = 0;
            }

答案 5 :(得分:-1)

如果您确定要读取整数,可以使用seconds.trim()修剪任何空格并解析它。

答案 6 :(得分:-1)

您的字符串可以为空,或者字符串可能包含空格。所以使用trim& amp;然后解析。