首页 > 解决方案 > 应用程序不断给出错误,因为数组超出范围

问题描述

我正在制作一个记录笔记的 android 应用程序。当我尝试添加新注释时,它会给出一个数组超出范围的错误。我检查了我的代码,但我似乎无法弄清楚它为什么不起作用。我已经设置了 if 和 else 语句,它们在默认的负 1 索引值的情况下更改索引值。

主要活动代码

package com.example.notes;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

static ArrayList<String> notes = new ArrayList<String>();
static  ArrayAdapter arrayAdapter;

//MENU


@Override
public boolean onCreateOptionsMenu(Menu menu) {

     super.onCreateOptionsMenu(menu);
        MenuInflater menuInflater = this.getMenuInflater();
        menuInflater.inflate(R.menu.add_note,menu);


     return true;

}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
     super.onOptionsItemSelected(item);
     if(item.getItemId() == R.id.addNote){
         Intent intent = new Intent(getApplicationContext(),NoteEditor.class);
         startActivity(intent);
         return true;
     }
     else{
         return false;
     }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ListView listView = (ListView) findViewById(R.id.listView);
    notes.add("Example note");

     arrayAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,notes);
    listView.setAdapter(arrayAdapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Intent intent = new Intent(getApplicationContext(),NoteEditor.class);
            intent.putExtra("NoteId",i);
            startActivity(intent);
        }
    });

}
}

新活动代码

package com.example.notes;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

public class NoteEditor extends AppCompatActivity {

int noteId;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_note_editor);

    EditText editText = findViewById(R.id.editText);
    Intent intent = getIntent();
    noteId = intent.getIntExtra("NoteId",-1);

    if(noteId != 1)
    {
        editText.setText(MainActivity.notes.get(noteId));
    }
    else{
        MainActivity.notes.add("");
        noteId = MainActivity.notes.size() - 1 ;
    }

    editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            MainActivity.notes.set(noteId,String.valueOf(charSequence));
            MainActivity.arrayAdapter.notifyDataSetChanged();
        }

        @Override
        public void afterTextChanged(Editable editable) {

        }
    });
}
}

错误信息

2020-05-14 16:36:02.931 21411-21411/com.example.notes E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.notes, PID: 21411
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.notes/com.example.notes.NoteEditor}: java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
    at java.util.ArrayList.get(ArrayList.java:439)
    at com.example.notes.NoteEditor.onCreate(NoteEditor.java:25)
    at android.app.Activity.performCreate(Activity.java:7136)
    at android.app.Activity.performCreate(Activity.java:7127)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:6669) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 

标签: android

解决方案


您应该将条件更改为

if(noteId != -1){
    editText.setText(MainActivity.notes.get(noteId));
}

推荐阅读