Android:数组索引超出界限错误

时间:2017-03-06 17:23:37

标签: java android arrays string android-studio

我正在尝试将包含日期的字符串转换为char数组,然后提取月份并将其转换。

我使用API​​,服务器以以下格式提供日期:" 2015-04-10",我试图将其转换为:" 4月10日, 。2015"

  1. 我存储从服务器收到的日期是字符串。
  2. 我将整个字符串转换为char数组。
  3. 我在这个数组中运行循环并将其分成三个数组: 年月日。
  4. 我将这些数组分别转换为字符串。
  5. 然后我比较了这个月的情况。字符串到值,然后使用if-else条件为其分配月份名称。
  6. 最后,我按照我想要的顺序添加了三个字符串。
  7. Android Studio说:java.lang.ArrayIndexOutOfBoundsException: length=2; index=5

    这是我的代码:(' temp'是包含日期的字符串)

    //TODO: Here lies the method which will apparently convert the movie string to human read-able format...... Use it with caution.
        char release[] = temp.toCharArray();
        Log.d("LOG", release.toString());
    
        char date[] = new char[2];
        char year[] = new char[4];
        char month[] = new char[2];
    
        for (int i = 0; i < 11; i++) {
    
            try {
                if (i > 4 && i < 7) {
                    month[i] = release[i];
                }
    
                if (i < 4) {
                    year[i] = release[i];    // ---> Android Studio says error on this line...
                }
    
                if (i > 7 && i < 10) {
                    date[i] = release[i];
                }
            } catch (Error error) {
                error.printStackTrace();
            }
        }
    
        String monthString = month.toString();
        String dateString = date.toString();
        String yearString = year.toString();
        String finalReleaseDate;
    
        if (monthString.contentEquals("01")) {
            monthString = "January";
        } else if (monthString.contentEquals("02")) {
            monthString = "February";
        } else if (monthString.contentEquals("03")) {
            monthString = "March";
        } else if (monthString.contentEquals("04")) {
            monthString = "April";
        } else if (monthString.contentEquals("05")) {
            monthString = "May";
        } else if (monthString.contentEquals("06")) {
            monthString = "June";
        } else if (monthString.contentEquals("07")) {
            monthString = "July";
        } else if (monthString.contentEquals("08")) {
            monthString = "August";
        } else if (monthString.contentEquals("09")) {
            monthString = "September";
        } else if (monthString.contentEquals("10")) {
            monthString = "October";
        } else if (monthString.contentEquals("11")) {
            monthString = "November";
        } else if (monthString.contentEquals("12")) {
            monthString = "December";
        }
    
        finalReleaseDate = dateString + " " + monthString + ", " + yearString;
        movieModel.setReleaseDate(finalReleaseDate);
    

    logcat中的消息是:java.lang.ArrayIndexOutOfBoundsException: length=2; index=5(我已经标记了显示此错误的行..)

    请帮助!!

5 个答案:

答案 0 :(得分:1)

您正在迭代 i 从0到11 发布数组仅包含10位数字,因此您应该从0到9进行迭代

哦,等等,是不是你的问题,你的主要问题是只包含从0至3 4点的对象,以便我你不能让项目时的 I < / em>大于3

这就是我猜的全部...... log cat说index=5所以当 i 为5时发生了错误,但是当 i 小于4时,你所说的行被包括在内,所以我猜你读日志猫错了。

而且它还说长度为2,因此在读取日期数组或数组时崩溃但是当它读取年数组

我在评论中向@Ken Wolf Wolf简要介绍了SimpleDateFormat

SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-mm-dd", Locale.getDefault());
Date date = simpleDate.parse("");
simpleDate = new SimpleDateFormat("dd MMMM, yyyy.", Locale.getDefault());
String newFormatString = simpleDate.format(date);

答案 1 :(得分:1)

首先 ,您的方法不是将号码月转换为字符串月的最佳方法。使用DateSimpleDateFormat方法转换它应该更容易,更稳定。

第二次 ,您已为崩溃标记了错误的行。 此次崩溃(java.lang.ArrayIndexOutOfBoundsException: ***length=2; index=5***)告诉您 索引为5 数组长度为4

if (i < 4) {
   year[i] = release[i];  //index 5 cannot be called here and year lenght is 4
}
if (i > 4 && i < 7) {
   month[i] = release[i]; //index 5 is called here and month lenght is 2
}
if (i > 7 && i < 10) {
   date[i] = release[i];
}

正在发生崩溃,因为您正在呼叫month[5] = release[5];并且月份长度仅为2。

为避免这种情况,请将您的代码更改为:

if (i<4) {
    //2015 index  0,1,2,3
    year[i] = release[i];
} else if (i>4 && i<7) {
    //04 index  5,6
    month[i-5] = release[i];
} else if (i>7 && i<10) {
    //10 index 8,9
    date[i-8] = release[i];
}

第三次 ,如果你想通过这种方式获得年,月,日,那就更容易了。

String [] date_splited = server_string.split("-");
String year  = date_splited[0];
String month = date_splited[1];
String day   = date_splited[2];

希望它对你有所帮助。

答案 2 :(得分:0)

问题不在你说的地方。它可能发生在第一个或第三个if语句中。因为date []和month []的长度都只有2,并且您尝试访问索引大于2的那个。

答案 3 :(得分:0)

正确的方法应该是使用SimpleDateFormat作为Omar标记。 一旦您有一个日期(或日历可能取决于您将提供给信息的用途),您可以使用本地设置进行翻译。

答案 4 :(得分:0)

为什么使用char []?你可以直接使用String []。在字符串中有分割方法可用。因此,使用拆分方法,您可以分隔日期月份和年份。您可以使用以下代码:

String date=  "2015-04-10";
String[] temp= date.split("-");

temp [0]是2015,temp [1]是04,temp [1]是10。