entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Excepción: java.lang.IndexOutOfBoundsException: Index: 1, Size: 0

Llevo rato trasteando y tratando de arreglarlo pero no hay manera. La excepción que salta es

java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
package phonemanagergui.views;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import phonemanagergui.controllers.MainController;
import phonemanagergui.model.Contact;

public class RemoveView extends JPanel implements ActionListener{

List<Contact> myContacts = new ArrayList<Contact>();
MainController controller;
JTextField phoneText, nameText, surnameText;
Contact contact;
boolean remove;
int position;

public RemoveView(MainController controller){
    this.controller = controller;
    this.myContacts = this.controller.getAllContacts();
    contact = new Contact();
    remove = false;
    position = 0;
    initComponents();
}

private void initComponents(){
    this.setLayout(new GridLayout(5,2));

    JLabel phone = new JLabel("Teléfono");
    this.add(phone);
    if(myContacts!=null)phoneText=new JTextField(myContacts.get(0).getPhone());
    else phoneText=new JTextField();
    phoneText.setEditable(false);
    this.add(phoneText);

    JLabel name = new JLabel("Nombre");
    this.add(name);
    if(myContacts!=null) nameText=new JTextField(myContacts.get(0).getName());
    else nameText=new JTextField();
    nameText.setEditable(false);
    this.add(nameText);

    JLabel surname = new JLabel("Apellido");
    this.add(surname);
    if(myContacts!=null) surnameText=new JTextField(myContacts.get(0).getSurname());
    else surnameText=new JTextField();
    surnameText.setEditable(false);
    this.add(surnameText);

    JButton nextButton = new JButton("Siguiente");
    nextButton.addActionListener(this);
    nextButton.setActionCommand("next");
    this.add(nextButton);

    JButton previousButton = new JButton("Anterior");
    previousButton.addActionListener(this);
    previousButton.setActionCommand("previous");
    this.add(previousButton);

    JButton removeButton = new JButton("Borrar");
    removeButton.addActionListener(this);
    removeButton.setActionCommand("delete");
    this.add(removeButton);

}

public void actionPerformed(ActionEvent e){
    switch(e.getActionCommand()){
        case "next":
            if(myContacts!=null) remove=true;
            else remove=false;
            if(remove){
            if(position<myContacts.size()-1)position++;
            contact = myContacts.get(position);
            phoneText.setText(contact.getPhone());
            nameText.setText(contact.getName());
            surnameText.setText(contact.getSurname());}
            else {
                controlEmptyList();
            }
            break;
        case "previous":
            if(myContacts!=null) remove=true;
            else remove=false;
            if(remove){
            if(position>0)position--;
            contact = myContacts.get(position);
            phoneText.setText(contact.getPhone());
            nameText.setText(contact.getName());
            surnameText.setText(contact.getSurname());}
            else {
                controlEmptyList();
            }
            break;
        case "delete":
            if(myContacts!=null) remove=true;
            else remove=false;
            if(remove)
            {
                controller.deleteContact(position);
                myContacts.remove(myContacts.get(position));
                if(position>0)position--;
                else position++;
                if(myContacts.size()==1 && position>0){
                    position=0;
                    contact = myContacts.get(position);
                    phoneText.setText(contact.getPhone());
                    nameText.setText(contact.getName());
                    surnameText.setText(contact.getSurname());
                }
                else{
                    if(/*myContacts.size()>0*/myContacts!=null){
                    contact = myContacts.get(position);
                    phoneText.setText(contact.getPhone());
                    nameText.setText(contact.getName());
                    surnameText.setText(contact.getSurname());}
                }
            }
            else {
                controlEmptyList();
            }
            break;
        default:
            break;
    }
}

private void controlEmptyList(){
    JOptionPane.showMessageDialog(null, "No hay contactos");
    phoneText.setText("");
    nameText.setText("");
    surnameText.setText("");
}

}

Ese es el código.

Supuestamente falla aquí:

                    else{
                        if(/*myContacts.size()>0*/myContacts!=null){
   ===>                 contact = myContacts.get(position);
                        phoneText.setText(contact.getPhone());
                        nameText.setText(contact.getName());
                        surnameText.setText(contact.getSurname());}
                    }

Si dejaba

myContacts.size()>0

me saltaba un NullPointerException.

Gracias de antemano. Saludos.

2 Respuestas

2votos

Javi2EE Puntos6570

Lo primero que se comprueba es el valor null,

if(myContacts != null && !myContacts.isEmpty())

Esto se debe a que la conjunción se evalúa en cortocircuito que quiere decir que si el valor de la primera expresión de una conjunción (&&) es false no se comprueba el resto de la misma, así solo se invoca isEmpty() (o lo que es lo mismo size()>0) cuando myContacts != null.

TheHomicide comentado May 5, 2016

Gracias! Llevaba un rato y no caía, y era tan simple como eso, jeje. Creía que lo tendria mal planteado.

1voto

bl4z3r Puntos16360

¿Verificaste que el siguiente método de devuelva los datos?
this.controller.getAllContacts();

Si te lanza NullPointerException llamando a size(), es por que no esta instanciado o asignado el miembro correspondiente.

Si te lanza IndexOutOfBoundsException con los siguientes datos Index: 1, Size: 0 es por que el arreglo no contiene nada y estas tratando de obtener el primer elemento de este mismo.

TheHomicide comentado May 5, 2016

¿Verificaste que el siguiente método de devuelva los datos?
this.controller.getAllContacts();

Si, lo he verificado; funciona correctamente ese método.

Si te lanza IndexOutOfBoundsException con los siguientes datos Index: 1, Size: 0 es por que el arreglo no contiene nada y estas tratando de obtener el primer elemento de este mismo.

Si, eso lo sé. Pero no sé qué hacer.

bl4z3r comentado May 5, 2016

@TheHomicide entonces, no tiene sentido lo que planteas. Necesitaría mas información al respecto.

TheHomicide comentado May 5, 2016

Cierto, disculpa. Estoy haciendo una interfaz con java swing que gestione una lista de contactos. Lista, añade, modifica y borra contactos. Las funcionalidades de listar añadir y modificar me van bien. Me falla el de borrar. Se muestra en un gridlayout telefono y su textfield, nombre y su textfield y apellido y su textfield, además de los botones siguiente, anterior, y borrar. Con el botón de siguiente pasa al siguiente elemento de la lista, y anterior pues al anterior. El problema esta en que me salta esa excepción cuando borro el último elemento creo que era. Espero haber sido claro. Si hay dudas las responderé, gracias.

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Actividad Reciente

¿Eres Usuario Apple?

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta