ArrayIndexOutOfBounds Исключение даже после обработки исключений Android - PullRequest
0 голосов
/ 30 апреля 2018

Итак, я заполняю вид сетки во фрагменте, и у меня есть счетчик, в котором перечислены параметры папки

This is the Gallery Fragment with the spinner

и всякий раз, когда я выбираю папку без файлов, приложение вылетает, выдавая исключение ArrayIndexOutOfBounds

FATAL EXCEPTION: main
                         Process: manika.aditya.ekayana, PID: 13405
                                                                   java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
                                                                       at java.util.ArrayList.get(ArrayList.java:411)
                                                                       at manika.aditya.ekayana.Share.GalleryFragment.setupGridView(GalleryFragment.java:170)
                                                                       at manika.aditya.ekayana.Share.GalleryFragment.access$300(GalleryFragment.java:37)
                                                                       at manika.aditya.ekayana.Share.GalleryFragment$3.onItemSelected(GalleryFragment.java:142)

это функция, которую я написал для заполнения GridView

и, как вы можете заметить, он генерирует исключение ArrayIndexOutOfBounds

private void setupGridView(String selectedDirectory) throws ArrayIndexOutOfBoundsException {
    Log.d(TAG, "setupGridView: directory chosen: " + selectedDirectory);
    final ArrayList<String> imgURLs = FileSearch.getFilePaths(selectedDirectory);

    //set the grid column width
    int gridWidth = getResources().getDisplayMetrics().widthPixels;
    int imageWidth = gridWidth/NUM_GRID_COLUMNS;
    gridView.setColumnWidth(imageWidth);

    //use the grid adapter to adapter the images to gridview
    GridImageAdapter adapter = new GridImageAdapter(getActivity(), R.layout.layout_grid_imageview, mAppend, imgURLs);
    gridView.setAdapter(adapter);

    //set the first image to be displayed when the activity fragment view is inflated

    try{

        setImage(imgURLs.get(0), galleryImage, mAppend);

    }

    catch (ArrayIndexOutOfBoundsException aioobe){}

    mSelectedImage = imgURLs.get(0);
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.d(TAG, "onItemClick: selected an image: " + imgURLs.get(position));

            setImage(imgURLs.get(position), galleryImage, mAppend);
            mSelectedImage = imgURLs.get(position);
        }
    });

}

даже вызов функции заключен в блок try и catch, который снова перехватывает исключение ArrayIndexOutOfBounds

try{

                setupGridView(directories.get(position));
            }

            catch (ArrayIndexOutOfBoundsException aioobe)  { }

        }

это метод поиска по каталогам / файлам, на всякий случай

directories = new ArrayList<>();

функция пути к файлу

 public static ArrayList<String> getFilePaths(String directory){
    ArrayList<String> pathArray = new ArrayList<>();
    File file = new File(directory);
    File[] listfiles = file.listFiles();
    for(int i = 0; i < listfiles.length; i++){
        if(listfiles[i].isFile()){
            pathArray.add(listfiles[i].getAbsolutePath());
        }
    }
    return pathArray;
}

}

и путь к файлу класса

public class FilePaths {

//"storage/emulated/0"
public String ROOT_DIR = Environment.getExternalStorageDirectory().getPath();

public String PICTURES = ROOT_DIR + "/Pictures";
public String CAMERA = ROOT_DIR + "/DCIM/camera";

public String FIREBASE_IMAGE_STORAGE = "photos/users/";

}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Перед получением индекса из imgURLS проверьте, что в imgURLS есть некоторые значения.

if(imgURLs.size()>0){              
    try{


                        setImage(imgURLs.get(0), galleryImage, mAppend);



                    mSelectedImage = imgURLs.get(0);
                    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                            Log.d(TAG, "onItemClick: selected an image: " + imgURLs.get(position));

                            setImage(imgURLs.get(position), galleryImage, mAppend);
                            mSelectedImage = imgURLs.get(position);
                        }
                    });

             catch (Exception EX){
            }
    }
else{
//No image url
}

}

0 голосов
/ 30 апреля 2018

Попробуйте изменить это

try{

    setImage(imgURLs.get(0), galleryImage, mAppend);

}

catch (ArrayIndexOutOfBoundsException aioobe){}

mSelectedImage = imgURLs.get(0);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Log.d(TAG, "onItemClick: selected an image: " + imgURLs.get(position));

        setImage(imgURLs.get(position), galleryImage, mAppend);
        mSelectedImage = imgURLs.get(position);
    }
});

в это

try{
    setImage(imgURLs.get(0), galleryImage, mAppend);
    mSelectedImage = imgURLs.get(0);
}
catch (ArrayIndexOutOfBoundsException aioobe){}

gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        try {
            Log.d(TAG, "onItemClick: selected an image: " + imgURLs.get(position));
            setImage(imgURLs.get(position), galleryImage, mAppend);
            mSelectedImage = imgURLs.get(position);
        } 
        catch (ArrayIndexOutOfBoundsException aioobe){}
    }
});
...