Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Ошибки при работе с массивами


Автор: alafin 16.4.2007, 21:48
Помогите! Уже не знаю в чем дело. ошибка выдается сразу на первом setAddPolyg(0,0,0, 100,0,0, 0,50,0). 
Код

public class IdePanel extends JComponent{
    public IdePanel(){
        count = 0;
        
        pts = new Image[MAXCOUNT][3];
        setAddPolyg(0,0,0, 100,0,0, 0,50,0);
        setAddPolyg(100,50,0, 100,0,0, 0,50,0);

        setAddPolyg(0,0,30, 100,0,30, 0,50,30);
        setAddPolyg(100,50,30, 100,0,30, 0,50,30);

        setAddPolyg(0,0,30, 0,0,0, 0,50,30);
        setAddPolyg(0,50,0, 0,0,0, 0,50,30);

        setAddPolyg(100,0,30, 100,0,0, 100,50,30);
        setAddPolyg(100,50,0, 100,0,0, 100,50,30);

        setAddPolyg(0,50,0, 0,50,30, 100,50,0);
        setAddPolyg(100,50,30, 0,50,30, 100,50,0);

        setAddPolyg(0,60,0, 90,60,0, 0,110,0);
        setAddPolyg(90,110,0, 90,60,0, 0,110,0);

        setAddPolyg(0,60,30, 90,60,30, 0,110,30);
        setAddPolyg(90,110,30, 90,60,30, 0,110,30);

        setAddPolyg(0,60,30, 0,60,0, 0,110,30);
        setAddPolyg(0,110,0, 0,60,0, 0,110,30);

        setAddPolyg(90,60,30, 90,60,0, 90,110,30);
        setAddPolyg(90,110,0, 90,60,0, 90,110,30);

        setAddPolyg(0,60,0, 0,60,30, 90,60,0);
        setAddPolyg(90,60,30, 0,60,30, 90,60,0);        

    }
    public void paintComponent(Graphics g){
        super.paintComponents(g);
        Rectangle r =  g.getClipRect();
        Color last = g.getColor();
        g.setColor(Color.WHITE);
        g.fillRect(r.x,r.y,r.width,r.height);
        g.setColor(last);
        Graphics2D g2 = (Graphics2D)g;
    }
    
    public int setAddPolyg(double ax, double ay, double az, double bx, double by, double bz, double cx, double cy, double cz)
    {
        if (count < MAXCOUNT)
        {
            pts[count][0].x = ax;
            pts[count][0].y = ay;
            pts[count][0].z = az;
            pts[count][1].x = bx;
            pts[count][1].y = by;
            pts[count][1].z = bz;
            pts[count][2].x = cx;
            pts[count][2].y = cy;
            pts[count][2].z = cz;
            return ++count;
        }
        else 
            return 0;
    }

    public final int MAXCOUNT = 100; 
    public Image[][] pts;
}

public class Image{
    public Image(double x, double y, double z){
        this.x = x;
        this.y = y;
        this.z = z;
    }
    public double x;
    public double y;
    public double z;
}

Вылетает ошибка такого вида: Exception in thread "main" java.lang.NullPointerException



Автор: nornad 16.4.2007, 22:32
Ну, создал ты массив. А кто конкретный объект создавать за тебя будет?
Код

pts[count][0] = new Image(ax, ay, az);

Не понимаю, зачем тебе объект, если у него все поля наружу... Даже если он просто для хранения данных, всё равно лучше поля спрятать и сделать геттеры-сеттеры.

Добавлено через 44 секунды
В следующий раз перед тем как спросить, посмотри на код в дебаге, пожалуйста.  smile 

Автор: EvgenZ 11.6.2007, 20:47
Подскажите пожалуйста, мой вопрос из той же серии или не совсем? Почему вылетает эксепшн ?

Код

class Proverka
{
    private String mName;
    private int mID;
    
    public Proverka()
    {
        this("JJJ", 1);
    }
    
    public Proverka(String name, int id)
    {
        setMName(name);
        setMID(id);
    }


    public void setMName(String mName) {
        this.mName = mName;
    }

    public void setMID(int mID) {
        this.mID = mID;
    }
    

}


public class Main
{
    public static void main(String[] args)
    {
        Proverka p[] = new Proverka[5];
        
        for(int i = 0; i < p.length; i++)
        {
            p[i].setMName("Proverka"); // здесь
            p[i].setMID(i);                       // и здесь
        } 
    }
}


run:
Exception in thread "main" java.lang.NullPointerException
        at javaapplication1.Main.main(Main.java:46)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

Автор: Maksym 11.6.2007, 20:50
EvgenZ
Потому что нужно создать объект класса Proverka прежде чем к нему обращаться.
Код

    public static void main(String[] args)
    {
        Proverka p[] = new Proverka[5];
        
        for(int i = 0; i < p.length; i++)
        {
            p[i] = new Proverka();
            p[i].setMName("Proverka"); // здесь
            p[i].setMID(i);                       // и здесь
        } 
    }

Автор: EvgenZ 11.6.2007, 21:04
Maksym, ага, толкьо что опытным путем это определил, что в джаве нельзя просто выделить память...
добавляю это:
Код

p[i] = new Proverka("Proverka", i);
 - работает!

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

Т.е. получается, что везде, где я создаю массив не стандартного типа(не инт, даубл и т.д.), я обязан сначала выделить под массив место 

Код

Proverka p[] = new Proverka[5];
затем создать объект
Код

p[i] = new Proverka("Proverka", i);
 и только потом уже юзать свойства
Код

p[i].setMID(i);  

я правильно понимаю?

Автор: nornad 11.6.2007, 21:10
Это верно не только для массивов, но и вообще для объектов.
Проверь на этом:
Код

Long l1, l2;
l1 = new Long();
l1.parse("2");
l2.parse("22");

Автор: EvgenZ 11.6.2007, 22:10
То, что пока объект не создан, его не существует, это я понимаю.
Я думал, что 
Код

Proverka p[] = new Proverka[5];
 создает пять объектов класса Proverka  smile , а тут оказывается под него просто память выделяется.

З.Ы. спасибо за помощь! smile 

Автор: nornad 12.6.2007, 00:37
EvgenZ, если вопрос решён, отметь это при помощи ссылки над первым сообщением в теме.

Автор: EvgenZ 12.6.2007, 11:34
Тема не моя, я в чью-то старую вклинился, просто имхо проблема одна и та же smile . Так что не могу пометить решенной.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)