调试帮助 - ArrayIndexOutOfBoundsException

时间:2017-11-30 17:44:22

标签: java

我的程序编译正确,但是当我尝试运行它时,我收到相同的消息:

  

线程中的异常" main"我的日历程序出现java.lang.ArrayIndexOutOfBoundsException: 1错误

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package displaycalendars;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class DisplayCalendars {

  public static void main(String[] args){
    Calendar calendar = new GregorianCalendar
            (Integer.valueOf(args[1]),
            Integer.valueOf(args[0])-1,1);

    printHeader(calendar);
    printData(calendar);            
  }

  public static void printHeader(Calendar calendar){

    int month = calendar.get(Calendar.MONTH)+1;

    String monthName = "";

    switch(month){
      case 1: monthName="January";
        break;
      case 2: monthName="February";
        break;
      case 3: monthName="March";
        break;
      case 4: monthName="April";
        break;
      case 5: monthName="May";
        break;
      case 6: monthName="June";
        break;
      case 7: monthName="July";
        break;
      case 8: monthName="August";
        break;
      case 9: monthName="September";
        break;
      case 10: monthName="October";
        break;
      case 11: monthName="November";
        break;
      case 12: monthName="December";
        break;
    }

    System.out.println(" "+monthName+ ", " +calendar.get(Calendar.YEAR));
    System.out.println("--------------------");
    System.out.println("Sun Mon Tue Wed Thu Fri Sat");
  }

  public static void printData(Calendar calendar){
    int dayinWeek=calendar.get(Calendar.DAY_OF_WEEK);

    for (int i = 1; i< (dayinWeek); i++)
    {
      System.out.print(" ");
    }
    for (int i = 1; i <
        (Calendar.DATE); i++){
      System.out.print("\n");
      calendar.add(Calendar.DATE,1);
    }
    System.out.printf("%4d",calendar.get(Calendar.DATE));
  }
}

1 个答案:

答案 0 :(得分:0)

说明

检查错误消息中提供的堆栈跟踪。它指向你写的行

Calendar calendar = new GregorianCalendar
        (Integer.valueOf(args[1]),
        Integer.valueOf(args[0]) - 1, 1);

每当您尝试在其边界之外的索引处访问数组时,都会抛出ArrayIndexOutOfBoundsException。这意味着如果一个数组包含6个元素,你可以访问7个元素。或者,如果您尝试访问元素编号-1(当然不存在)。来自documentation

  

抛出表示已使用非法索引访问数组。该索引要么,要么大于或等于到数组的大小

如果您正在访问

args[1]
// and
args[0]

并且您得到一个例外,因为args不包含索引0或索引1的元素。它可能是空的。您可以使用args.length之类的

进行检查
System.out.println("The size is: " + args.length);

命令行参数

args方法的main参数由 JVM 自动创建,并且机器传递您在创建应用程序时提供的参数,所谓的命令行参数

这通常位于控制台中,您可以使用某种

启动应用
java DisplayCalendars

命令。然后你可以传递像

这样的参数
java DisplayCalendars firstArgument secondArgument

之后,JVM会自动为args分配给定的参数:

args[0] => firstArgument
args[1] => secondArgument

如果您使用 IDE ,您可能还可以在设置中的某处设置一些命令行参数(在Eclipse中,它位于运行配置设置中)。

有关official Oracle tutorial的更多信息。

相关问题