2017-05-03 2 views
1

나는 안드로이드에있어 초보자입니다. 내 응용 프로그램에서 ArrayIndexOutOfBoundsException이 발생하는 경우가 있습니다. 그러나 나는 그것을 재현 할 수 없다. 그 누구도 날이 예외 로그 캣arraylist에 대한 ArrayIndexOutOfBoundsException 처리 방법

Non-fatal Exception: java.lang.IndexOutOfBoundsException: Invalid index 6, size is 6 
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
    at java.util.ArrayList.get(ArrayList.java:308) 
    at com.beco.ibeco.model.Store.getOpenHoursString(Store.java:209) 
    at com.beco.ibeco.app.store.StoreDetailFragment.populateStoreViews(StoreDetailFragment.java:491) 
    at com.beco.ibeco.app.store.StoreDetailFragment.access$700(StoreDetailFragment.java:99) 
    at com.beco.ibeco.app.store.StoreDetailFragment$3.onLoadFinished(StoreDetailFragment.java:408) 
    at com.beco.ibeco.app.store.StoreDetailFragment$3.onLoadFinished(StoreDetailFragment.java:386) 
    at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:479) 
    at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:447) 
    at android.support.v4.content.Loader.deliverResult(Loader.java:126) 
    at com.beco.ibeco.content.ModelLoader.deliverResult(ModelLoader.java:61) 
    at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:249) 
    at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:77) 
    at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:476) 
    at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:493) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:7325) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

를 해결하는 데 도움이 그리고이 코드

public String getOpenHoursString() { 
    MutableDateTime now = MutableDateTime.now(); 
    int dayIndex = now.getDayOfWeek() - 1; 
    if (hours != null) { 
     OpeningHour bopHours = hours.get(dayIndex); 
     if (bopHours != null && bopHours.openTime != null && bopHours.closeTime != null) { 
      DateTimeZone timeZone = DateTimeZone.getDefault(); 
      DateTimeFormatter format = DateTimeFormat.forPattern("h:mm a"); 
      DateTimeFormatter parseFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").withZoneUTC(); 
      DateTime open = DateTime.parse(bopHours.openTime, parseFormat).toDateTime(timeZone); 
      DateTime close = DateTime.parse(bopHours.closeTime, parseFormat).toDateTime(timeZone); 
      if ((now.getHourOfDay() >= open.getHourOfDay()) && (now.getHourOfDay() < close.getHourOfDay())) { 
       return String.format("Open till - %s", format.print(close)).toLowerCase(); 
      } else { 
       return String.format("%s - %s", format.print(open), format.print(close)).toLowerCase(); 
      } 

     } 
    } 

    return ""; 
} 

public String getOpenCloseString(int type){ 
    Map<Integer,String> mOpeningHours = new LinkedHashMap<>(); 
    for (OpeningHour bopHours : hours) { 
     DateTimeZone timeZone = DateTimeZone.getDefault(); 
     DateTimeFormatter format = DateTimeFormat.forPattern("h:mm a"); 
     DateTimeFormatter parseFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").withZoneUTC(); 
     DateTime open = DateTime.parse(bopHours.openTime, parseFormat).toDateTime(timeZone); 
     DateTime close = DateTime.parse(bopHours.closeTime, parseFormat).toDateTime(timeZone); 
     mOpeningHours.put(bopHours.day,String.format("%s - %s", format.print(open), format.print(close)).toUpperCase()); 
    } 
    return mOpeningHours.get(type) == null?"closed":mOpeningHours.get(type); 
} 

populateStoreViews()

private void populateStoreViews(Store store) { 
    if (store == null || mWideImageView == null || mStoreLogo == null) { 
     return; 
    } 

    if (store.isFavourite() && Beco.getApp().currentUser().isSignedIn()) { 
     imageView.setImageDrawable(getResources().getDrawable(R.drawable.ic_favorite)); 
    } else { 
     imageView.setImageDrawable(getResources().getDrawable(R.drawable.ic_favourite_unselected_15dp)); 
    } 

    setTitle(store.getName()); 

    ImageRequest request = ImageRequestBuilder.newBuilderWithSource(store.getImageUri(Store.IMAGE_WIDE, Beco.getApp().getDensity())) 
      .setProgressiveRenderingEnabled(true) 
      .build(); 
    DraweeController controller = Fresco.newDraweeControllerBuilder() 
      .setImageRequest(request) 
      .setOldController(mWideImageView.getController()) 
      .build(); 
    GenericDraweeHierarchyBuilder builder = 
      new GenericDraweeHierarchyBuilder(getContext().getResources()); 
    GenericDraweeHierarchy hierarchy = builder 
      .setFadeDuration(200) 
      .setPlaceholderImage(ContextCompat.getDrawable(getContext(), R.drawable.image_mall_default)) 
      .build(); 


    mWideImageView.setHierarchy(hierarchy); 
    mWideImageView.setController(controller); 

    containerStoreLogo.setCardBackgroundColor(store.getColor()); 

    ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(store.getImageUri(Store.IMAGE_SQ, Beco.getApp().getDensity())) 
      .setProgressiveRenderingEnabled(true) 
      .build(); 
    DraweeController draweeController = Fresco.newDraweeControllerBuilder() 
      .setImageRequest(imageRequest) 
      .setOldController(mStoreLogo.getController()) 
      .build(); 
    GenericDraweeHierarchyBuilder genericDraweeHierarchyBuilder = 
      new GenericDraweeHierarchyBuilder(getContext().getResources()); 
    GenericDraweeHierarchy genericDraweeHierarchy = genericDraweeHierarchyBuilder 
      .setFadeDuration(200) 
      .setPlaceholderImage(ContextCompat.getDrawable(getContext(), R.drawable.img_store_loader)) 
      .build(); 


    mStoreLogo.setHierarchy(genericDraweeHierarchy); 
    mStoreLogo.setController(draweeController); 
    mAddressView.setText(store.getName()); 
    mStatusView.setText(store.getOpenHoursString());/*this line*/ 
    mDistanceView.setText(getResources().getString(R.string.distance_string, store.getDistanceString(Beco.getApp().getLocation()))); 

} 

