Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по инициализации полей / 15 сообщений из 15, страница 1 из 1
06.07.2016, 10:23
    #39268544
archelite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
Добрый день всем.

Подскажите пожалуйста в чем проблема. Есть такой код.

Главный класс
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public static void main(String[] args) {
        
        Calculations c = new Calculations();
        c.setMinefield(10, 10);
        c.setMines(10, 5);
        
        GUI g = new GUI();
        g.setGUI(10, 10, 10, 200, 300);
    }



Часть класса, производящего вычисления
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class Calculations {
    
    int [][] mineField;
    
    public int [][] getMineField(){
          return mineField;
    }
    
    public void setMinefield (int rows, int columns){
       mineField = new int[rows][columns];
    }
}



Часть класса отвечающего за интерфейс
Код: java
1.
2.
3.
 for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                blocks[i][j] = new JButton(""+calculations.mineField[i][j]); //проблема здесь



Проблема в том что возникает NullPointer в указанной строке хотя инициализация явно происходит до обращения к массиву. Раньше обращение было в конструкторе, я думал что проблема была в том что конструктор инициализируется раньше чем вызывается метод в main'e вынес цикл в отдельный метод, но ошибка все равно осталась. Если инициализировать массив внутри метода интерфейса, то всё ок. Все используемые классы и методы паблик и находятся в одном пакете.
...
Рейтинг: 0 / 0
06.07.2016, 11:06
    #39268583
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
archeliteПроблема в том что возникает NullPointer в указанной строке хотя инициализация явно происходит до обращения к массиву.

Проблема в том что вы не используете отладчик, чтобы посмотреть какия из трех ссылок null и по шагам пройти весь процесс инициализации.

archeliteРаньше обращение было в конструкторе, я думал что проблема была в том что конструктор инициализируется раньше чем вызывается метод в main'e вынес цикл в отдельный метод, но ошибка все равно осталась.

Вы не "думали", а "предполагали". Метод научного тыка, проб и ошибок.

archeliteЕсли инициализировать массив внутри метода интерфейса, то всё ок.
Не то вы называете "интерфейсом".

archeliteВсе используемые классы и методы паблик и находятся в одном пакете.
Это не имеет никакого значения.
...
Рейтинг: 0 / 0
06.07.2016, 11:52
    #39268647
Valery Shiskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
archelite,

Ну создали Вы локальную для метода main переменную с . Инициализировали поля. А дальше? Какой класс или объект знает об этой переменной с ? Откуда взялась переменная calculations,
...
Рейтинг: 0 / 0
06.07.2016, 12:46
    #39268722
archelite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
BlazkowiczarcheliteПроблема в том что возникает NullPointer в указанной строке хотя инициализация явно происходит до обращения к массиву.

Проблема в том что вы не используете отладчик, чтобы посмотреть какия из трех ссылок null и по шагам пройти весь процесс инициализации.

archeliteРаньше обращение было в конструкторе, я думал что проблема была в том что конструктор инициализируется раньше чем вызывается метод в main'e вынес цикл в отдельный метод, но ошибка все равно осталась.

Вы не "думали", а "предполагали". Метод научного тыка, проб и ошибок.

archeliteЕсли инициализировать массив внутри метода интерфейса, то всё ок.
Не то вы называете "интерфейсом".

archeliteВсе используемые классы и методы паблик и находятся в одном пакете.
Это не имеет никакого значения.

Подскажите пожалуйста есть где - нибудь инструкция для чайников по отладчикам основных IDE(Net Beans, IDEA, Eclipse)?
Проблему нашел, я просто в классе интерфейса создал другую ссылку, а нужно было обращаться к той же самой, но тогда возникает необходимость делать её статической, это не есть хорошо.

Как в нормальных приложениях организуется доступ к полям между классами? Геттеры и сеттеры? А еще есть способы?
...
Рейтинг: 0 / 0
06.07.2016, 12:49
    #39268726
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
archeliteнибудь инструкция для чайников по отладчикам основных IDE(Net Beans, IDEA, Eclipse)?
- определяемся в одной IDE а не всех сразу
- делаем проект
- задаём конкретный вопрос: "Как поставить точку останова..."
...
Рейтинг: 0 / 0
06.07.2016, 12:50
    #39268728
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
archeliteА еще есть способы?
"Слона будем есть по частям" - любимая поговорка программистов.
...
Рейтинг: 0 / 0
06.07.2016, 13:09
    #39268756
archelite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
Среда NetBeans, точки останова ставить умею, пошагово идти тоже, нужно идти так чтобы он не лез в кишки(в реализацию классов)
...
Рейтинг: 0 / 0
06.07.2016, 13:11
    #39268759
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
archeliteПодскажите пожалуйста есть где - нибудь инструкция для чайников по отладчикам основных IDE(Net Beans, IDEA, Eclipse)?
Проблему нашел, я просто в классе интерфейса создал другую ссылку, а нужно было обращаться к той же самой, но тогда возникает необходимость делать её статической, это не есть хорошо.

Как в нормальных приложениях организуется доступ к полям между классами? Геттеры и сеттеры? А еще есть способы?

У вас два основных пробела в понимании
1) Отладка - можно найти на ютубе для любой среды
2) Java ООП - вы не понимаете ссылок, объектов и тому подобного, отсюда и ошибка. Тут можно почитать или официальный учебник или любой другой доступный для вас.

