Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
4 / 4 / 1
Регистрация: 05.06.2011
Сообщений: 15

Массив создается, а потом NullPointerExc.

23.09.2011, 19:23. Показов 1104. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В методе createContentPane создаю объекты JButton в массив button_array, строки (21-25).
Затем вызываю из другого класса метод buttonActionListeners(ActionListener al); (31-37)
Все объекты оказываются null и соответственно выбрасывается NullPointerException.
Проводил опыты, вызывал из разных мест, отовсюду null, кроме метода где они создаются.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class CalcView 
{
    private JTextField input;
    private String[] button_name = {"+", "-", "*", "/"};
    private JButton[] button_array = new JButton[4];
    public CalcView()
    {
        SwingUtilities.invokeLater(new Runnable() {
 
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
    private JPanel createContentPane()
    {
        JPanel totalGUI = new JPanel();
        input = new JTextField("0.0", 10);
        JPanel actionButtonsPanel = new JPanel(new GridLayout(2, 2));
        for (int i = 0; i < button_name.length; i++) 
        {
            button_array[i] = new JButton(button_name[i]);
            actionButtonsPanel.add(button_array[i]);
        }
        totalGUI.add(input);
        totalGUI.add(actionButtonsPanel);
        totalGUI.setOpaque(true);
        return totalGUI;
    }
    public void buttonActionListeners(ActionListener al)
    {
        for (int i = 0; i < button_name.length; i++) 
        {
            button_array[i].setActionCommand(button_name[i]);
            button_array[i].addActionListener(al);
        }
    }
    public double getFieldText()
    {
        try 
        { return Double.parseDouble(input.getText()); }
        catch(NumberFormatException nfe)
        {
            System.out.println("Error");
            return -1;
        }
    }
    public void setFieldText(String message)
    {
        input.setText("" + message);
    }
    private void createAndShowGUI()
    {
        JFrame frame = new JFrame("Calculator");
        frame.setContentPane(createContentPane());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}
Почему ссылки в массиве перестают ссылаться на объекты?:cofee2:
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.09.2011, 19:23
Ответы с готовыми решениями:

Написать программу, в которой создается двухмерный массив, значения вводятся с клавиатуры,потом значения умножаются по строкам - access violation
Здравствуйте. Задание написать программу в которой создается 2-х мерный массив (размер вводится с клавиатуры),значения так же вводяться с...

Отсортировать массив — сначала отрицательные, потом нулевые, потом положительные
решить до завтра с объяснением всех букв) 1)отсортировать массив - сначала отрицательные, потом нулевые, потом положительные. ...

Сформировать массив, в котором идут сначала негативные элементы, потом нули, потом позитивные
Необходимо создать программу на Python: Дано массив, сформировать новый массив, в котором идут сначала негативные элементы, потом нули,...

4
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
23.09.2011, 22:14
Чёйто тут какая то неразбериха. Сначала попробовал вывести массив объектов из массива кнопок в методе, где они создаются, сначала вываливается ошибка, потом выводятся кнопки. Ради интереса затормозил вызов метода buttonActionListeners на 100ms - эффекта не было, затем на 500 - ошибка пропала.
Код:



Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package newpackage;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
 
public class CalcView {
 
    private JTextField input;
    private String[] button_name = {"+", "-", "*", "/"};
    private JButton[] button_array = new JButton[4];
 
    public CalcView() {
        SwingUtilities.invokeLater(new Runnable() {
 
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
 
    private JPanel createContentPane() {
        JPanel totalGUI = new JPanel();
        input = new JTextField("0.0", 10);
        JPanel actionButtonsPanel = new JPanel(new GridLayout(2, 2));
        for (int i = 0; i < button_name.length; i++) {
            button_array[i] = new JButton(button_name[i]);
            actionButtonsPanel.add(button_array[i]);
        }
        totalGUI.add(input);
        totalGUI.add(actionButtonsPanel);
        totalGUI.setOpaque(true);
        return totalGUI;
    }
 
    public void buttonActionListeners(ActionListener al) {
        for (int i = 0; i < button_name.length; i++) {
            button_array[i].setActionCommand(button_name[i]);
            button_array[i].addActionListener(al);
        }
    }
 
    public double getFieldText() {
        try {
            return Double.parseDouble(input.getText());
        } catch (NumberFormatException nfe) {
            System.out.println("Error");
            return -1;
        }
    }
 
    public void setFieldText(String message) {
        input.setText("" + message);
    }
 
    private void createAndShowGUI() {
        JFrame frame = new JFrame("Calculator");
        frame.setContentPane(createContentPane());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
 
    public static void main(String[] args) {
        new A().start();
    }
}
 
class A extends Thread {
 
    public void run() {
        CalcView c = new CalcView();
        try {
            sleep(500);
        } catch (Exception e) {
        }
        c.buttonActionListeners(new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                throw new UnsupportedOperationException("Not supported yet.");
            }
        });
    }
}
Не нравится мне invokeLater, какой то он подозрительный
1
4 / 4 / 1
Регистрация: 05.06.2011
Сообщений: 15
23.09.2011, 23:45  [ТС]
И правда :dance3:, я просто перед вызовом buttonActionListeners поставил цикл на 1 млрд. итераций и вся програмулинка циликом заработала как надо. Спасибо _Viper_, но это явно не выход, invokeLater нужен, что бы все было thread safe. Может кто еще знает, что к чему и почему, а я пошел RTFM'ить, вдруг найду что.

Добавлено через 20 минут
Угу. Все также работает если убрать invokeLater вообще.
Значить финальный вопрос, про многопоточность, как заставить это все выполняться в нужном порядке?

Добавлено через 33 минуты
Ага ну вот и ответ
An initial thread schedules the GUI creation task by invoking javax.swing.SwingUtilities.invokeLater or javax.swing.SwingUtilities.invokeAndWait . Both of these methods take a single argument: the Runnable that defines the new task. Their only difference is indicated by their names: invokeLater simply schedules the task and returns; invokeAndWait waits for the task to finish before returning.
и вот
In any other kind of program, scheduling the GUI-creation task is usually the last thing the initial thread does, so it doesn't matter whether it uses invokeLater or invokeAndWait.
Хотя мне просто invokeAndWait помогла.
0
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
24.09.2011, 20:23
invokeAndWait - вызвать и поспать, прям как моя жена, ну конечно, по другому то никак )))
0
4 / 4 / 1
Регистрация: 05.06.2011
Сообщений: 15
24.09.2011, 20:29  [ТС]
А как по другому, будет ли по другому thread-safe? Я про многопоточность только сейчас начал читать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2011, 20:29
Помогаю со студенческими работами здесь

Во второй массив сначала переписать сначала положительные, потом 0, потом отрицательные
Не могу решить задачу, прямо застрял на ней. Помогите, пожалуйста. Нужно: заполнить массив из 10 элементов положительными и...

Массив: Поместить информацию о 6-ти людях в массив, а потом вывести ее на экран
Привет, помогите пожалуйста. Не могу понять все как ввод и вывод сделать (и что именно использовать char or string) В общем, нужно...

Записать массив строк в файл, а потом получить такой же массив из этого файла
Есть вот такой массив, который формируется из разных чтрок: string temp = {dateTimePicker1.Value.ToString(), gender, label6.Text}; ...

Вывести массив A, затем массив B, потом максимальные элементы массивов поменять местами
с помощью подпрограммы вывести массив A ,затем массив B, потом максимальные элементы массивов поменять местами. должно быть 3...

Нужно записать массив в файл, а потом из этого файла считать этот же массив
Помогите, пожалуйста, никогда с файлами делов не имела. Нужно записать массив в файл, а потом из этого файла считать этот же массив. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru