2013-09-27 3 views
2

Назначение требует, чтобы пользователь вводил 3 радиуса и 3 записи высоты, которые я собираю в массиве, а затем определяю объем для каждого. Я застрял в массиве. По какой-то причине я получаю ArrayIndexOutOfBoundsException.Домашнее задание Java Array

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4 
(CylinderTest.java:19) 

Я получаю сообщение об ошибке на последнем (шестое или третье место). Я не понимаю, что я делаю неправильно. Мне трудно понять логику, это моя самая большая проблема.

Вот CylinderTest (основной)

import javax.swing.*; 

//Driver class 
public class CylinderTest 
{ 

    public static void main(String[] args) 
    { 

     Cylinder[] volume = new Cylinder[3]; 

     for (int counter = 0; counter < 6; counter++) 
     { 
      double radius = Double.parseDouble(JOptionPane 
        .showInputDialog("Enter the radius")); 
      double height = Double.parseDouble(JOptionPane 
        .showInputDialog("Enter the height")); 
      volume[counter++] = new Cylinder(radius, height); 
     } 

     String display = "Radius\tHeight\n"; 
     for (Cylinder i : volume) 
     { 
      if (i != null) 
       display += i.toString() + "\n"; 
     } 
     JOptionPane.showMessageDialog(null, display); 
    } 
} 

и здесь класс Cylinder

public class Cylinder 
{ 
    // variables 
    public static final double PI = 3.14159; 
    private double radius, height, volume; 

    // constructor 
    public Cylinder(double radius, double height) 
    { 
     this.radius = radius; 
     this.height = height; 
    } 

    // default constructor 
    public Cylinder() 
    {this(0, 0);} 

    // accessors and mutators (getters and setters) 
    public double getRadius() 
    {return radius;} 

    public void setRadius(double radius) 
    {this.radius = radius;} 

    public double getHeight() 
    {return height;} 

    public void setHeight(double height) 
    {this.height = height;} 

    public double getVolume() 
    {return volume;} 

    public void setVolume(double volume) 
    {this.volume = volume;} 

    // Volume method to compute the volume of the cylinder 
    public double volume() 
    {return PI * radius * radius * height;} 

    public String toString() 
    {return volume + "\t" + radius + "\t" + height; } 

} 
+2

Первоначально, если вы это сделаете: 'volume [counter ++]' Тогда вы будете перемещать счетчик дважды, один в том [counter ++] и другой в инструкции for '; counter ++) ' – porfiriopartida

+0

Для следующей справки по отладке' CylinderTest.java: 19' относится к классу ('CylinderTest.java') и номер строки в этом классе (' 19'), где происходит ошибка. Какая линия № 19 точно? – nhgrif

+0

Это была хорошая попытка задать вопрос о домашнем задании. Я думаю, что то, что предлагает nhgrif, отсутствует. В этом случае класс CylinderTest не имеет значения, поскольку проблема связана с массивом. Я не думаю, что он заслуживает понижения. – porfiriopartida

ответ

1

Ваш массив имеет размер 3, определяется этой линии:

Cylinder[] volume = new Cylinder[3]; 

Тогда вы начинаете от 0 до 5:

for (int counter = 0; counter < 6; counter++) 

И затем вы пытаетесь получить доступ к одному из этих показателей здесь:

volume[counter++] = new Cylinder(radius, height); 

Поскольку массив имеет длину 3, он имеет только индексы 0, 1 и 2. И все же вы пытаетесь индексы доступа выше два.

В качестве побочного примечания я предлагаю вам изменить инструкцию на volume[counter] = new Cylinder(radius, height);, иначе вы увеличиваете переменную for-loop counter дважды на каждой итерации.

Хорошая практика, когда цикл через индексы в массиве, чтобы использовать длину массива в состоянии:

for (int counter = 0; counter < volume.length; counter++) 

Это позволит убедиться, что это только перебирает индексы, которые существуют в массиве, независимо от того, насколько он велик или мал.

+0

