尝试加载文件时出现java.lang.NumberFormatException

时间:2012-08-03 21:29:51

标签: java numberformatexception

我在尝试从txt文件加载某些数据时遇到此错误。

public static boolean initalize(String FileName) {
    String line = "";

    String token = "";

    String token2 = "";

    String token2_2 = "";

    String[] token3 = new String[10];

    boolean EndOfFile = false;

    BufferedReader characterfile = null;

    try {

            characterfile = new BufferedReader(new FileReader("./Data/data/"

                            + FileName));

    } catch (FileNotFoundException fileex) {
        Misc.println("File not loaded");

            return false;

    }

    try {

            line = characterfile.readLine();

    } catch (IOException ioexception) {


            return false;

    }

    while ((EndOfFile == false) && (line != null)) {

            **line = line.trim();
            int spot = line.indexOf("=");
            if (spot > -1) {
                    token = line.substring(0, spot);
                    token = token.trim();
                    token2 = line.substring(spot + 1);
                    token2 = token2.trim();
                    token2_2 = token2.replaceAll("\t\t", "\t");
                    token2_2 = token2_2.replaceAll("\t\t", "\t");
                    token2_2 = token2_2.replaceAll("\t\t", "\t");
                    token2_2 = token2_2.replaceAll("\t\t", "\t");
                    token2_2 = token2_2.replaceAll("\t\t", "\t");
                    token3 = token2_2.split("\t");**

                    if (token.equals("drop")) {

                            int id = Integer.parseInt(token3[0]);

                            int x = Integer.parseInt(token3[1]);

                            int y = Integer.parseInt(token3[2]);

                            int amount = Integer.parseInt(token3[3]);

                            int height = Integer.parseInt(token3[4]);
                            globalDrops.add(new GlobalDrop(id,amount,x,y,height));  

                    }

            } else {

                    if (line.equals("[ENDOFDROPLIST]")) {

                            try {

                                    characterfile.close();

                            } catch (IOException ioexception) {

                            }

                            return true;

                    }

            }

            try {

                    line = characterfile.readLine();

            } catch (IOException ioexception1) {

                    EndOfFile = true;

            }

    }

    try {

            characterfile.close();

    } catch (IOException ioexception) {

    }

    return false;

}

然而,它一直在给我这个错误:

[8/3/12 5:24 PM]: Exception in thread "main" [8/3/12 5:24 PM]: java.lang.NumberFormatException: For input string: "1923     3208    3214    1       0       2       "

这是文本文件格式化的方式:

sque = 1923     3208    3214    1       0       2       Square

为什么这会给我错误?它与/ t / splits有关吗?

由于

这是工作中的一个:

sque = 1923 3208    3214    1   0   2       Square

但是,我正试图加载其中400多个,一次更改所有这些将是痛苦的

3 个答案:

答案 0 :(得分:0)

从异常看,传递给int转换例程的任何东西都不是可解析的整数。

实际上看起来你的程序没有正确地解析输入字符串而留下数字序列,可能是因为你使用了“\ t”。我会检查正则表达式,看看你是否真的可以找到这些标签并正确拆分这个文件,然后转换为整数。

你还可以成为一名防御性程序员,在将它实际转换为int之前检查字符串是否可转换为int。

public static boolean isNumeric(String aStringValue) {
   Pattern pattern = Pattern.compile( "\\d+" );
   Matcher matcher = pattern.matcher(aStringValue);
   return matcher.matches();

}

另外,只是为了调试试试:

s = s.replaceAll("\\t","|");

看看它是怎么样的。

答案 1 :(得分:0)

对,因为:

"1923     3208    3214    1       0       2       "

不是数字。异常似乎很清楚 - 您需要将该行标记为数字部分,然后逐个解析。

答案 2 :(得分:0)

替换所有这些

                token = line.substring(0, spot);
                token = token.trim();
                token2 = line.substring(spot + 1);
                token2 = token2.trim();
                token2_2 = token2.replaceAll("\t\t", "\t");
                token2_2 = token2_2.replaceAll("\t\t", "\t");
                token2_2 = token2_2.replaceAll("\t\t", "\t");
                token2_2 = token2_2.replaceAll("\t\t", "\t");
                token2_2 = token2_2.replaceAll("\t\t", "\t");
                token3 = token2_2.split("\t");**

String[] cmd = line.split("=");
token = cmd[0].trim;
String[] numbers = cmd[1].split("\\s+");

数组numbers将包含数字字符串标记,已经修剪并准备好由Integer.parseInt()解释。