尝试运行我的程序时收到NumberFormatException错误

时间:2014-04-29 02:44:07

标签: java

我之前提出过这个问题但被要求添加其他信息,之后再也没有得到回复。提前抱歉。我不是试图垃圾网站或任何东西。我只是在寻求帮助。

我在线程" main"中收到错误Exception。 java.lang.NumberFormatException:对于输入字符串:" 3 50"在下面的代码中。我很难解决它。任何人都可以对它的内容有所了解吗?根据我的理解,它通常意味着错误在第3行和第50行正确吗?

 package report.generator;

 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.BufferedWriter;
 import java.io.IOException;

 public class ReportGenerator
 {


 public static void main(String[] args)
 {
    BufferedReader br = null;
    BufferedWriter bw = null;

    try
    {
        br = new BufferedReader(new FileReader("C:\\sprocketorders.txt"));
        String line;
        String element[] = new String[2];
        int   sum[] = new int[5];
        File file = new File ("C:\\sprocketordersreport.txt");

        while ((line = br.readLine()) != null)
        {
            element = line.split(" ");

            switch(Integer.parseInt(element[0]))
            {
                case 1:
                    sum[0] = sum[0] + Integer.parseInt(element[1]);
                    break;
                case 2:
                    sum[1] = sum[1] + Integer.parseInt(element[1]);
                    break;
                case 3:
                    sum[2] = sum[2] + Integer.parseInt(element[1]);
                    break;
                case 4:
                    sum[3] = sum[3] + Integer.parseInt(element[1]);
                    break;
                case 5:
                    sum[4] = sum[4] + Integer.parseInt(element[1]);
                    break;
            }
        }

        if (!file.exists())
        {
            file.createNewFile();
        }

        FileWriter fw = new FileWriter(file.getAbsoluteFile());
        bw = new BufferedWriter(fw);
        bw.write("Spacely Sprockets\nTaking Sprockets into the Future\nSales Summary Report\nSprocket Number Total Quantity Sold\n");
        for(int i = 0; i < sum.length; i++)
            bw.write((i + 1) + "\t" + sum[i] + "\n");

    }
    catch (IOException e)
    {
         e.printStackTrace();

    }
    finally
    {
       try
        {
            if (br != null)
                br.close();
            if (bw != null)
                bw.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        }
      }

  }

该程序将从文本文件中获取输入并以报告格式输出信息。

编辑:这是输入文件信息。看了之后,看起来这可能是问题的来源。但我并不完全确定。

3 50

2 20

2 100

5 15

1 90

5 85

4 300

2 35

3 100

它没有像在文本文件中那样格式化它。左边的整数和右边的整数之间有更多的空格。

                        Spacely Sprockets
                 Taking Sprockets into the Future 
                      Sales Summary Report
    Sprocket Number                          Total Quantity Sold
         1                                           90
         2                                           155
         3                                           50
         4                                           300
         5                                           100

这是我想要的输出报告。左边的每个数字都是一个链轮编号。右边的数字反映了每个链轮的销售量。

这是尝试运行时的完整例外:

Exception in thread "main" java.lang.NumberFormatException: For input string: "3    50"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at report.generator.ReportGenerator.main(ReportGenerator.java:32)

http://m.uploadedit.com/b034/1398740135243.txt

4 个答案:

答案 0 :(得分:1)

试试这个:

line = line.trim().replaceAll("\\s+", " ");
element = line.split(" ");

答案 1 :(得分:1)

您正在阅读的文件有一个元素为&#34; 3 50&#34; .3和5之间的字符可能是空格或特殊字符。删除/更正该行或处理读取行时获得的任何异常

答案 2 :(得分:0)

我建议你只使用+=StringTokenizer;它在这里工作,无论我放在文件中的行的空白区域 -

while ((line = br.readLine()) != null) {
    StringTokenizer st = new StringTokenizer(line); // On the line.
    String a = null;
    String b = null;
    if (st.hasMoreElements()) {
      a = st.nextToken();
      if (st.hasMoreElements()) {
        b = st.nextToken();
      }
    }
    if (a != null && b != null) {
      switch (Integer.parseInt(a.trim())) {
      case 1:
        sum[0] += Integer.parseInt(b.trim());
        break;
      case 2:
        sum[1] += Integer.parseInt(b.trim());
        break;
      case 3:
        sum[2] += Integer.parseInt(b.trim());
        break;
      case 4:
        sum[3] += Integer.parseInt(b.trim());
        break;
      case 5:
        sum[4] += Integer.parseInt(b.trim());
        break;
      }
    }
  }

答案 3 :(得分:0)

我跑了你的程序。

它有以下问题

当您使用缓冲读取器读取新行时,实际上您将获得整行内容。

但是当我检查你的输入文件时,它在每一行之间都有一行为空。

但缓冲读取器读取行甚至将空行视为一行并尝试解析它

但是解析空行给了我们绝对的数字格式异常。

所以在分割和处理你的行之前做一个检查,不管行是否为空,如果不为空则继续。

这是我在分割线并继续进行之前添加的

if(!line.equals(""))

下面是完整的程序,现在对我来说工作正常,并让我知道任何问题。

package com.kb;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class ParseIntDemo {


    public static void main(String[] args)
     {
        BufferedReader br = null;
        BufferedWriter bw = null;

        try
        {
            br = new BufferedReader(new FileReader("D:\\sprocketorders.txt"));
            String line;
            String element[] = new String[2];
            int   sum[] = new int[5];
            File file = new File ("D:\\sprocketordersreport.txt");

            while ((line = br.readLine()) != null)
            {
                if(!line.equals("")){
                element = line.split(" ");

                switch(Integer.parseInt(element[0]))
                {
                    case 1:
                        sum[0] = sum[0] + Integer.parseInt(element[1]);
                        break;
                    case 2:
                        sum[1] = sum[1] + Integer.parseInt(element[1]);
                        break;
                    case 3:
                        sum[2] = sum[2] + Integer.parseInt(element[1]);
                        break;
                    case 4:
                        sum[3] = sum[3] + Integer.parseInt(element[1]);
                        break;
                    case 5:
                        sum[4] = sum[4] + Integer.parseInt(element[1]);
                        break;
                }
            }

            if (!file.exists())
            {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            bw = new BufferedWriter(fw);
            bw.write("Spacely Sprockets\nTaking Sprockets into the Future\nSales Summary Report\nSprocket Number Total Quantity Sold\n");
            for(int i = 0; i < sum.length; i++)
                 bw.write((i + 1) + "\t" + sum[i] + "\n");
            }

        }
        catch (IOException e)
        {
             e.printStackTrace();

        }
        finally
        {
           try
            {
                if (br != null)
                    br.close();
                if (bw != null)
                    bw.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            }
          }

}