【问题标题】:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 on an input file program线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException:输入文件程序上的 1
【发布时间】:2014-05-01 06:59:33
【问题描述】:

我收到一条消息: 线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:1 尝试运行以下代码时。该程序从文本文件中获取输入,处理一些工资数字,并输出他们的总工资。

这是文本文件的内容: http://m.uploadedit.com/b034/139892732049.txt

 package payroll;

 import java.io.File;
 import java.io.FileNotFoundException;
 import java.util.Scanner;
 import javax.swing.JOptionPane;

 public class PayRoll
 {
    private String empName;
    private int hours;
    private int hourlyPayRate;

    public PayRoll(String name, int hh, int rr)
    {
        empName = name;
        hours = hh;
        hourlyPayRate = rr;      
    }  

    public String getName()
    {
        return empName;
    }

    public double getPay()
    {
        if(hours <= 40)
            return hours * hourlyPayRate;
        else
            return (40 * hourlyPayRate) + (hours - 40) * 1.5 * hourlyPayRate;
    }

    public static void main(String[] args)
    {  
        Scanner inFile = null;

        try
        {
        inFile = new Scanner(new File("payroll.txt"));
        }
        catch(FileNotFoundException e)
        {
           e.printStackTrace();
        }

        String name;
        String first;
        String last;
        int hh;
        int rr;
        String result = "Details of employees:\n";

        while(inFile.hasNextLine())
        {
            String line = inFile.nextLine();

            String tokens[] = line.split(" ");

           first = tokens[0];
           last = tokens[1];
            hh = Integer.parseInt(tokens[2]);
            rr = Integer.parseInt(tokens[3]);

            name = first + " " + last;

            PayRoll payroll = new PayRoll(name, hh, rr);

            result += "Name: " + payroll.getName() + ", GrossPay: $" + payroll.getPay() + "\n";
        }

        JOptionPane.showMessageDialog(null, result);

        inFile.close();
    }
 }

【问题讨论】:

  • 哪一行代码和你的数据文件导致异常?

标签: java swing indexoutofboundsexception


【解决方案1】:

问题是您的文件中有空行,这会导致令牌数组长度为零

每次读取后验证令牌数组的长度。

  if (token == null || token.length != 4) continue;

当然,正如 Duncan 建议的那样,直接跳过空行或两者都跳过(更好的选择)。

  if (line == null || line.trim().length() < 1) continue;

这两项检查都应该进行,并且可能单独报告。

【讨论】:

  • 或者去掉split之前的空行。这将有助于区分格式错误的行和空行。
  • @Duncan 感谢您的意见。
  • @IwishIcouldthinkofagood 此时我如何能够跳过空行?我编辑了文本文件并删除了我能找到的所有空行。不确定它是否有帮助,但我仍然遇到同样的错误。
【解决方案2】:

你没有在做String tokens[] = line.split(" ");之后检查你有多少令牌

如果拆分结果少于 2 个令牌,您将获得 ArrayIndexOutOfBoundsException

您可能应该添加如下检查:

if(tokens.length < 2) {
   continue;
}

【讨论】:

  • 我同意应该进行检查,但输入字符串确实有四个空格分隔的字符串。
  • 你建议我如何改变它?在这一点上我几乎是油炸的,所以任何煽动都会很棒。
  • @Pshemo 好点。这个答案将解决这个问题,尽管我也对另一个答案投了赞成票,因为他似乎首先指出了潜在的问题。
  • @geo 我试图在 while 循环中添加您的检查,但它没有解决问题。我放错了吗?
  • 放在String tokens[] = line.split(" ");后面应该没问题
【解决方案3】:

据我所知,您的数据文件包含空行。我相信第一个空行会导致这个问题,因为split() 返回空(零长度)数组。

【讨论】:

    【解决方案4】:

    payroll.txt文件的最后一行是一个空行,所以当它被分割时,它会生成一个大小为1的数组。那么这(last = tokens[1];)行代码显然会报错。

    重写你的代码如下,我已经添加了在分割之前修剪行,并在while循环中添加了continue

    package payroll;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.util.Scanner;
    import javax.swing.JOptionPane;
    
    public class PayRoll {
        private String empName;
        private int hours;
        private int hourlyPayRate;
    
        public PayRoll(String name, int hh, int rr) {
            empName = name;
            hours = hh;
            hourlyPayRate = rr;
        }
    
        public String getName() {
            return empName;
        }
    
        public double getPay() {
            if (hours <= 40)
                return hours * hourlyPayRate;
            else
                return (40 * hourlyPayRate) + (hours - 40) * 1.5 * hourlyPayRate;
        }
    
        public static void main(String[] args) {
            Scanner inFile = null;
    
            try {
                inFile = new Scanner(new File(
                        "C:\\Users\\Visruth\\Desktop\\payroll.txt"));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
    
            String name = null;
            String first = null;
            String last = null;
            int hh;
            int rr;
            String result = "Details of employees:\n";
    
            while (inFile.hasNextLine()) {
    
                String line = inFile.nextLine().trim();
                System.out.println(line);
                String[] tokens = line.split(" ");
                if (tokens.length != 4) {
                    continue;
                }
    
                first = tokens[0];
                last = tokens[1];
                hh = Integer.parseInt(tokens[2]);
                rr = Integer.parseInt(tokens[3]);
    
                name = first + " " + last;
    
                PayRoll payroll = new PayRoll(name, hh, rr);
    
                result += "Name: " + payroll.getName() + ", GrossPay: $"
                        + payroll.getPay() + "\n";
            }
    
            JOptionPane.showMessageDialog(null, result);
    
            inFile.close();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      相关资源
      最近更新 更多