이며,이에 대한 샘플 응답입니다 수 서버의 arraylist

hours: [ 
{ 
close_time: "2017-05-03T16:30:00Z", 
day: 1, 
open_time: "2017-05-03T06:00:00Z" 
}, 
{ 
close_time: "2017-05-03T16:30:00Z", 
day: 2, 
open_time: "2017-05-03T06:00:00Z" 
}, 
{ 
close_time: "2017-05-03T16:30:00Z", 
day: 3, 
open_time: "2017-05-03T06:00:00Z" 
}, 
{ 
close_time: "2017-05-03T16:30:00Z", 
day: 4, 
open_time: "2017-05-03T06:00:00Z" 
}, 
{ 
close_time: "2017-05-03T16:30:00Z", 
day: 5, 
open_time: "2017-05-03T06:00:00Z" 
}, 
{ 
close_time: "2017-05-03T16:30:00Z", 
day: 6, 
open_time: "2017-05-03T06:00:00Z" 
}, 
{ 
close_time: "2017-05-03T16:30:00Z", 
day: 7, 
open_time: "2017-05-03T06:00:00Z" 
} 
] 

나는 일부 점포의 경우

내가 응답로 받고 있어요 (7-1 = 6로 dayIndex을 줄 것이다) 일요일에서 이러한 예외를 받고 있어요

편집

hours: [ 
{ 
close_time: "2017-05-03T15:00:00Z", 
day: 2, 
open_time: "2017-05-03T04:30:00Z" 
}, 
{ 
close_time: "2017-05-03T15:00:00Z", 
day: 3, 
open_time: "2017-05-03T04:30:00Z" 
}, 
{ 
close_time: "2017-05-03T15:00:00Z", 
day: 4, 
open_time: "2017-05-03T04:30:00Z" 
}, 
{ 
close_time: "2017-05-03T15:00:00Z", 
day: 5, 
open_time: "2017-05-03T04:30:00Z" 
}, 
{ 
close_time: "2017-05-03T15:00:00Z", 
day: 6, 
open_time: "2017-05-03T04:30:00Z" 
}, 
{ 
close_time: "2017-05-03T15:00:00Z", 
day: 7, 
open_time: "2017-05-03T04:30:00Z" 
} 
] 

제발 도와주세요. 미리 감사드립니다!

+0

[ArrayIndexOutOfBoundsException이 발생하는 이유는 무엇이며 Android에서이를 피하는 방법은 무엇입니까?] (http://stackoverflow.com/questions/4958235/why-does-arrayindexoutofboundsexception-occur-and-how-to) -avoid-it-in-android) –

+1

배열 인덱스는 0부터 시작합니다. 많은 코드를 작성하기 전에 Java 개념을 수정해야합니다. o – Debdeep

+1

기본적으로 List에는 적어도 요일만큼의 항목이 있어야하며 그렇지 않은 경우가 있습니다. 목록에 6 개의 항목 만 있기 때문에 경계 밖에서 마지막 주를 잡으려고 할 때. 따라서 서버에서 가져온 데이터에 문제가 있습니다. 또는 "시간"목록을 올바르게 작성하지 않아도됩니다. – Eselfar

답변

0

다시 얻기 위해 다음 덤프 미만 dayIndex

public String getOpenHoursString() { 
    MutableDateTime now = MutableDateTime.now(); 
    int dayIndex = now.getDayOfWeek() - 1; 
    if (hours != null && hours.length>dayIndex) { 
     OpeningHour bopHours = hours.get(dayIndex); 
     if (bopHours != null && bopHours.openTime != null && bopHours.closeTime != null) { 
      DateTimeZone timeZone = DateTimeZone.getDefault(); 
      DateTimeFormatter format = DateTimeFormat.forPattern("h:mm a"); 
      DateTimeFormatter parseFormat = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'").withZoneUTC(); 
      DateTime open = DateTime.parse(bopHours.openTime, parseFormat).toDateTime(timeZone); 
      DateTime close = DateTime.parse(bopHours.closeTime, parseFormat).toDateTime(timeZone); 
      if ((now.getHourOfDay() >= open.getHourOfDay()) && (now.getHourOfDay() < close.getHourOfDay())) { 
       return String.format("Open till - %s", format.print(close)).toLowerCase(); 
      } else { 
       return String.format("%s - %s", format.print(open), format.print(close)).toLowerCase(); 
      } 

     } 
    } 

    return ""; 
} 

이제 괜찮습니다

0

코드 시간에 어딘가 제대로 초기화되지 않은 것으로 보입니다.

내 돈은 에 있습니다. int dayIndex = now.getDayOfWeek() - 1; 아마 부정적인 값을 초래하고 여기에 약간의 카카를 만들면 OpeningHour bopHours = hours.get (dayIndex);

장소 약간의 브레이크 포인트는, 그 값을 확인 및/또는 내가 ArrayList를 hours의 크기가 있는지 여부를 확인하는 것을 잊었다 로그인 우리 ;-)