我正在遇到错误"无效索引90大小为90"如何解决此问题?
package com.example.micro;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
task_final();
}
// Button btn;
//btn = (Button) findViewById(R.id.button1);
//btn.setOnClickListener(new OnClickListener() {
//public void onClick(View v) {
// write on SD card file data in the text box
public void task_final()
{
ArrayList<String> al = new ArrayList<String>();
ArrayList<String> s1 = new ArrayList<String>();
String aDataRow = "";
StringTokenizer st = null;
String start=null;
String mid=null;
String end=null;
String sm_time,sn_time,mm_time,mn_time,em_time,en_time;
try {
File dir = Environment.getExternalStorageDirectory();
File file = new File(dir, "/Notes/task_name5.csv");
FileInputStream fIn = new FileInputStream(file);
BufferedReader myReader = new BufferedReader(new InputStreamReader(fIn));
FileWriter outFile = new FileWriter("/sdcard/Notes/delay.csv");
BufferedWriter outStream = new BufferedWriter(outFile);
//ArrayList<String> e1 = new ArrayList<String>();
while ((aDataRow = myReader.readLine()) != null) {
//aBuffer += aDataRow + "n";
st = new StringTokenizer(aDataRow,",");
while (st.hasMoreTokens()) {
al.add(st.nextToken());
}//while
}//while
int i=0,j;
do
{
start=al.get(i);
sm_time=al.get(i+1);
sn_time=al.get(i+2);
mid=al.get(i+3);
mm_time=al.get(i+4);
mn_time=al.get(i+5);
j=i+3;
while((start.equals(mid)))
{
j+=3;
mid=al.get(j);
}
end=al.get(j-3);
em_time=al.get(j-2);
en_time=al.get(j-1);
/* if(i!=(j-3)){
System.out.print(start);
System.out.print(" ");
System.out.print(sm_time);
System.out.print(" ");
System.out.print(sn_time);
System.out.print("n");
System.out.print(end);
System.out.print(" ");
System.out.print(em_time);
System.out.print(" ");
System.out.print(en_time);
System.out.print("n");
}*/
if(i!=(j-3))
{
s1.add(start);
s1.add(sm_time);
s1.add(sn_time);
s1.add(end);
s1.add(em_time);
s1.add(en_time);
}
i=j;
}while(i<al.size());
for (int k = 0; k < s1.size(); k+=3)
{
outStream.write(s1.get(k));
outStream.write(",");
outStream.write(s1.get(k+1));
outStream.write(",");
outStream.write(s1.get(k+2));
outStream.write("n");
}
outStream.close();
}
catch (Exception e)
{
Toast.makeText(getBaseContext(), e.getMessage(),
Toast.LENGTH_SHORT).show();
}
}
}
我认为您需要更改for for loop
for (int k = 0; k < s1.size(); k+=3)
进入
for (int k = 0; k < s1.size()-1; k+=3)
您也需要专注于这条线
do
{
start=al.get(i);
sm_time=al.get(i+1);
sn_time=al.get(i+2);
mid=al.get(i+3);
mm_time=al.get(i+4);
mn_time=al.get(i+5);
j=i+3;
while((start.equals(mid)))
{
j+=3;
mid=al.get(j);
}
end=al.get(j-3);
em_time=al.get(j-2);
en_time=al.get(j-1);
尝试这种方式
更改此行
for (int k = 0; k < s1.size(); k+=3)
for (int k = 0; k < s1.size()-3; k+=3)
除了其他人提到的k-loop外,i-loop也可能会出现:
do {
start=al.get(i);
sm_time=al.get(i+1);
sn_time=al.get(i+2);
mid=al.get(i+3);
mm_time=al.get(i+4);
mn_time=al.get(i+5);
...
} while (i < al.size());
java中的索引从0开始,带有90个元素的数组列表的索引从0到89。尝试索引元素90导致此错误。
您没有指定确切的位置,但我认为这是这个循环:
for (int k = 0; k < s1.size(); k+=3)
访问元素k
,k+1
和k+2
的位置,但有条件的循环仅检查到k
。将条件更改为
for (int k = 0; k + 2 < s1.size(); k+=3)
确保所有索引在每次迭代中都是有效的。
另一个循环也没有选中的数组元素访问。肯定也是一个错误,尽管类似的错误可能不会导致所有输入的例外。