错误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的主要内容,如果未能解决你的问题,请参考以下文章

Informix 错误:发生了语法错误。错误代码:-201

我收到一个错误:“MetaMask - RPC 错误:错误:错误:[ethjs-rpc] rpc 错误与有效负载”

错误精灵错误跟踪器错误

网页打开显示错误500是啥意思

PHP错误处理

PHP的错误处理