Anton Fahlgren
Anton Fahlgren

Reputation: 37

Constructor returns unexpected null

java beginner here!

I want an object Model that is a list of random coordinates, and according to (*) the ArrayList is not empty when the the main runs Model(200). But when I run main I get an out of bounds error when I test with the printout around (**) I get the error:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 

Is the problem with the constructor Model?

public class Model extends ArrayList<Particle>{ 
private ArrayList<Particle> particleList;

public Model(int N) {
    ArrayList<Particle> list1 = new ArrayList<Particle>();
    Particle newParticle = new Particle(); 
    for(int i=0;i<N;++i){
        list1.add(newParticle);
        newParticle = new Particle();
        //String s= String.valueOf(newParticle.x);
        //System.out.println(s);
        }
    this.particleList = list1;
    Particle p1 = particleList.get(5);
    double d = p1.x;
    String s = String.valueOf(d);
    System.out.println(s);                            (*)
}

public static void main(String[] args){
    Model x1 = new Model(200);
    Particle p1 = x1.get(0);                           (**)
    double d = p1.x;
    String s = String.valueOf(d);
    System.out.println(s);
}

Upvotes: 0

Views: 193

Answers (4)

Balaji Krishnan
Balaji Krishnan

Reputation: 1017

In this case, there is no need to extend ArrayList (no new functionality is being added). The below should work fine

public class Model {
    private List<Particle> particleList = null;

    public Model(int count) {
        particleList = new ArrayList<>(count);
        for (int i = 0; i < count; i++)
            particleList.add(new Particle());
    }

    public static void main(String[] args) {
        Model x1 = new Model(300);
        Particle p = x1. getParticleList().get(0);
        System.out.println(p.x);
       //using the new method - no need to extend ArrayList
        System.out.print(x1.get(3));

    }

    //rather than extending Arraylist, you can create a new method and use get(index) like this one:
    public Particle get(int index){
        return this.getParticleList().get(index);
    }

    public List<Particle> getParticleList() {
        return particleList;
    }

    public void setParticleList(List<Particle> particleList) {
        this.particleList = particleList;
    }

}

Upvotes: 0

Thomas Lehoux
Thomas Lehoux

Reputation: 1196

Your Model class is already an ArrayList. Your particleList field is useless.

Try this :

public class Model extends ArrayList<Particle>{ 


public Model(int N) {

    for(int i=0;i<N;++i)
        this.add(new Particle());

    Particle p1 = this.get(5);
    double d = p1.x;
    String s = String.valueOf(d);
    System.out.println(s);                            (*)
}

public static void main(String[] args){
    Model x1 = new Model(200);
    Particle p1 = x1.get(0);                           (**)
    double d = p1.x;
    String s = String.valueOf(d);
    System.out.println(s);
}

Upvotes: 1

David Ballester
David Ballester

Reputation: 577

You are mixing up the array that Model actually IS because of the fact that it extends from ArrayList, and an ArrayList that your Model CONTAINS.

If you want your Model to be an ArrayList, you don't need that particleList property. You could do this:

public class Model extends ArrayList<Particle> { 

  public Model(int N) {
      for (int i = 0; i < N; i++) {
          Particle newParticle = new Particle();
          this.add(newParticle);
      }
  }
}

public static void main(String[] args){
    Model x1 = new Model(200);
    Particle p1 = x1.get(0);                           (**)
    double d = p1.x;
    String s = String.valueOf(d);
    System.out.println(s);
}

Upvotes: 1

Shawn Xiong
Shawn Xiong

Reputation: 480

In the loop that creating a list of Particle, I think this will solve the problem:

list1.add(new Particle());

And remove the line that instantiate the Particle object outside of the loop.

Upvotes: 0

Related Questions