2017-03-06 12 views
0

日付を含む文字列をchar配列に変換し、その月を抽出して変換しようとしています。Android:Array Index Of Boundsエラー

私はAPIを使用していますが、サーバーは「2015-04-10」の形式で日付を提供しています。これを2015年4月10日に変換しようとしています。

  1. サーバから受信した日付を格納する文字列が文字列です。
  2. 文字列全体をchar配列に変換しています。
  3. 私はこの配列をループして、3つの配列に分けています: YEAR、MONTH、DAY。
  4. これらの配列を別々に文字列に変換しています。
  5. 次に、 '月'文字列と値を比較し、if-else条件を使用して月名を割り当てます。
  6. 最後に、私が望む順序に従って3つの文字列を追加します。

Androidのメーカーは言う:ここ

java.lang.ArrayIndexOutOfBoundsException: length=2; index=5が私のコードです:java.lang.ArrayIndexOutOfBoundsException: length=2; index=5は(私がマークされています:

//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にメッセージがある( 'TEMP' は、日付を含む文字列です) )このエラーが表示される行...)

助けてください!

+3

SimpleDateFormatを使用すると、多くの苦痛が軽減されます。https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html –

+0

明確なエラーは、 'i = 5'だから' month [i] '例外、いくつかのデバッグを行い、上記の提案に従ってください –

+0

あなたはサイズ2の配列を宣言しています: char month [] = new char [2]; および(I = 0 int型、私はこの より大きいループ作る; [I] 4 && iは<7){ 月[I] =放出を; } ... あなたの配列でローカルインデックスを使用する必要があります – rodrigo

答えて

1

まずで、あなたの方法は、最善ではありません方法月月文字列月に変換する方法。 DateSimpleDateFormatメソッドを使用すると、変換するのがより簡単で安定しているはずです。


セカンド

は、あなたがクラッシュのために間違った行をマークしています。 指数は5配列の長さであることを示しています(java.lang.ArrayIndexOutOfBoundsException: ***length=2; index=5***) このクラッシュは4です。

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]; 
} 

サード:あなたはmonth[5] = release[5];を呼び出していると、月の長さはこれだけにコードを変更避けるために2

あるので

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]; 
} 

クラッシュが起こっていますこのように年、月、日を取得したい場合は、より簡単ですこの方法では。

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

希望します。

+0

P.S. 4番目のパラでは、 '' string year = date_splited [0] '....でなければなりません。 –

+0

ようこそ – Klevi01

1

あなたは 0 11から私はにわたる放出配列は、10桁の数字のみを使用すると、0から9

に繰り返す必要がありますので、ああ、それはあなたの問題、あなたの主な問題その年ではありません待っ含ま反復されていますが... 3

はすべて私がいないと思うからであるということも大きい場合にのみ、私はので、あなたがアイテムを得ることができない0〜3の4つのオブジェクトが含まれていますログの猫はindex=5と書いてありますので、私はですが、の場合はが4より小さいので、あなたが言っている行が含まれています。

そしてまた、それは、日付配列または配列が、それは配列

を読んだとき、私は中@Kenウルフウルフようブリーフィングない方法のどちらかを読んだときの長さは2ので、それがクラッシュしていると言いますあなたが使用できるコメント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); 
0

あなたが言う場所で問題が発生していません。おそらく、最初のif文またはthridのif文で発生します。 date []とmonth []は長さが2で、インデックスが2より大きいインデックスにアクセスしようとしているためです。

0

正しい方法ではOmarとマークされたSimpleDateFormatを使用してください。 日付(またはカレンダーは情報に使用する予定に応じている場合があります)を取得したら、ローカル設定を使用してそれを翻訳することができます。

0

なぜchar []を使用しますか? String []を直接使用することができます。文字列にはsplitメソッドがあります。したがってsplitメソッドを使用すると、年月を分けることができます。あなたは、コードの下に使用することができます:

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

一時[0]一時、2015年である[1] 04とTEMPである[1] 10

関連する問題