Не нужно называть "интерфейсом" ваш GUI класс. Интерфейс это то что объявлено с ключеным словом interface.
А GUI это "графически интерфейс" либо "пользовательский интерфей"

Ну, и если вы не моежете отличить ссылку, от объекта, то это первое чему стоит уделит внимание. Есть переменная. Она ссылается на объект. Либо не ссылается, и тогда ее значение null. А про "ссылки" и "указатели" лучше пока не вспоминать, это не C++
...
Рейтинг: 0 / 0
06.07.2016, 13:12
    #39268762
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
archeliteСреда NetBeans, точки останова ставить умею, пошагово идти тоже, нужно идти так чтобы он не лез в кишки(в реализацию классов)
https://www.google.com?q=NetBeans debug step into
...
Рейтинг: 0 / 0
06.07.2016, 13:21
    #39268773
archelite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
вроде разобрался немного

есть еще гавнокод)
https://github.com/Archelite/minesweeper/blob/master/StartGame.java
https://github.com/Archelite/minesweeper/blob/master/Interface.java
https://github.com/Archelite/minesweeper/blob/master/Calculations.java
https://github.com/Archelite/minesweeper/blob/master/Timer.java

Это вроде как сапер на Java, он даже работает только очень корявый получился, сделан на основе чьих - то исходников

Задача в том чтобы сделать код более правильным и читаемым, более расширяемым и универсальным.

Готов выслушать ваши предложения)
...
Рейтинг: 0 / 0
06.07.2016, 13:23
    #39268781
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
archelite https://github.com/Archelite/minesweeper/blob/master/Interface.java

Хм. Это же ключевое слово. Не знал что можно так класс назвать.

archeliteЗадача в том чтобы сделать код более правильным и читаемым, более расширяемым и универсальным.

Code Review по-нашему.
...
Рейтинг: 0 / 0
06.07.2016, 13:34
    #39268797
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
archelite,

public JButton[][] blocks; это плохой подход, в принципе, для игр. Swing для них не предназначен. Намного быстре с точки зрения производительности и будущих изменений, самостоятельно отрисовавать канвас на Java2D, а еще лучше JavaFX

Много не понятных идентификаторов либо слишком общих. Не экономьте на длине имен переменных.

Методы лучше называть глаголами.

Реализация таймера ошибочна. Про метод Thread.sleep() стоит забыть вообще.

Вот это за гранью добра и зла.
Код: java
1.
2.
3.
4.
        for (int i = 0; i < fieldRows; i++) {
            OUTER:
            for (int j = 0; j < fieldColumns; j++) {
                if (e.getSource() == INTERFACE.blocks[i][j]) {


Когда вам нужно поговорить с кем-то, вы берете список жителей вашего населенного пункта, и обходите всех по очереди, спрашивая, а не тот ли он человек, которого вы ищете. Вместо того чтобы взять его номер телефона и позвонить.
...
Рейтинг: 0 / 0
06.07.2016, 13:56
    #39268840
archelite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
авторХм. Это же ключевое слово.

Ключевое с маленькой буквы

авторотрисовавать канвас на Java2D, а еще лучше JavaFX

Судя по описанию классная штука, перепишу)

авторРеализация таймера ошибочна. Про метод Thread.sleep() стоит забыть вообще.

Почему? он же не Deprecated, как сделать по другому?

авторВот это за гранью добра и зла.

Да, лучше как-то сделать некий ID для каждой кнопки и по нему обращаться, а не каждый раз делать обход всего поля при каждом событии, но сани как говорится не мои) Сейчас думал над тем как запихнуть ID к Swing'овской кнопке, но по видимому от Swing'a вообще придется отказаться)
...
Рейтинг: 0 / 0
06.07.2016, 14:07
    #39268855
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
archeliteПочему? он же не Deprecated, как сделать по другому?

Он делает то что он должен делать. Но вам эта функциональность нигде не нужна.
В вашем случае, например, фактически каждый тик занимает больше секунды. По-моему даже намного больше.
На много лучше в вашем случае было бы взять javax.swing.Timer
Альтернативы ему java.util.Timer и ScheduledExecutorService. Но нужно самому синхронизировать с EDT, как вы это уже делаете.
А еще они могут не синхронизироваться с локальными часами и какой нибудь sleep mode может сломать их нафиг.

Так что вопрос, в целом, не так прост как кажется. Даже в оригинальном майнкрафте долгое время были баги с таймером.


archeliteДа, лучше как-то сделать некий ID для каждой кнопки и по нему обращаться, а не каждый раз делать обход всего поля при каждом событии, но сани как говорится не мои) Сейчас думал над тем как запихнуть ID к Swing'овской кнопке, но по видимому от Swing'a вообще придется отказаться)

MouseEvent.getComponent() ссылку на нужную кнопку не возвращает? Обычно, в UI сообытиях есть что-то вроде source - ссылка на контрол, от которого оно пришло.
...
Рейтинг: 0 / 0
06.07.2016, 14:59
    #39268950
archelite
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по инициализации полей
таймеры посмотрю

авторMouseEvent.getComponent() ссылку на нужную кнопку не возвращает? Обычно, в UI сообытиях есть что-то вроде source - ссылка на контрол, от которого оно пришло.

возвращает компонент, который можно привести к нужному виду, посижу разберусь, сейчас внезапно озадачили, вечером загляну еще
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по инициализации полей / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]