спасибо. Теперь у меня есть массив из 6 и цикл for из трех. Кажется, это работает. И я думаю, маленькая лампочка продолжалась в моей голове относительно логики. благодаря! \t \t Цилиндр [] volume = new Цилиндр [6]; \t \t для (INT Счетчик = 0; счетчик <3; счетчик ++) \t \t { \t \t \t двойной радиус = Double.parseDouble (JOptionPane \t \t \t \t \t .showInputDialog ("Введите радиус")); \t \t \t двойной высоты = Double.parseDouble (JOptionPane \t \t \t \t \t .showInputDialog ("Введите высоту")); \t \t \t объем [счетчик] = новый цилиндр (радиус, высота); \t \t} – user2802785

+0

@ user2802785 Не забудьте также изменить условия для цикла, как я и предложил. 'for (int counter = 0; counter

+0

Вот что у меня есть сейчас: \t \t Цилиндр [] volume = new Cylinder [3]; \t \t для (INT Счетчик = 0; Счетчик user2802785

1

Вы объявляете массив цилиндров 3 размера, и вы пытаетесь прочитать 6 из них.

Cylinder[] volume = new Cylinder[3]; // 3 size array 

     for (int counter = 0; counter < 6; counter++) // loop 6 times 
     { 
      double radius = Double.parseDouble(JOptionPane 
        .showInputDialog("Enter the radius")); 
      double height = Double.parseDouble(JOptionPane 
        .showInputDialog("Enter the height")); 
      volume[counter++] = new Cylinder(radius, height); // read 0, 1, 2, 3, 4, 5... 
     } 

Это должно быть:

Cylinder[] volume = new Cylinder[3]; // 3 size array 

     for (int counter = 0; counter < volume.length; counter++) // loop 6 times 
     { 
      double radius = Double.parseDouble(JOptionPane 
        .showInputDialog("Enter the radius")); 
      double height = Double.parseDouble(JOptionPane 
        .showInputDialog("Enter the height")); 
      volume[counter] = new Cylinder(radius, height); 
     } 

Обратите внимание на volume.length вместо 6 и ++ удалены в объеме [счетчик ++]

+0

Ваш '// read 0, 1, 2, 3, 4, 5..' на самом деле a) запись/настройка, а не чтение. б). Индексы 0, 2, 4, потому что переменная счетчика увеличивается на каждой итерации дважды. –

+0

@ SimonAndréForsberg да, я имел в виду «пытаюсь» – porfiriopartida

+0

Спасибо. Я пробовал все предложения, и все работают. Использование volume.length - отличный совет! – user2802785

1

Прежде всего, ваш массив был объявлен с размером три. Но в вашем цикле for вы получаете доступ как минимум к 6 элементам массива. Таким образом, вы будете иметь увеличить размер вашего массива по крайней мере 6. И вы должны изменить код:

volume[counter++] = new Cylinder(radius, height); 

Для

volume[counter] = new Cylinder(radius, height); 
+0

Спасибо. это сработало. Я думал, что это 3 элемента массива с каждым элементом, имеющим два свойства:/ – user2802785

2

Ваш Cylinder массив имеет только три элемента. Cylinder[] volume = new Cylinder[3];

Ваш for loop пытается получить доступ к элементам после элемента 2 в этом массиве. Эти элементы не существуют.

-1

Уверены ли вы в этом?

Cylinder[] volume = new Cylinder[3]; 

    for (int counter = 0; counter < 6; counter++) 
    { 
     double radius = Double.parseDouble(JOptionPane 
       .showInputDialog("Enter the radius")); 
     double height = Double.parseDouble(JOptionPane 
       .showInputDialog("Enter the height")); 
     volume[counter++] = new Cylinder(radius, height); 
     //counter will count up to 5 (Array out of Bounds exception for sure..) 
     //also: why are you incrementing counter by yourself? 
    } 
+1

Это должно быть опубликовано как комментарий, а не ответ. –

+0

И на самом деле это не приведет к тому, что массив выходит за пределы, если у нас есть массив счетчика размера, поскольку счетчик будет увеличиваться ПОСЛЕ возврата последнего значения счетчика, поэтому, если бы у нас было 6 элементов в массиве, он бы вызвал массив в позиции 5 , переместите счетчик на 6 и выйдите из цикла. – porfiriopartida

+0

@porfiriopartida В коде в этом так называемом ответе 'volume.length' остается 3. –

Смежные вопросы