【问题标题】:Receiving NumberFormatException error when trying to run my program尝试运行我的程序时收到 NumberFormatException 错误
【发布时间】:2014-04-29 02:44:07
【问题描述】:

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

我在线程 "main" java.lang.NumberFormatException: For input string: "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

2100

5 15

1 90

5 85

4 300

2 35

3100

它的格式与文本文件中的完全不同。左边的整数和右边的整数之间有更多的空格。

                        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

【问题讨论】:

  • 你期望每行输入的输出是什么,为什么?此外,这是您的第一行输入。请发布您的整个异常,它会告诉您源代码中的哪一行抛出异常。
  • "3 50" 不是数字;这是两个数字。如果您遇到该错误,这就是您要传递的内容。
  • 而且...刚刚抓住了你的最后一段。您是在告诉它拆分为一个单独的空间……这不是您文件中的内容。
  • Java 作者一定在哭。他们花了这么多时间来建立一个有用且信息丰富的异常系统,但人们甚至没有阅读它们,或者认为它们足够重要,无法发布他们的编码问题......
  • 为了帮助您阅读异常输出,异常来自第 65 行。

标签: java


【解决方案1】:

试试这个:

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

【讨论】:

  • 这将添加到哪里?在while循环里面?
  • element = line.split(" "); 将另一行放在它的正上方。
  • @Takendarkk 知道了。试过了。现在得到了这个异常: java.io.IOException: Access is denied at java.io.WinNTFileSystem.createFileExclusively(Native Method) at java.io.File.createNewFile(File.java:1006) at report.generator.ReportGenerator.main (ReportGenerator.java:55)
  • 'Access is denied at java.io.WinNTFileSystem.createFileExclusively(Native Method)' 这对我来说是新的,我现在把火炬传递给更有经验的人。
  • @Takendarkk 感谢您迄今为止的帮助。我回答了关于第 65 行的问题。如果有任何方法可以在不添加 line = line.trim().replaceAll("\\s+", " "); 的情况下解决这个问题。那太好了。
【解决方案2】:

您正在阅读的文件有一个元素为“3 50”。3 到 5 之间的字符可能是空格或特殊字符。删除/更正该行或处理您在读取行时遇到的任何异常

【讨论】:

    【解决方案3】:

    我敦促您只使用+=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;
          }
        }
      }
    

    【讨论】:

      【解决方案4】:

      我运行了你的程序。

      有以下问题

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

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

      但缓冲区读取器读取行甚至将空行视为一行并尝试对其进行解析

      但解析空行肯定会给我们数字格式异常。

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

      这是我在拆分一行并继续进行之前添加的内容

      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();
                  }
                  }
                }
      
      }
      

      【讨论】:

      • 我在使用您的代码时遇到同样的 NumberFormatException 错误
      • 我可以运行它并得到如下输出,任何特殊字符? Spacely Sprockets 将 Sprockets 带入未来 销售总结报告 Sprocket Number 总销量 1 90 2 155 3 150 4 300 5 100
      • 我没有看到任何不同。我会尝试再次通过它。我什至从头开始了一个新项目并遇到了同样的问题。
      • 902 1553 1504 3005 100..这是写入我的目标文件的内容。与您预先附加的文本...是您预期的 o/p 我得到的吗?
      • 还没有解决。我再次从头开始一个新程序,并使用您的代码而不是文件位置。我没有找到问题。我仍然遇到和以前一样的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多