错误java.lang.ArrayIndexOutOfBoundsException:长度= 5;指数=5
Posted
技术标签:
【中文标题】错误java.lang.ArrayIndexOutOfBoundsException:长度= 5;指数=5【英文标题】:ERROR java.lang.ArrayIndexOutOfBoundsException: length=5; index=5 【发布时间】:2018-06-01 12:27:09 【问题描述】:我正在为我的大学(应用日历等)开发 android Studio 项目,其中一项功能是在日历的一天中触摸 (CalendarView
),显示布局对于添加事件,稍后将事件保存在SQLITE
中,(在另一个活动中显示事件列表的位置)问题是当我想删除一个事件时(java.lang.ArrayIndexOutOfBoundsException: length=5; index=5
)。
在 Viewevents eliminar(String dato
) 是有错误的代码,我该如何解决这个问题?谢谢。
查看事件:
public class ViewEventsActivity extends AppCompatActivity implements AdapterView.OnItemLongClickListener
//al mantener la wea apretada
private SQLiteDatabase db;
private ListView listView;
private ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_events);
listView=(ListView) findViewById(R.id.ltvListaEventos);
listView.setOnItemLongClickListener(this);
Bundle bundle= getIntent().getExtras();
int dia,mes,anio;
dia=mes=anio=0;
dia=bundle.getInt("dia");
mes=bundle.getInt("mes");
anio=bundle.getInt("anio");
String cadena= dia+" - "+ mes + " - "+ anio;
BDSQLite bd= new BDSQLite(getApplicationContext(), "eventos", null,1);
db= bd.getReadableDatabase();
String sql="select * from eventos where fechadesde='"+cadena+"'";
Cursor c;
String nombre,fechadesde,horadesde,fechahasta,horahasta,descripcion,ubicacion;
try
c=db.rawQuery(sql,null);
arrayAdapter= new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1);
if(c==null||c.getCount()==0)
Toast.makeText(getBaseContext(), "No hay eventos disponibles", Toast.LENGTH_LONG).show();
if(c.moveToFirst())
do
nombre=c.getString(1);
ubicacion=c.getString(2);
fechadesde=c.getString(3);
horadesde=c.getString(4);
fechahasta=c.getString(5);
horahasta=c.getString(6);
descripcion=c.getString(7);
arrayAdapter.add(nombre+", "+ubicacion+", "+fechadesde+", "+horadesde+", "+fechahasta+", "+horahasta+", "+descripcion);
while(c.moveToNext());
listView.setAdapter(arrayAdapter);
catch (Exception ex)
Toast.makeText(getApplication(), "Error: "+ex.getMessage(), Toast.LENGTH_SHORT).show();
this.finish();
private void eliminar(String dato)
String []datos= dato.split(", ");
String sql="delete from eventos where nombreEvento='"+datos[0]+"' and" +
" ubicacion='"+datos[1]+"' and fechadesde='"+datos[2]+"' and " +
"horadesde='"+datos[3]+"' and fechahasta='"+datos[4]+"' and horahasta='"+datos[5]+"' and descripcion='"+datos[6];
try
arrayAdapter.remove(dato); //eliminar del menú
listView.setAdapter(arrayAdapter);
db.execSQL(sql);
Toast.makeText(getApplication(),"Evento eliminado",Toast.LENGTH_SHORT).show();
catch (Exception ex)
Toast.makeText(getApplication(),"Error:"+ ex.getMessage(), Toast.LENGTH_SHORT).show();
@Override
public boolean onItemLongClick(final AdapterView<?> adapterView, View view, int i, long l)
AlertDialog.Builder builder= new AlertDialog.Builder(this);
CharSequence []items= new CharSequence[2];
items[0]="Eliminar Evento";
items[1]="Cancelar";
builder.setTitle("Eliminar evento")
.setItems(items, new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialog, int i)
if(i==0)
//eliminar evento
eliminar(adapterView.getItemAtPosition(i).toString());
);
AlertDialog dialog= builder.create();
dialog.show();
return false;
BDSQlite:
public class BDSQLite extends SQLiteOpenHelper
private String sql = "create table eventos(" +
"idEvento int identity,"+
"nombreEvento varchar(40)," +
"ubicacion varchar(60)," +
"fechadesde date,"+
"horadesde time,"+
"fechahasta date,"+
"horahasta time," +
"descripcion varchar(60))";
添加事件活动
public class AddActivity extends AppCompatActivity implements View.OnClickListener
private EditText nombreEvento, ubicacion, fechadesde, horadesde, fechahasta, horahasta;
private EditText descripcion;
private Button guardar, cancelar;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
nombreEvento = (EditText) findViewById(R.id.edtNombreEvento);
ubicacion = (EditText) findViewById(R.id.edtUbicacion);
fechadesde = (EditText) findViewById(R.id.edtFechaDesde);
fechahasta = (EditText) findViewById(R.id.edtFechaHasta);
horadesde = (EditText) findViewById(R.id.edtHorainicio);
horahasta = (EditText) findViewById(R.id.edtHoraHasta);
descripcion = (EditText) findViewById(R.id.edtDescripcion);
Bundle bundle = getIntent().getExtras();
int dia = 0, mes = 0, anio = 0;
dia=bundle.getInt("dia");
mes=bundle.getInt("mes");
anio=bundle.getInt("anio");
fechadesde.setText(dia + " - " + mes + " - " + anio);
fechahasta.setText(dia + " - " + mes + " - " + anio);
guardar = (Button) findViewById(R.id.btnguardar);
cancelar = (Button) findViewById(R.id.btncancelar);
guardar.setOnClickListener(this);
cancelar.setOnClickListener(this);
@Override
public void onClick(View v)
if (v.getId() == guardar.getId())
//guardar datos cajas de texto
BDSQLite bd = new BDSQLite(getApplication(), "eventos", null, 1);
SQLiteDatabase db = bd.getWritableDatabase();
String sql = "insert into eventos" +
"(nombreEvento, ubicacion, fechadesde, horadesde, fechahasta, horahasta," +
"descripcion) values('" +
nombreEvento.getText()+
"','"+ ubicacion.getText()+
"','" +fechadesde.getText()+
"','" + horadesde.getText()+
"','"+fechahasta.getText()+
"','"+horahasta.getText()+
"','"+descripcion.getText();
try
db.execSQL(sql);
nombreEvento.setText("");
ubicacion.setText("");
fechadesde.setText("");
fechahasta.setText("");
horadesde.setText("");
horahasta.setText("");
descripcion.setText("");
Toast.makeText(getBaseContext(), "Evento guardado", Toast.LENGTH_LONG).show();
catch (Exception e)
Toast.makeText(getApplication(),"Error"+e.getMessage(),Toast.LENGTH_SHORT).show();
else
this.finish();
return;
错误:
java.lang.ArrayIndexOutOfBoundsException: length=5; index=5
at com.example.niikoo.fondocelular.ViewEventsActivity.eliminar(ViewEventsActivity.java:87)
at com.example.niikoo.fondocelular.ViewEventsActivity.access$000(ViewEventsActivity.java:17)
at com.example.niikoo.fondocelular.ViewEventsActivity$1.onClick(ViewEventsActivity.java:116)
编辑:sql和datos结构的代码,我如何修复错误:(
【问题讨论】:
datos
的长度是多少
由于错误提示您尝试使用不存在的数组元素,即数组超出范围检查 dato[6] 是否存在
因为错误表明您的数组大小为 5.. 这意味着您只能从该数组中获取索引 0 到 4 的数据.. 任何高于该数组的内容都会抛出 ArrayOutofBoundsExcetion..
我认为是在sql中定义的,我不知道如何解决这个问题:/
我知道,但我不知道如何解决这个问题,代码包含有关如何创建方法的所有信息:(
【参考方案1】:
异常行(java.lang.ArrayIndexOutOfBoundsException: length=5; index=5)
清楚地提到您正在尝试获取index=5
,但dato
的长度是5
(length=5
)。
所以,只使用正确的索引,即索引0 to 4
。 或确保有足够的indexes
可供访问。
注意:您使用了dato.split(", ");
。试试dato.split(",");
。可能问题出在拆分器的模式上。
【讨论】:
在最后一次编辑中,我把结构放在了 ArrayAdapter.add 中,我把句子用“,”分隔,我如何修复错误:(,我只发布了所有代码 eliminar(String dato) ,有错误 如果我更改为 (","),这会出现在 AVD 中,PS:我如何看到 dato 中的文本? [1]:i.stack.imgur.com/8Crhc.jpg 我修复了 SQL 查询,但错误仍然出现 :(,我如何看到 datos 中的文本?? @NicolasOporto 你确定这里更新了相同的代码吗?因为有足够的typo机会 那么,我该怎么办?:(【参考方案2】:看起来您用逗号将String dato
拆分为数组的长度可能不是您认为的长度。错误显示数组中有 5 个项目,因此在这种情况下您可以访问的最大索引将是 datos[4]
,因为数组是从 0 开始的。
拆分后调试阵列:
String []datos= dato.split(", ");
【讨论】:
我不知道为什么是 5 个元素以及为什么存在错误,在最后一次编辑中我正确地输入了代码,如果你能告诉我如何解决这个问题:( 谢谢【参考方案3】:检查这个方法的输入,代码中没有。
eliminar(adapterView.getItemAtPosition(i).toString());
你得到的错误是因为你拆分String后得到的数组只有5个元素(4个逗号):
private void eliminar(String dato)
String []datos= dato.split(", ");
...
但是你尝试从该数组中获取第 6 个(索引 5)和第 7 个(索引 6)元素:
datos[5]+"' and descripcion='"+datos[6];
没有这样的元素,因此您会收到此ArrayIndexOutOfBoundsException
错误。
要解决此问题,请尝试查找 adapterView 的输入。
编辑:在这一行 2 个字符串似乎是空的:
arrayAdapter.add(nombre+", "+ubicacion+", "+fechadesde+", "+horadesde+", "+fechahasta+", "+horahasta+", "+descripcion);
因此,当你得到一个 ", , " 并用 split(", ") 分割它时,它不计算 "" 字符串并且你在结果数组中得到的项目更少,这会导致错误。
【讨论】:
输入在Viewevents arrayAdapter.add,请帮忙 我知道,我如何查看 datos 中的文本?或者查看未显示在数组中的元素?谢谢 只需调试应用程序,使用LogCat查看哪些项目是空的并跟踪它们以找到问题的根源。我把我能说的都告诉你了。以上是关于错误java.lang.ArrayIndexOutOfBoundsException:长度= 5;指数=5的主要内容,如果未能解决你的问题,请参考以下文章