Проблема в инициализации множества объектов

Я столкнулся с исключением нулевого указателя, когда я пытался восстановить объект от нормального множества. Сначала я инициализирую множество с 10 Линия объекты и затем устанавливаю значения каждого объекта во множестве. Но когда я восстанавливаю ценности любых объектов, я нашел, что он был 0. Почему это происходит?

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class LineArrayLimt extends Applet
    implements MouseListener, MouseMotionListener {

    int width, height;
    int x, y, lineCounter;   //the coordinates of the upper-left corner of the box
    int mx, my; //the most recently recorded mouse coordinates
    int new_mx;
    int new_my;
    Thread th;
    boolean isMouseDragging = false, isStored;
    Line[] lines = new Line[10];

    class Line {

        Line() {
        }

        Line(int x1, int y1, int x2, int y2) {
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
        }
        private int x1, y1, x2, y2;

        public void setX1(int x) {
            this.x1 = x;
        }

        public void setY1(int y) {
            this.y1 = y;
        }

        public void setX2(int x) {
            this.x2 = x;
        }

        public void setY2(int y) {
            this.y2 = y;
        }

        public int getX1() {
            return x1;
        }

        public int getY1() {
            return y1;
        }

        public int getX2() {
            return x2;
        }

        public int getY2() {
            return y2;
        }
    }

    public void init() {
        width = getSize().width;
        height = getSize().height;
        setBackground(Color.black);
        addMouseListener(this);
        addMouseMotionListener(this);
        for (int i = 0; i < lines.length; i++) {
            lines[i] = new Line();
        }

    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mouseClicked(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
        System.out.println("-----------------Mouse Pressed------------------------");
        mx = e.getX();
        my = e.getY();



    }

    public void mouseReleased(MouseEvent e) {
        System.out.println("-----------------Mouse Released------------------------");
        if (isMouseDragging) {
            if (lineCounter != lines.length - 1) {
                lines[lineCounter].setX1(mx);
                lines[lineCounter].setY1(my);
                lines[lineCounter].setX2(new_mx);
                lines[lineCounter].setY2(new_my);
                lineCounter++;
                if (lines[lineCounter] != null) {
                    System.out.println("-----------------First Object------------------------" + lines[lineCounter].getX1() + " " + lines[lineCounter].getY1() + " " + lines[lineCounter].getX2() + " " + lines[lineCounter].getY1());
                }


            }

        }
        isMouseDragging = false;

    }

    public void mouseMoved(MouseEvent e) {
    }

    public void mouseDragged(MouseEvent e) {
        System.out.println("-----------------Mouse Dragged------------------------");
        isMouseDragging = true;
        new_mx = e.getX();
        new_my = e.getY();
        if (new_mx <= 35) {
            new_mx = 35;
        }
        if (new_mx > width - 40) {
            new_mx = width - 40;
        }
        if (new_my > height - 40) {
            new_my = height - 40;
        }
        if (new_my < 35) {
            new_my = 35;
        }
        repaint();

    }

    public void paint(Graphics g) {
        System.out.println("-----------------Line No." + lineCounter + " is inside paint------------------------");
        g.setColor(Color.RED);
        if (isMouseDragging) {
            System.out.println("-----------------Paint while dragging------------------------");
            g.drawLine(mx, my, new_mx, new_my);
            if (lineCounter != lines.length - 1) {
                //if(lines[lineCounter]!=null){
                g.drawLine(lines[lineCounter].getX1(), lines[lineCounter].getY1(), lines[lineCounter].getX2(), lines[lineCounter].getX2());
                System.out.println("*************" + lines[lineCounter].getX1() + lines[lineCounter].getY1() + lines[lineCounter].getX2() + lines[lineCounter].getX2());
                //}
            }
        }
    }
}
2
nl ja de
Вот некоторое понимание для вас, чтобы провести по NPE article1, article2
добавлено автор bonCodigo, источник
@goravine: Абсолютно нет. Вы должны почти никогда , ловят NullPointerException сознательно.
добавлено автор Jon Skeet, источник
It' s очень трудно, чтобы прочитать ваш код, потому что it' s так ужасно отформатированный. Пожалуйста, приложенный больше усилий к написанию вашего вопроса способом, который максимально легко прочитать. (I' m уверенный вы могли также значительно сократить пример.)
добавлено автор Jon Skeet, источник
попытайтесь использовать функцию trycatch в отмеченной линии
добавлено автор goravine, источник
Посмотрите stackoverflow.com/questions/1922677/… для "минимального тестового сценария" подобного поведения NPE (я использовал бы Список, как предложил Джон, как бы то ни было.)
добавлено автор user166390, источник

3 ответы

Проблема состоит в том, что в init вы инициализируете линии ко множеству 10 нулевых ссылок:

lines = new Line[10];

Тогда в краска вы используете ту нулевую ссылку:

if (lineCounter != lines.length - 1) {
    g.drawLine(lines[lineCounter].getX1(),
               lines[lineCounter].getY1(),
               lines[lineCounter].getX2(),
               lines[lineCounter].getY2());
}

lines.length will always be 10 - it isn't the number of non-null references in the array. It's not the number of lines you've added, or anything like that. (It's not clear what your if condition is trying to achieve, to be honest.)

You'd be better off using a List instead. Then in paint you could just use:

for (Line line : lines) {
    ...
}

... и в mouseReleased вы просто использовали бы:

lines.add(new Line(...));

Также обратите внимание, что нет никакой причины Линии , чтобы быть внутренним классом. Или сделайте его статическим вложенным классом, или верхний уровень (не вложил) класс.

2
добавлено
хорошо, но what' s проблема в инициализации множества с 10 элементами Линии типа в init методе, в mouseReleased я добавил элементы ко множеству итак, почему это все еще держится, АННУЛИРУЕТ? я редактирую код, я думаю, что проблема состоит в том, что краска получает доступ к нулевой ссылке только в первый раз начатый апплет, таким образом, я добавляю дополнительное условие нарисовать, чтобы получить доступ к элементам матрицы
добавлено автор Java Player, источник
Стрельба по тарелочкам @Jon поэтому, как инициализировать множество с 10 объектами линии вместо этих нулевых ссылок?
добавлено автор Java Player, источник
хорошо, я уже делаю это, но все объекты во множестве все еще содержат 0' s, я попробовал его прежде списком массива, и я хочу сделать это alos с нормальным множеством, чтобы заметить различие, пожалуйста, проверьте выше кода, я обновлю его через минуту
добавлено автор Java Player, источник
или явно инициализируйте его в петле. [линии [я] = новая строка ();] (я варьируюсь от 0 до 9),
добавлено автор TJ-, источник
о, мое плохое. Я didn' t читают вопрос, я просто обращался к использованию линий = новая строка [10];
добавлено автор TJ-, источник
@TJ-: Я can' t видят, как это работало бы полезно, как, прежде чем пользователь провел любые линии, просто есть not' t любой, который должен быть привлечен...
добавлено автор Jon Skeet, источник
@Eslam: В init() you' ре не инициализация множества с 10 Линия ссылки. You' ре, создающее множество, которое первоначально держится 10 пустой указатель ссылки. Вы могли создавать 10 Линия объекты, но вы don' t действительно хочу провести любые линии, таким образом, это wouldn' t имеют смысл делать так. Существенно я думаю, что необходимо пересмотреть поведение создания множества - но I' d также убедительно предполагают использовать список вместо этого так или иначе...
добавлено автор Jon Skeet, источник
@Eslam: You' d требование новая строка (...) и назначают стоимость на каждый элемент множества. Но поскольку я продолжаю говорить, вы shouldn' t делают это. I' m не уверенный, почему you' ре, не слушающее мой совет использовать Список <Линия> вместо этого, и только добавить линии, когда вы должны...
добавлено автор Jon Skeet, источник
@Eslam: Сделайте не , просто изменяют код в вашем вопросе, как иначе весь существующий ответ won' t имеют смысл. Но да, если вы создаете новый Линия объекты с 0 координатами, конечно they' ll содержат 0 координат. Что вы ожидали происходить? Это кажется, что необходимо предпринять шаги назад и разработать то, что вы на самом деле хотите, чтобы множество содержало.
добавлено автор Jon Skeet, источник

Проблема - вы, заполняют множество только в mouseReleased() функция и краска , метод не ждет мыши, чтобы выпустить. Таким образом, когда мышь не выпущена, краска() , метод пытается провести линию.

вы просто не комментируете свою проверку если (линии [lineCounter]! =null) и попытка, это должно работать.

Если вы хотите достигнуть чего-либо еще, сообщить нам

0
добавлено

Вы проверили, добавляется ли линия действительно ко множеству в mouseReleased ?

0
добавлено
это - действительно ответ?
добавлено автор vishal_aim, источник
То, что я имел в виду, - то, что, если по некоторым причинам условия всегда ложные в методе, чем элементы множества, останется пустым. Просто очень простая проверка работоспособности.
добавлено автор András Kerekes, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async