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

Многопоточность NullPointerException

10.04.2014, 19:53. Показов 1115. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кто-нибудь может подсказать, почему при k=2 и z=1 выбрасывается ошибка NullPointerException и как побороть данную проблему?

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
90
91
92
93
94
95
96
97
class Zain implements Runnable {
 
private int strings;
private Object[] objs; // массив объектов синхронизации
 
/**
*
* @param strings число строк вывода
* @param threads число потоков
*/
public Zain(int strings, int threads) {
this.strings = strings;
objs = new Object[threads + 1];
}
 
@Override
public void run() {
// цикл создания дочерних потоков.
// важно, что выход из цикла проверяется на длину - 1
// в последний элемент списка ляжет отдельный объект главной нити.
for (int i = 0; i < objs.length - 1; i++) {
final int index = i; // финальная переменная индекса нити для передачи в Runnable
Thread th = new Thread() {
@Override
public void run() {
 
objs[index] = new Object();
 
 
while(true) {
 
try {
synchronized (objs[index]) {
objs[index].wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
 
System.out.print(Thread.currentThread().getName()+" ");
 
 
 
synchronized (objs[index + 1]){
 
objs[index + 1].notify();
}
 
}
}
};
 
th.start(); 
}
 
 
objs[objs.length - 1] = new Object();
// цикл вывода строк.
for (int i = 0; i < strings; i++) {
 
synchronized (objs[0]) {
    
objs[0].notify();
}
synchronized (objs[objs.length - 1]){
 
try {
objs[objs.length - 1].wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
 
System.out.println();
}
}System.exit(0);
}
   }
public class Proekt4 
{
public static void main(String[] args) throws InterruptedException{
try{
    int k=(Integer.parseInt(args[0]));
    int z=(Integer.parseInt(args[1]));
    new Zain(k,z).run();
}
 
catch (NumberFormatException z)
{
System.out.println("Provertye argumenty");}
catch (ArrayIndexOutOfBoundsException z)
{System.out.println("Provertye argumenty");}
 
catch(NullPointerException z)
{System.out.println("Error with argument 2");
System.exit(1);}
}
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2014, 19:53
Ответы с готовыми решениями:

NullPointerException
Господа, здравствуйте. Хотел создать массив объектов, но при объявлении выходит ошибка NullPointerException. Место ошибки помечено...

NullPointerException
Доброго времени суток. После ограничение куска кода TryCatch-ем начало выкидывать NullPointerException. Я вроде бы все правильно делаю а...

NullPointerException
import java.util.Scanner; public class File { private String fileName; private String date; private int fileSize;...

9
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
10.04.2014, 20:16
mrtelohranitel, NPE вываливается так как вы пытаетесь захватить монитор на еще не созданном объекте objs[0] (строка 61).
Ваши потоки еще не успели стартануть и заполнить objs, а вы уже пытаетесь из него читать.

Обойти это можно разными способами.
Например можно создать барьер (CyclicBarrier), который будет пускать потоки в тех местах, в которых вы предполагаете.
Или просто заполнить ваш массив в главном потоке.

PS. У вас в коде еще довольно много ошибок. Например, при вызове notify вы никак не проверяете: действительно ли какой-то поток ждёт нашего notify.
0
237 / 236 / 72
Регистрация: 02.07.2013
Сообщений: 881
10.04.2014, 20:17
Цитата Сообщение от mrtelohranitel Посмотреть сообщение
почему при k=2 и z=1 выбрасывается ошибка NullPointerException
а при при k=1 и z=2 не выбрасывается?
0
11 / 7 / 11
Регистрация: 02.10.2012
Сообщений: 40
10.04.2014, 20:29  [ТС]
Wado-Ru, не вылетает

Добавлено через 1 минуту
turbanoff, к сожалению по заданию можно пользоваться только wait() и notify(). Поэтому никак и не проверяется, ждет ли кто-нибудь этот notify

Добавлено через 1 минуту
turbanoff, Не подскажете, как для этого кода заполнить массив в главном потоке?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
10.04.2014, 20:36
Цитата Сообщение от mrtelohranitel Посмотреть сообщение
Не подскажете, как для этого кода заполнить массив в главном потоке?
Сделать два цикла: один создает объекты, второй - стартует потоки.
Цитата Сообщение от mrtelohranitel Посмотреть сообщение
к сожалению по заданию можно пользоваться только wait() и notify()
В смысле, даже нельзя завести массив boolean переменных? Можно даже синхронизироваться на них, если использовать Boolean.
0
11 / 7 / 11
Регистрация: 02.10.2012
Сообщений: 40
10.04.2014, 20:40  [ТС]
turbanoff, нет нельзя, только synchronized, wait() и notify(), даже notifyAll нельзя
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
10.04.2014, 21:37
mrtelohranitel, ну что за глупости. Вы же используете Object? Как это так, его используете, когда можно только wait и notify?
0
11 / 7 / 11
Регистрация: 02.10.2012
Сообщений: 40
10.04.2014, 21:41  [ТС]
Изменил немного код, теперь просто зависает при k=2,z=1.
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
class Zain implements Runnable {
 
private int strings;
public Object[] objs; // массив объектов синхронизации
 
/**
*
* @param strings число строк вывода
* @param threads число потоков
*/
public Zain(int strings, int threads) {
this.strings = strings;
objs = new Object[threads + 1];
}
 
@Override
public void run() {
// цикл создания дочерних потоков.
// важно, что выход из цикла проверяется на длину - 1
// в последний элемент списка ляжет отдельный объект главной нити.
    for (int k=0;k<objs.length-1;k++)
    {final int indez = k;
    objs[indez] = new Object();
    }
for (int i = 0; i < objs.length - 1; i++) {
final int index = i; // финальная переменная индекса нити для передачи в Runnable
Thread th = new Thread() {
@Override
public void run() {
 
objs[index] = new Object();
 
 
while(true) {
 
try {
synchronized (objs[index]) {
objs[index].wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
 
System.out.print(Thread.currentThread().getName()+" ");
 
 
 
synchronized (objs[index + 1]){
 
objs[index + 1].notify();
}
 
}
}
};
 
th.start(); 
}
 
 
objs[objs.length - 1] = new Object();
 
// цикл вывода строк.
for (int i = 0; i < strings; i++) {
 
synchronized (objs[0]) {
    
objs[0].notify();
 
}
synchronized (objs[objs.length - 1]){
 
try {
objs[objs.length - 1].wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
 
System.out.println();
}
}System.exit(0);
}
   }
public class Proekt4 
{
public static void main(String[] args) throws InterruptedException{
try{
    int k=(Integer.parseInt(args[0]));
    int z=(Integer.parseInt(args[1]));
    new Zain(k,z).run();
}
 
catch (NumberFormatException z)
{
System.out.println("Provertye argumenty");}
catch (ArrayIndexOutOfBoundsException z)
{System.out.println("Provertye argumenty");}
 
catch(NullPointerException z)
{System.out.println("Error with argument 2");
System.exit(1);}
}
}
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
10.04.2014, 21:43
Цитата Сообщение от mrtelohranitel Посмотреть сообщение
теперь просто зависает
По той причине, которую я указал. Нельзя просто так потоку вызывать wait. Всегда необходимо какое-то условие.
0
11 / 7 / 11
Регистрация: 02.10.2012
Сообщений: 40
10.04.2014, 21:51  [ТС]
Object я использую, потому что не известно заранее сколько будет потоков и строк. А для синхронизации потоков можно только wait и notify. И почему, когда число потоков больше 2 то все работает нормально, а именно когда k=1 , то все зависает.

Добавлено через 1 минуту
Вы можете привести пример кода, который будет описывать ваши мысли или книжку про многопоточность, а то я пока совсем плохо ее понимаю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2014, 21:51
Помогаю со студенческими работами здесь

Ошибка NullPointerException
Приветствую,вот мой код import java.lang.*; import javax.swing.*; import java.io.*; import java.util.*; public class SumOfDigits...

Ошибка NullPointerException
import java.util.*; import java.io.*; public class P1 { public static Scanner sc = new Scanner(System.in); public static int n =...

Ошибка NullPointerException
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package eom_lab1; import...

Исключение NullPointerException
Вообщем нужно создать программу, реализующую иерархию классов на основе абстрактного класса. У меня есть класс SymbString (обычная строка),...

Ошибка NullPointerException
Программа для ввода данных о группе людей (фамилия, возраст). Во время выполнения вылазит ошибка NullPointerException. Подскажите...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru