Java 将多个字符串放入Arraylist

Java 将多个字符串放入Arraylist,java,android,arraylist,Java,Android,Arraylist,我正在尝试将字符串连同索引位置动态添加到ArrayList中,然后将ArrayList作为额外的in-Intent传递。该过程第一次运行良好,下次调用此活动时将导致索引越界异常。请参阅下面的代码,并建议这是否是代码中的缺陷 private ArrayList<String> imagesUriArray=new ArrayList<>(); static int imageIndex=-1; @Override protected void onActivityR

我正在尝试将字符串连同索引位置动态添加到ArrayList中,然后将ArrayList作为额外的in-Intent传递。该过程第一次运行良好,下次调用此活动时将导致索引越界异常。请参阅下面的代码,并建议这是否是代码中的缺陷

 private ArrayList<String> imagesUriArray=new ArrayList<>();
 static int imageIndex=-1;
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    // Some standard code goes here to capture the image and store it...
        image = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
        photo = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), image);
        selectedImage = Uri.fromFile(photo);
        final String UriString = new String(selectedImage.toString());
        imageIndex++;

 195:   imagesUriArray.add(imageIndex,UriString);
        Intent email = new Intent(ScanActivity.this, EmailActivity.class);
        email.putExtra("picture", imageInByte);
        email.putStringArrayListExtra("Uri", imagesUriArray);
        startActivity(email);


Logcat says:
    20320-20320/com.example.kittu.ClientLync E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.example.kittu.ClientLync/com.example.kittu.ClientLync.ScanActivity}: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
        at android.app.ActivityThread.deliverResults(ActivityThread.java:2536)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578)
        at android.app.ActivityThread.access$2000(ActivityThread.java:117)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:130)
        at android.app.ActivityThread.main(ActivityThread.java:3689)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:507)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
        at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
        at java.util.ArrayList.add(ArrayList.java:152)
        at com.example.kittu.ClientLync.ScanActivity.onActivityResult(ScanActivity.java:195)
        at android.app.Activity.dispatchActivityResult(Activity.java:3908)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578 
        at android.app.ActivityThread.access$2000(ActivityThread.java:117)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965)
private ArrayList imagesUriArray=new ArrayList();
静态int-imageIndex=-1;
@凌驾
ActivityResult上受保护的void(int请求代码、int结果代码、意图数据){
//这里有一些标准代码来捕获图像并存储它。。。
image=newsimpledateformat(“yyyy.MM.dd.HH.MM.ss”).format(new Date());
照片=新文件(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u PICTURES),图像);
选择edimage=Uri.fromFile(照片);
final String UriString=新字符串(selectedImage.toString());
imageIndex++;
195:imagesUriArray.add(imageIndex,UriString);
意向电子邮件=新意向(ScanActivity.this、EmailActivity.class);
电子邮件.putExtra(“图片”,imageInByte);
电子邮件:putStringArrayListExtra(“Uri”,imagesUriArray);
startActivity(电子邮件);
Logcat说:
20320-20320/com.example.kittu.ClientLync E/AndroidRuntime﹕ 致命异常:主
java.lang.RuntimeException:向活动{com.example.kittu.ClientLync/com.example.kittu.ClientLync.ScanActivity}传递结果ResultInfo{who=null,request=1,result=-1,data=Intent{act=inline data(has extras)}失败:无效索引1,大小为0
位于android.app.ActivityThread.deliverResults(ActivityThread.java:2536)
位于android.app.ActivityThread.handleSendResult(ActivityThread.java:2578)
在android.app.ActivityThread.access$2000(ActivityThread.java:117)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:965)
位于android.os.Handler.dispatchMessage(Handler.java:99)
位于android.os.Looper.loop(Looper.java:130)
位于android.app.ActivityThread.main(ActivityThread.java:3689)
位于java.lang.reflect.Method.Invokenactive(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:507)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:842)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
在dalvik.system.NativeStart.main(本机方法)
原因:java.lang.IndexOutOfBoundsException:索引1无效,大小为0
位于java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
在java.util.ArrayList.add(ArrayList.java:152)处
位于com.example.kittu.ClientLync.ScanActivity.onActivityResult(ScanActivity.java:195)
位于android.app.Activity.dispatchActivityResult(Activity.java:3908)
位于android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
在android.app.ActivityThread.handleSendResult(ActivityThread.java:2578
在android.app.ActivityThread.access$2000(ActivityThread.java:117)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:965)

您正在访问arraylist中的无效索引,例如,如果您的arraylist为空,并且您尝试在index=1中插入,它将向您抛出一个
IndexOutOfBoundsException
根据堆栈跟踪,您看到的是一个
IndexOutOfBoundsException
,而不是NPE

原因:java.lang.IndexOutOfBoundsException:索引1无效,大小为0

您之所以会看到这种情况,是因为您试图在允许的范围之外插入列表。允许的范围是列表长度的零(包括)。在这种情况下,您试图在索引1处添加元素,但列表中没有元素

从以下文件中:

公共无效添加(整数索引, 电子元件)

抛出:

IndexOutOfBoundsException-如果索引超出范围(索引<0 | |索引>大小())


尝试此操作,插入时访问的索引错误

 private ArrayList<String> imagesUriArray=new ArrayList<>();
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        imagesUriArray.add(imageIndex,UriString);
        Intent email = new Intent(ScanActivity.this, EmailActivity.class);
        email.putExtra("picture", imageInByte);
        email.putStringArrayListExtra("Uri", imagesUriArray);
        startActivity(email);
    }
private ArrayList imagesUriArray=new ArrayList();
@凌驾
ActivityResult上受保护的void(int请求代码、int结果代码、意图数据){
add(imageIndex,UriString);
意向电子邮件=新意向(ScanActivity.this、EmailActivity.class);
电子邮件.putExtra(“图片”,imageInByte);
电子邮件:putStringArrayListExtra(“Uri”,imagesUriArray);
startActivity(电子邮件);
}
阅读文档。
明确说明add(int,E)方法引发IndexOutOfBoundsException-如果索引超出范围(index<0 | | index>size())

这是因为您试图访问无效的索引。请查看日志控制台中它为您提供的

java.lang.IndexOutOfBoundsException: Invalid index 1, size is 0
这是因为您试图访问的索引1不存在。

private ArrayList imagesUriArray=new ArrayList();
private ArrayList<String> imagesUriArray=new ArrayList<>();
static int imageIndex=-1;
..
imageIndex++;
imagesUriArray.add(imageIndex,UriString);
静态int-imageIndex=-1; .. imageIndex++; add(imageIndex,UriString);
第一次调用ActivityResult时,
imageIndex
为-1,因此在递增它之后,您将向列表的第一个索引(0)添加一个项

但是,由于
imageIndex
是静态的,因此下次为不同的对象调用
onActivityResult
时,
imageIndex
即使列表为空也为0,因此您尝试向空列表的索引1添加一个元素,这会引发索引越界异常。如果将
imageIndex
更改为非静态ic,问题将得到解决


另一个避免出现异常的选项是将
imagesUriArray.add(imageIndex,UriString);
更改为
imagesUriArray.add(UriString);
。这将把元素添加到列表的下一个可用索引中。

我认为问题在于您正在使用

static int-imageIndex=-1;

那么首先提姆