Java | Вопросы с ответами
2. Дан код:
public class Quest4 public static void main(String[] args) byte b[] = new byte[80];
for (int i=0; i System.out.print(“Ok”);
>
>
Результатом компиляции запуска будет?
>> ошибка компиляции, так как метод read() может порождать исключительную ситуацию типа IOException.
3. Программы Java категория Приложение (application)?
>> аналог “обычной” прикладной программы.
4. Программы Java категория Апплет (applet)?
>> специализированная программа с ограниченными возможностями, работающая в окне WWW-документа под управлением браузера.
5. Программы Java категория Сервлет (servlet)?
>> специализированная программа с ограниченными возможностями, работающая в WWW на стороне сервера. Используется преимущественно в рамках технологии JSP для программирования WWW-документов со стороны сервера.
6. Программы Java категория Серверное приложение (Enterprise application)?
>> предназначено для многократного использования на стороне сервера.
7. Программы Java категория Библиотека (Java Class Library)?
>> библиотека классов, либо NetBeansModule – модуль платформы NetBeans) – предназначена для многократного использования программами Java.
8. Какие из следующих строк скомпилируются без ошибки?
>> int i = 32565;
— float f = 7.0;
— char c = «z»;
— byte b = 255;
— boolean n = null;
9. Какие из следующих строк скомпилируются без ошибки?
>> int j = ’ъ’;
— float f = 7.0;
— char c = «z»;
— byte b = 255;
— boolean n = null;
10. Какие варианты записи оператора условного перехода корректны?
>> if (i
— if (i
— if [i — if then System.out.print(«-6-«);
12. Какие из следующих идентификаторов являются корректными?
>> _int;
— 2int;
— int_#;
— #int
— _#int
13. Назначение утилиты javac?
>> Компилятор в режиме командной строки для программ, написанных на языке Java.
14. Назначение утилиты java?
>> Утилита для запуска в режиме командной строки откомпилированных программ-приложений.
15. Назначение утилиты appletviewer?
>> Утилита для запуска на исполнение и отладку апплетов без браузера. При этом не гарантируется работоспособность отлаженного апплета в браузере.
16. Назначение утилиты jdb?
>> Отладчик программ, написанных на языке Java.
17. Назначение утилиты javadoc?
>> Генератор документации по классом на основе комментариев, начинающихся с /**.
18. Назначение утилиты jar?
>> Создание и управление Java-архивами jar.
19. Назначение утилиты javah?
>> Генератор заголовочных файлов C/C++ для подключения к программам Java внешних библиотек C/C++ на основе интерфейса JNI.
20. Назначение утилиты javap?
>> Дизассемблер классов.
21. Назначение утилиты extcheck?
>> Утилита для обнаружения конфликтов между файлами архивов jar.
22. Назначение утилиты native2ascii?
>> Утилита для конвертации в режиме командной строки параметра, передаваемого в виде текста на национальном алфавите, в последовательность символов UNICODE.
23. Управляющая последовательность: \a ?
>> звонок.
24. Управляющая последовательность: \b ?
>> возврат на один символ назад.
25. Управляющая последовательность: \f ?
>> перевод на новую страницу.
26. Управляющая последовательность: \n ?
>> перевод на новую строку.
27. Управляющая последовательность: \r ?
>> возврат к началу строки.
28. Управляющая последовательность: \t ?
>> горизонтальная табуляция.
29. Управляющая последовательность: \v ?
>> вертикальная табуляция.
30. Управляющая последовательность: \’ ?
>> кавычка.
31. Управляющая последовательность: \” ?
>> двойные кавычки.
32. Управляющая последовательность: \\ ?
>> обратная косая черта.
33. Управляющая последовательность: \u ?
>> начало кодировки символа Unicode.
34. Оператор ~ ?
>> Оператор побитового дополнения (побитовое “не”).
35. Оператор ^ ?
>> Оператор “исключающее или” (XOR).
36. Оператор & ?
>> Оператор “побитовое и” (AND).
37. Оператор | ?
>> Оператор “побитовое или” (OR).
38. Оператор ! ?
>> Оператор “НЕ”.
39. Оператор && ?
>> Оператор “логическое И” (AND).
40. Оператор || ?
>> Оператор “ логическое ИЛИ” (OR).
41. Оператор >> Оператор левого побитового сдвига.
42. Оператор >>> ?
>> Оператор беззнакового правого побитового сдвига.
43. Оператор >> ?
>> Оператор правого побитового сдвига с сохранением знака отрицательного числа.
44. Для чего предназначен пакет java.applet?
>> Классы, необходимые для создания аплетов.
45. Для чего предназначен пакет java.awt?
>> Графический пользовательский интерфейс на базе AbstractWindowsToolkit.
46. Для чего предназначен пакет java.awt.color?
>> Пространства цветов для AWT.
47. Для чего предназначен пакет java.awt.datatransfer?
>> Передача данных внутри программы и между программами.
48. Для чего предназначен пакет java.awt.dnd?
>> Поддержка технологии drag-and-drop.
49. Для чего предназначен пакет java.awt.event?
>> Обработка событий AWT.
50. Для чего предназначен пакет java.awt.im?
>> Поддержка нестандартных методов ввода текста.
51. Для чего предназначен пакет java.awt.im.spi?
>> Интерфейсы для создания нестандартных методов ввода текста.
52. Для чего предназначен пакет java.lang?
>> Базовые классы языка Java.
53. Для чего предназначен пакет java.lang.ref?
>> Управление ссылками на объекты.
54. В папке build проекта NetBeans находятся?
>> хранятся скомпилированные файлы классов, имеющие расширение .class.
55. В папке dist проекта NetBeans находятся?
>> файлы, предназначенные для распространения как результат компиляции (модуль JAR приложения или библиотеки, а также документация к нему).
56. В папке nbproject проекта NetBeans находятся?
>> находится служебная информация по проекту.
57. В папке src проекта NetBeans находятся?
>> исходные коды классов. Кроме того, там же хранится информация об экранных формах (которые будут видны на экране в виде окон с кнопками, текстом и т.п.). Она содержится в XML-файлах, имеющих расширение .form.
58. В папке test проекта NetBeans находятся?
>> сопроводительные тесты, предназначенные для проверки правильности работы классов проекта.
59. Команды документации (символы метаданных) @see?
>> применяется для создания в документе гиперссылок на другие комментарии. Можно использовать для любых конструкций (классов, методов и т.д. ).
60. Команды документации (символы метаданных) @since?
>> Информация о версии JDK, начиная с которой введён или работоспособен класс или интерфейс.
61. Команды документации (символы метаданных) @throws?
>> Информация об исключительных ситуациях, которые могут возбуждаться методом.
62. Команды документации (символы метаданных) @param?
>> информация о параметре метода.
63. Команды документации (символы метаданных) @deprecated?
>> информация о том, что данный метод устарел и в последующих версиях будет ликвидирован. При попытке использования таких методов компилятор выдаёт программисту предупреждение (warning) о том, что метод устарел, хотя и компилирует проект.
64. Целые типы, тип byte?
>> Однобайтовое целое число (8-битное целое со знаком).
65. Целые типы, тип short?
>> Короткое целое число (16- битное целое со знаком).
66. Целые типы, тип char?
>> Символьный тип (беззнаковое 16- битное целое).
67. Целые типы, тип int?
>> Целое число (32- битное целое со знаком).
68. Целые типы, тип long?
>> Длинное целое число (64- битное целое со знаком).
69. Выберите правильный вариант a,b,c,d чтобы результат выражения a&&b || c^ d являлся истиной?
>> все ответы верны
— a=true, b=true, c=false, d=true
— a=false, b=false, c=false, d=true
— a=false, b=false, c=true, d=false
— a=true, b=true, c=true, d=true
70. Выберите правильный вариант a,b,c,d чтобы результат выражения a&&(b || c)^ d являлся ложью?
>> все ответы верны
— a=false, b=true, c=false, d=true
— a=true, b=true, c=false, d=true
— a=false, b=false, c=false, d=true
— a=false, b=false, c=false, d=false
71. Вещественные типы, размер типа float?
>> 4 байта
72. Вещественные типы, размер типа double?
>> 8 байт
73. Float f1 = new Float(Float.NaN);
Float f2 = new Float(Float.NaN);
System.out.println( «»+ (f1 == f2)+» «+f1.equals(f2)+ » «+(Float.NaN == Float.NaN) );
Что будет выведено в результате выполнения данного куска кода?
>> false true false
74. int i = 0;
i++;
System.out.print(i);
i = i++;
System.out.println(i); Что выведет данный код?
>> 11
75. int i = 0, j = 5;
tp: for (;;) < i++;
for (;;) < if (i >—j) breaktp; > >
System.out.println(«i =» + i + «, j = » + j);> Что произойдет во время компиляции и выполнения данного фрагмента кода?
>> Ошибка компиляции.
76. int i = 1; //1
i = -+(10 + 2 + i); //2
++i—; //3
System.out.println(i); В какой строке(-ах) кода содержится ошибка?
>> 3.
77. Integer i = newInteger(«10»);
if (i.toString().intern() == i.toString().intern()) System.out.println(«Равный»);
> else System.out.println(«Не равный»); >> Результат выполнения программы?
>> Выведется “Равный”.
78. public class Main public static void main(String[] args) Boolean b1 = new Boolean(«true»); System.out.print(b1 +» «);
b1 =new Boolean(«tRuE»); System.out.print(b1 +» «);
b1 =new Boolean(«test»); System.out.print(b1 +» «);
b1 =new Boolean(true); System.out.print(b1 +» «);
b1 = true; System.out.println(b1); >> каким будет результат компиляции и выполнения кода?
>> true true false true true
79. public class Test static < System.out.print("Bo-Bo ");>
public static void main(String[] args) System.out.print(«Hello, World! «); >
static < System.out.println("Go-Go "); System.exit(0); >> что выведет код?
>> Bo-Bo Go-Go
80. int i = 1; //1
i = -+(10 + 2 + 1); //2
++i—; //3
System.out.println(i); В какой строке(-ах) кода содержится ошибка?
>> 3
81. Integer a = 128; Integer b = 128;
Integer c = -128; Integer d = -128;
System.out.print((a == b)+» «);
System.out.println(c == d); Что будет выведено на экран?
>> false true
82. Boolean b = new Boolean(«Hello»);
System.out.println(b); Какой результат выполнения данного кода?
>> false
83. public class Test static < i =5; >
static int i = 6;
public static void main(String[] args) System.out.println(i); >> Выберите правильный ответ?
>> 6
84. public class MathTest public static void main(String[] args) System.out.print(((-7 % 5)>(7 % -5))+» «);
System.out.println(Math.abs(Math.ceil(-2.5))
Что будет напечатано в результате выполнения данного кода?
>> false true
85. int i = 0;
System.out.print(i++);
System.out.println(i); Результат кода?
>> 01
86. int j = 0;
System.out.print(++j);
System.out.println(j); Результат кода?
>> 11
87. public class TestClass
int i = getInt();
int k = 20;
public int getInt()
public static void main(String[] args)
TestClass t = new TestClass ();
System.out.println(t.i+» «+t.k); >>
Что выведет этот код?
>> Будет выведено на печать 1 20
88. int x = 0;
int y = 10;
do< y--;
++x;> while(x<5);
System.out.print(x+»,»+y); >
Что напечатает этот код?
>> напечатает 5 5
89. Дана строка:
String s=»true,false»;
Каким способом можно сформировать новую строку, равную “test”?
>> String n = s.substring(0,1) + s.substring(9,10) + s.substring(8,9) + s.substring(0,1)
90. int result = 12+2*5%3-15/4;
String x=12-6+»Hello»+7+5;
System.out.println(result+»-«+x);
Что будет выведено на консоль?
>> 10-6Hello75
91. String s1=»Строка типа String»;
String s2=»Строка«;
s2+=» типа String»;
if(s1==s2) System.out.println(«s1 равно s2″);
else System.out.println(«s1 не равно s2″);
Что выведет этот код?
>> s1 не равно s2
92. String s1=»Строка типа String»;
String s2=»Строка«;
s2+=» типа String»;
if(s1.equals(s2)) System.out.println(«s1 равно s2″);
else System.out.println(«s1 не равно s2″);
Что выведет этот код?
>> s1 равно s2
93. String s1=»Строка»;
String s2=»Строка»;
if(s1==s2) System.out.println(«s1 равно s2″);
else System.out.println(«s1 не равно s2″);
Что выведет этот код?
>> s1 равно s2
94. String s=»»;
s+= 1+2+3;
System.out.println(s);
Что выведет этот код?
>> 6
95. String s=»Сумма =»+1+2+3;
System.out.println(s);
Что выведет этот код?
>> Сумма=123
96. String s=1+2+» не равно «+1+2;
System.out.println(s);
Что выведет этот код?
>> 3 не равно 12
97. Работа с графикой. Функция clearRect(x,y,w,h)?
>> Очистка прямоугольника (заполнение текущим цветом).
98. Работа с графикой.Функция fill3DRect(x,y,w,h, isRaised)?
>> Вывод «объемного» прямоугольника, заполненного текущим цветом.
99. Работа с графикой.Функция fillPolygon(Polygon p)?
>> Вывод многоугольника, заполненного текущим цветом.
100. Работа с графикой. Функция copyArea(x,y,w,h,dx,dy)?
>> Копирование области на новое место.
101. Переменные класса File. String pathSeparator?
>> Содержит строку с символом разделителя пути в операционной системе. Это «/» в Unix-подобных системах и «\» в Windows.
102. Переменные класса File.char pathSeparatorChar?
>> Содержит символ разделителя пути в операционной системе. Это «/» в Unix-подобных системах и «\» в Windows.
103. Переменные класса File.String separator?
>> Содержит строку с символом разделителя между именами файлов и файловых масок в операционной системе.
104. Переменные класса File. char separatorChar?
>> Содержит символ разделителя между именами файлов и файловых масок в операционной системе.
105. Методы класса File.canRead() ?
>> Возвращает true в случае, когда файл (или папка) с заданным в конструкторе именем существует и доступен по чтению. Иначе false.
106. Методы класса File.setReadOnly() ?
>> Возвращает true в случае, когда файл (или папка) с заданным в конструкторе именем существует, и ему удалось установить статус «доступен только по чтению». Иначе false.
107. Методы класса File. isDirectory() ?
>> Возвращает true в случае, когда файл или папка с заданным в конструкторе именем существует и является папкой. Иначе false.
108. Методы класса File. isFile() ?
>> Возвращает true в случае, когда файл или папка с заданным в конструкторе именем существует и является файлом. Иначе false.
109. Методы класса File.isHidden() ?
>> Возвращает true в случае, когда файл или папка с заданным в конструкторе именем существует и является скрытым. Иначе false.
110. Методы класса File. lastModified() ?
>> Возвращает время последней модификации файла, если он существует и доступен по чтению. Иначе 0L.
111. Методы класса File. setLastModified(long time) ?
>> Устанавливает время последней модификации файла. Возвращает true, если он существует и доступен по записи. Иначе false.
112. Методы класса File.getName() ?
>> Возвращает короткое имя файла или папки.
113. Методы класса File.getAbsolutePath() ?
>> Возвращает абсолютный путь к файлу или папке, включая имя файла. При этом, если в имени файла в конструкторе была задана относительная адресация, соответствующая часть пути сохраняется в возвращаемой строке.
114. Методы класса File. getCanonicalPath() ?
>> Возвращает абсолютный путь к файлу или папке, включая имя файла. При этом, если в имени файла в конструкторе была задана относительная адресация, соответствующая часть пути заменяется в возвращаемой строке на канонический вариант адресации – без элементов относительной адресации.
115. Методы класса File.compareTo(File f) ?
>> Сравнение имён файлов (папок), сопоставляемых текущему файловому объекту и объекту f. Возвращает 0 в случае, когда абсолютные имена файлов (папок) совпадают. Иначе возвращает число, зависящее от разницы в длинах имён и кодов, составляющих их символов.
116. Методы класса File.isAbsolute() ?
>> Возвращает true в случае, когда адресация к имени файла (папки) текущего файлового объекта является абсолютной. Хотя может содержать элементы относительной адресации, то есть не быть канонической.
117. Методы класса File.equals(Object obj) ?
>> Возвращает true тогда и только тогда, когда текущий объект и параметр obj соответствует одному и тому же файлу (папке).
118. Методы класса File.createTempFile(String prefix, String suffix) ?
>> Обеспечивает создание пустого файла (или папки), задаваемого коротким именем prefix+suffix в папке операционной системы, предназначенной для временных файлов. Возвращает ссылку на объект. Префикс должен быть не менее 3 символов.
119. Методы класса File.mkdir() ?
>> Попытка создания папки по имени, которое было задано в конструкторе объекта. Возвращает true в случае успешного создания и false в других случаях.
120. Методы класса File.renameTo(File dest) ?
>> Попытка переименования файла или папки с имени, которое было задано в конструкторе объекта, на новое, задаваемое параметром dest. Возвращает true в случае успешного переименования и false в других случаях.
121. Методы класса File.getAbsoluteFile() ?
>> Создание нового файлового объекта по абсолютному пути, соответствующему текущему файловому объекту.
122. Методы класса File.list() ?
>> Возвращает массив строк (список) коротких имён, находящихся в папке файлов и папок. Имена элементов, находящихся во вложенных папках, не показываются. Если файловый объект не соответствует существующей папке, возвращает null.
123. Конструкторы?
>> это методы, используемые для инициализации объектов в процессе их реализации.
124. Как объекты обмениваются информацией?
>> Объекты общаются друг с другом посредством посылки сообщений.
125. Что такое this?
>> ссылка, с помощью которой объект обращается к самому себе.
126. Класс ?
>> Класс – это структурный тип данных, который включает описание полей данных, а также процедур и функций, работающих с этими полями данных.
127. Процедуры и функции, работающие с полями данных класса?
>> Называются методами.
128. Объединение полей данных и процедур и функций, работающих с этими данными, в единый пакет, при наличии специальных правил доступа к элементам пакета?
>> Инкапсуляция.
129. Основные средства разработки классов. Наследование?
>> Конструирование новых более сложных классов из уже имеющихся посредством добавления полей и определения новых методов (принцип иерархичности).
130. Основные средства разработки классов. Полиморфизм?
>> обеспечивает возможность задания различных реализаций некоторого единого по названию метода для классов различных уровней иерархии.
131. Полиморфными объектами или полиморфными переменными называются?
>> переменные, которым в процессе выполнения программы может быть присвоено значение, тип которого отличается от типа переменной.
132. К изменению свойств объекта возможен только через принадлежащие ему?
>> методы.
133. В момент времени объект характеризуется:?
>> Свойствами
134. Программа в объектно-ориентированном программировании состоит из:?
>> событийных процедур.
135. Инкапсулированные в классе процедуры и функции называются?
>> Методы
136. Процесс, при котором различный код и данные различных модулей соединяются друг с другом в процессе исполнения, называют компоновкой?
>> Динамической
137. Область исходного кода программы, из которой допустим нормальный доступ к связанному с идентификатором объекту, называется?
>> Видимостью
138. Конструктором по умолчанию называется такой конструктор, который?
>> не принимает никаких аргументов.
139. Класс-наследник называется . от базового класса?
>> Производным.
140. Что следует ожидать на экране?
System.out.print(«A»+»B»+»C»);
System.out.println(‘A’+’B’+’C’);
>> ABC198
141. int j = 0;
for (int i = 0; i< 10; i++)
j = j++;
System.out.println(j);
Что выведется в результате?
>> 0
142. int x, y;
int i;
x = 1;
for (i = 0; i< 10; i++)
Что выведется в результате?
>> 3 5 7 9 11 13 15 17 19 21
143. int x, y;
int i;
x = 1;
for (i = 0; i< 10; i++)
Что выведется в результате?
>> 2 4 6 8 10 12 14 16 18 20
144. int x=0;
for(int count=10; count < 5; count++)
x += count ;>
Чему равна х?
>> 0
145. for(inti=-10; i
System.out.print(i + » «) ;>,
Что выведется в результате?
>> -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0
147. Каков будет результат следующего примера?
Point p = new Point(1,2);
int a =p.x;
p = new Point(3,4);
System.out.println(a);
>> 1
148. Каков будет результат следующего примера?
Point p1 = new Point(3,4);
Point p2 = p1;
p1.x = 5;
p1 = new Point(4,4);
System.out.println(p2.x-p1.x);
>> 1
149. Каков будет результат следующих действий?
Point p1 = new Point(2,3);
Point p2 = new Point(2,3);
System.out.print(p1==p2);
p2=p1;
p1.x = 3;
System.out.print(» «);
System.out.println(p1==p2);
>> false true
150. Каков будет результат следующего примера?
public class testClass
public static void process (int x)
public static void main(String[] args)
int x=3; process(x);
System.out.println(x); >>
>> 3
151. Что будет напечатано в консоли в результате выполнения следующего кода:
System.out.println((byte)383+» «+(byte)384+» «+(byte)-384); ?
>> 127 -128 -128
152. Каков будет результат следующего примера?
char c = 65;
System.out.print(c);
System.out.print(+c);
System.out.print(«=»+c);
>> A65=A
153. Каков будет результат следующего примера?
class Parent
class Child extends Parent
public class testClass
public static void main(String[] args)
Child c = new Child(); System.out.print(c.a);
Parent p=c; System.out.print(p.a); >>
>> 32
154. Каков будет результат следующего примера?
class Parent
public void printX()>
class Child extends Parent
public class testClass
public static void main(String[] args)
new Child().printX(); >>
>> 0
155. Каков будет результат следующего примера?
class Parent
class Child extends Parent
public class testClass
public static void main(String[] args)
Child.a=10; Parent.a=5; System.out.println(Child.a); >>
>> 5
156. Каков будет результат следующего примера?
int i,j;
lab:for(i=0;i<6;i++)
for(j=3;j>1;j—)
if(i==j) > >
>> 2
157. Каков будет результат следующей программы?
public class testClass public static void main(String[] args) inti =5;
while(i=5) <
System.out.println(i++); >>>
>> Ошибка компиляции.
158. Каков будет результат следующего примера?
int b=5;
System.out.print(b+(b=3));
System.out.print((b=3)+3);b=5;
System.out.print(b+=(b=3));
>> 868
159. Дан код:
class Quest3
public static void main(String s[ ])
String args;
System.out.print(args + s);
>>
Результатом компиляции кода будет?
>> ошибка компиляции: переменная args используется до инициализации.
160. Дан код:
public class Quest5
public static void main()
System.out.print(«А«); >
public static void main(String args)
System.out.print(«Б«); >
public static void main(String[] args)
System.out.print(«В»);>>
Что будет выведено в результате компиляции и запуска?
>> B
161. Какие из следующихутверждений истинные?
a-nonstatic-метод не может быть вызван из статического метода;
b-static-метод не может быть вызван из нестатического метода;
c-private-метод не может быть вызван из другого метода этого класса;
d-final-метод не может быть статическим.
>> a
162. Дан код:
public class Quest5
static
Quest5()
public static void main(String[] args)
System.out.print(«4»); >>
В результате при компиляции и запуске будет выведено?
>> 24
163. Какие из объявлений корректны, если
classOwner
classInner
>>?
>> new Owner().new Inner();
164. Дан код:
public class Quest1
public static void main(String[] args)
String str = new String(«java»);
int i=1;
char j=3;
System.out.println(str.substring(i,j));>>
В результате при компиляции запуске будет выведено?
>>
165. Экземпляром какого класса является поле System.in?
>> java.io.InputStream;
166. Какой абстрактный класс является суперклассом для всех классов, используемых для чтения байтов?
>> InputStream
167. Какой интерфейс наиболее пригоден для создания класса, содержащего несортированные уникальные объекты?
>> Set
168. Дан код:
Какой код читает параметр count в переменную i?
>> int i = new Integer(getParameter(»count»)).intValue()
Список вопросов базы знаний
Что будет видно в окне, созданном при помощи приведенного кода?
import java.awt.*;
public class My public static void main(String arg[]) Frame f=new Frame();
f.setLayout(new CardLayout());
f.add(new Button(«A»),»First»);
f.add(new Button(«B»),»Second»);
f.add(new Button(«C»),»Thead»);
f.setSize(200,200);
f.setVisible(true);
>
>
?) Кнопки «A»,»B»,»C» в одну строчку
?) Ничего в окне не появится
?) Кнопки «A»,»B»,»C» в один столбик
Вопрос id:11352
Тема/шкала: Пакет NET
Какой менеджер компоновок позволяет разместить компоненты в таблице с ячейками равного размера?
?) GridLayout
?) BorderLayout
?) FlowLayout
?) CardLayout
Вопрос id:11353
Тема/шкала: Классы
Какой класс является родительским для потоков ввода данных?
?) InputStream
?) FileInputStream
?) DataStream
?) OutputStream
Вопрос id:11354
Тема/шкала: Основы синтаксиса
Каково максимальное значение для переменной типа byte?
?) зависит от компилятора
?) зависит от интерпретатора
Вопрос id:11355
Тема/шкала: Потоки ввода-вывода
Какой класс пакета java.io позволяет создать поток вывода текстовых данных с учетом кодировки?
?) FilterOutputStream
?) OutputStream
?) OutputStreamWriter
?) CharArrayWriter
Вопрос id:11356
Тема/шкала: Сервлеты / JSP
Какие результаты можно увидеть в окне при попытке компиляции и запуска следующей программы?
import java.awt.*;
public class My extends Frame public void paint(Graphics g) Font f=new Font(“Gothic”,Font.BOLD,24);
g.setFont(f);
g.drawString(“Hello”,20,20);
>
public static void main(String arg[]) My m=new My();
m.setSize(200,200);
m.setVisible(true);
>
>
?) программа не откомпилируется, так как шрифт Gothic не определен в Java
?) программа откомпилируется и в окне появится слово Hello выведенное шрифтом по умолчанию
?) программа откомпилируется и в окне появится слово Hello выведенное шрифтом Gothic
?) программа откомпилируется, но при попытке запуска возникнет исключительная ситуация типа NullPointerException
Вопрос id:11357
Тема/шкала: Потоки ввода-вывода
Исключительная ситуация какого типа возможна при открытии сокетного соединения следующим образом: Socket s=new Socket(«www.specialist.ru»,80);
?) только BadURLException
?) IOException и UnknownHostException
?) IOException и MalformedURLException
?) только IOException
?) только UnknownHostException
?) только MalformedURLException
Вопрос id:11358
Тема/шкала: Основы синтаксиса
Какие имена переменных допустимы?
Вопрос id:11359
Тема/шкала: Потоки ввода-вывода
Экземпляром какого класса является поле System.in?
?) java.lang.System
?) java.io.BufferedInputStream
?) java.io.PrintStream
?) java.io.InputStreamWriter
?) java.io.InputStream
Вопрос id:11360
Тема/шкала: Пакет NET
Какое выравнивание используется по умолчанию для компоновки FlowLayout?
?) FlowLayout.MIDDLE
?) FlowLayout.RIGHT
?) Выравнивание надо всегда указывать явно
?) FlowLayout.CENTER
?) FlowLayout.LEFT
Вопрос id:11361
Тема/шкала: Классы
Экземпляром какого класса является поле System.err?
?) java.io.PrintStream
?) java.lang.System
?) java.io.OutputStream
?) java.io.ErrorStream
Вопрос id:11362
Тема/шкала: Сервлеты / JSP
Что будет видно в окне, созданном при помощи нижеприведенного кода?
import java.awt.*;
public class My public static void main(String arg[]) Frame f=new Frame();
f.setLayout(new GridLayout(1,3,3,1));
f.add(new Button(«A»),»First»);
f.add(new Button(«B»),»Second»);
f.add(new Button(«C»),»Thead»);
f.setSize(400,400);
f.setVisible(true);
>
>
?) Кнопки «A»,»B»,»C» в один столбик
?) Кнопки «A»,»B»,»C» в одну строчку
?) Ничего в окне не появится
Вопрос id:11363
Тема/шкала: Основы синтаксиса
Сколько бит оперативной памяти занимает переменная типа char?
?) Объем выделяемой памяти зависит от интерпретатора
?) Объем выделяемой памяти зависит от компилятора
Вопрос id:11364
Тема/шкала: Сервлеты / JSP
Какие результаты можно увидеть на экране при попытке компиляции и запуска следующей программы?
class First int sum(int x,int y) return(x+y);
>
>
public class Second extends First public static void main(String a[]) Second s=new Second();
System.out.println(«Summa answer_variants»>
?) Программа не откомпилируется из-за невозможности создать объект экземпляр класса Second внутри класса Second
?) Программа не откомпилируется из-за того что метод sum не унаследуется классом Second
?) Программа не откомпилируется из-за отсутствия спецификатора доступа public в описании класса First
Вопрос id:11365
Тема/шкала: Потоки ввода-вывода
Какой класс необходимо использовать клиенту для соединения с сокетом сервера?
?) ServerSocket
?) SocketServer
Вопрос id:11366
Тема/шкала: Пакет SQL
Сколько типов драйверов баз данных различают в JDBC?
?) Никаких различий в типах драйверов не существует
Вопрос id:11367
Тема/шкала: Сервлеты / JSP
Какие результаты можно увидеть на экране при попытке компиляции и запуска следующей программы?
public class My int x=5, y=6;
class MyToo int sum() return(My.this.x+My.this.y);
>
>
public static void main(String arg[]) My m=new My();
My.MyToo mt=m.new MyToo();
System.out.println(«sum answer_variants»>
?) программа откомпилируется и при выполнении вернет null
?) программа не откомпилируется, так как методы вложенного класса не имеют спецификатора доступа public
?) программа откомпилируется и при выполнении вернет 11
?) программа откомпилируется и при выполнении вернет сообщение о ошибке
?) программа не откомпилируется, так как поля x и y не доступны внутри класса MyToo
?) программа не откомпилируется, так как метод sum вложенного класса должен иметь спецификатор доступа static
?) программа не откомпилируется, так как неправильно создается объект экземпляр класса MyToo
Вопрос id:11368
Тема/шкала: Сервлеты / JSP
В каком пакете находится интерфейс Servlet?
?) В пакете java.http
?) В пакете java.servlet
?) В пакете javax.servlet.http
?) В пакете javax.servlet
Вопрос id:11369
Тема/шкала: Основы синтаксиса
Какой результат появится на экране после выполнения следующей прграммы?
public class My public static void main(String arg[]) cko:
for(int i=0;i
?) Программа не откомпилируется из-за отсутствия спецификатора доступа public в описании поля a внутри интерфейса First
?) Программа не откомпилируется из-за недопустимости использования нестатических полей внутри статического метода
?) Программа не откомпилируется из-за недопустимости присваивания нового значения полю a, так как это поле имеет спецификатор доступа final
?) Программа не откомпилируется из-за недопустимости присваивания значений полям интерфейсного класса
?) Программа не откомпилируется из-за недопустимости описания полей внутри интерфейсного класса
?) Программа не откомпилируется из-за отсутствия спецификатора доступа public в описании интерфейса First
Вопрос id:11377
Тема/шкала: Классы
Какие результаты можно увидеть на экране при попытке компиляции и запуска следующей программы?
final class My public static void main(String a[]) System.out.println(«Hello!»);
>
>
?) Программа не запустится из-за отсутствия метода main
?) Программа не откомпилируется из-за недопустимого спецификатора доступа в описании класса
?) Программа не откомпилируется из-за того, что компилятор не найдет классы System и String
Вопрос id:11378
Тема/шкала: Основы синтаксиса
Какие определения интерфейса My являются правильными?
?) public interface My <
public int a;
public int sum(int x,int y);
>
?) public interface My <
public int a=0;
public int sum(int x,int y);
>
?) interface My <
int sum(int x,int y);
>
?) public interface My <
public int sum(int x,int y);
>
?) public interface My <
public abstract int sum(int x,int y);
>
?) interface My <
public int sum(int x,int y) <
return(x+y);
>
>
Вопрос id:11379
Тема/шкала: Пакет SQL
Какой пакет необходимо использовать для работы с базами данных?
Вопрос id:11380
Тема/шкала: нет
Какие результаты можно увидеть на экране при попытке компиляции и запуска следующей программы?
public class My public static void main(String arg[]) int x=0, y;
if(x==0)y=1;
if(x!=0)y=2;
System.out.println(«y answer_variants»>
?) программа откомпилируется и при выполнении вернет 2
?) программа откомпилируется и при выполнении вернет сообщение о ошибке
?) программа не откомпилируется, так как переменная y может быть не инициализирована
?) программа откомпилируется и при выполнении вернет 1
?) программа откомпилируется и при выполнении вернет null
?) программа откомпилируется и при выполнении вернет 0
Вопрос id:11381
Тема/шкала: нет
Какая ошибка возникнет при компиляции следующего фрагмента кода?
import java.io.*;
public class My public static void main(String arg[]) byte b[]=new byte[256];
FileInputStream fis=new FileInputStream(«test.txt»);
fis.read(b);
fis.close();
>
>
?) Ошибка возникнет из-за того, что нельзя читать данные в байтовый массив из текстового файла
?) Никакой ошибки не будет
?) Ошибка возникнет из-за отсутствия метода read в классе FileInputStream
?) Ошибка возникнет из-за того, что конструктор класса FileInputStream и методы read и close могут порождать исключительную ситуацию типа IOException
?) Ошибка возникнет из-за того, что длина массива b может не совпадать с длиной файла «test.txt»
?) Ошибка возникнет из-за необходимости указывать полный путь к файлу в конструкторе класса FileInputStream
Обработка ошибок и исключения
2. Коды возврата. Основная идея — в случае ошибки возвращать специальное значение, которое не может быть корректным. Например, если в методе есть операция деления, то придется проверять делитель на равенство нулю. Также проверим корректность аргументов a и b :
Double f(Double a, Double b) < if ((a == null) || (b == null)) < return null; > //. if (Math.abs(b) < EPS) < return null; > else < return a / b; > >
При вызове метода необходимо проверить возвращаемое значение:
Double d = f(a, b); if (d != null) < //. > else < //. >
Минусом такого подхода является необходимость проверки возвращаемого значения каждый раз при вызове метода. Кроме того, не всегда возможно определить тип ошибки.
3.Использовать флаг ошибки: при возникновении ошибки устанавливать флаг в соответствующее значение:
boolean error; Double f(Double a, Double b) < if ((a == null) || (b == null)) < error = true; return null; > //. if (Math.abs(b) < EPS) < error = true; return b; > else < return a / b; > >
error = false; Double d = f(a, b); if (error) < //. > else < //. >
Минусы такого подхода аналогичны минусам использования кодов возврата.
4.Можно вызвать метод обработки ошибки и возвращать то, что вернет этот метод.
Double f(Double a, Double b) < if ((a == null) || (b == null)) < return nullPointer(); > //. if (Math.abs(b) < EPS) < return divisionByZero(); > else < return a / b; > >
Но в таком случае не всегда возможно проверить корректность результата вызова основного метода.
5.В случае ошибки просто закрыть программу.
if (Math.abs(b) < EPS) < System.exit(0); return this; >
Это приведет к потере данных, также невозможно понять, в каком месте возникла ошибка.
Исключения
В Java возможна обработка ошибок с помощью исключений:
Double f(Double a, Double b) < if ((a == null) || (b == null)) < throw new IllegalArgumentException("arguments of f() are null"); > //. return a / b; >
Проверять b на равенство нулю уже нет необходимости, так как при делении на ноль метод бросит непроверяемое исключение ArithmeticException .
- разделить обработку ошибок и сам алгоритм;
- не загромождать код проверками возвращаемых значений;
- обрабатывать ошибки на верхних уровнях, если на текущем уровне не хватает данных для обработки. Например, при написании универсального метода чтения из файла невозможно заранее предусмотреть реакцию на ошибку, так как эта реакция зависит от использующей метод программы;
- классифицировать типы ошибок, обрабатывать похожие исключения одинаково, сопоставлять специфичным исключениям определенные обработчики.
Каждый раз, когда при выполнении программы происходит ошибка, создается объект-исключение, содержащий информацию об ошибке, включая её тип и состояние программы на момент возникновения ошибки. После создания исключения среда выполнения пытается найти в стеке вызовов метод, который содержит код, обрабатывающий это исключение. Поиск начинается с метода, в котором произошла ошибка, и проходит через стек в обратном порядке вызова методов. Если не было найдено ни одного подходящего обработчика, выполнение программы завершается.
Таким образом, механизм обработки исключений содержит следующие операции:
- Создание объекта-исключения.
- Заполнение stack trace’а этого исключения.
- Stack unwinding (раскрутка стека) в поисках нужного обработчика.
Классификация исключений
Класс Java Throwable описывает все, что может быть брошено как исключение. Наследеники Throwable — Exception и Error — основные типы исключений. Также RuntimeException , унаследованный от Exception , является существенным классом.
Иерархия стандартных исключений
Проверяемые исключения
Наследники класса Exception (кроме наслеников RuntimeException ) являются проверяемыми исключениями(checked exception). Как правило, это ошибки, возникшие по вине внешних обстоятельств или пользователя приложения – неправильно указали имя файла, например. Эти исключения должны обрабатываться в ходе работы программы, поэтому компилятор проверяет наличие обработчика или явного описания тех типов исключений, которые могут быть сгенерированы некоторым методом.
Все исключения, кроме классов Error и RuntimeException и их наследников, являются проверяемыми.
Error
Класс Error и его подклассы предназначены для системных ошибок. Свои собственные классы-наследники для Error писать (за очень редкими исключениями) не нужно. Как правило, это действительно фатальные ошибки, пытаться обработать которые довольно бессмысленно (например OutOfMemoryError ).
RuntimeException
Эти исключения обычно возникают в результате ошибок программирования, такие как ошибки разработчика или неверное использование интерфейса приложения. Например, в случае выхода за границы массива метод бросит OutOfBoundsException . Такие ошибки могут быть в любом месте программы, поэтому компилятор не требует указывать runtime исключения в объявлении метода. Теоретически приложение может поймать это исключение, но разумнее исправить ошибку.
Обработка исключений
Чтобы сгенерировать исключение используется ключевое слово throw . Как и любой объект в Java, исключения создаются с помощью new .
if (t == null) < throw new NullPointerException("t = null"); >
Есть два стандартных конструктора для всех исключений: первый — конструктор по умолчанию, второй принимает строковый аргумент, поэтому можно поместить подходящую информацию в исключение.
Возможна ситуация, когда одно исключение становится причиной другого. Для этого существует механизм exception chaining. Практически у каждого класса исключения есть конструктор, принимающий в качестве параметра Throwable – причину исключительной ситуации. Если же такого конструктора нет, то у Throwable есть метод initCause(Throwable) , который можно вызвать один раз, и передать ему исключение-причину.
Как и было сказано раньше, определение метода должно содержать список всех проверяемых исключений, которые метод может бросить. Также можно написать более общий класс, среди наследников которого есть эти исключения.
void f() throws InterruptedException, IOException < //.
try-catch-finally
Код, который может бросить исключения оборачивается в try -блок, после которого идут блоки catch и finally (Один из них может быть опущен).
try < // Код, который может сгенерировать исключение >
Сразу после блока проверки следуют обработчики исключений, которые объявляются ключевым словом catch.
try < // Код, который может сгенерировать исключение > catch(Type1 id1) < // Обработка исключения Type1 > catch(Type2 id2) < // Обработка исключения Type2 >
Сatch -блоки обрабатывают исключения, указанные в качестве аргумента. Тип аргумента должен быть классом, унаследованного от Throwable , или самим Throwable . Блок catch выполняется, если тип брошенного исключения является наследником типа аргумента и если это исключение не было обработано предыдущими блоками.
Код из блока finally выполнится в любом случае: при нормальном выходе из try , после обработки исключения или при выходе по команде return .
NB: Если JVM выйдет во время выполнения кода из try или catch , то finally -блок может не выполниться. Также, например, если поток выполняющий try или catch код остановлен, то блок finally может не выполниться, даже если приложение продолжает работать.
Блок finally удобен для закрытия файлов и освобождения любых других ресурсов. Код в блоке finally должен быть максимально простым. Если внутри блока finally будет брошено какое-либо исключение или просто встретится оператор return , брошенное в блоке try исключение (если таковое было брошено) будет забыто.
import java.io.IOException; public class ExceptionTest < public static void main(String[] args) < try < try < throw new Exception("a"); > finally < throw new IOException("b"); > > catch (IOException ex) < System.err.println(ex.getMessage()); > catch (Exception ex) < System.err.println(ex.getMessage()); > > >
После того, как было брошено первое исключение — new Exception(«a») — будет выполнен блок finally , в котором будет брошено исключение new IOException(«b») , именно оно будет поймано и обработано. Результатом его выполнения будет вывод в консоль b . Исходное исключение теряется.
Обработка исключений, вызвавших завершение потока
При использовании нескольких потоков бывают ситуации, когда поток завершается из-за исключения. Для того, чтобы определить с каким именно, начиная с версии Java 5 существует интерфейс Thread.UncaughtExceptionHandler . Его реализацию можно установить нужному потоку с помощью метода setUncaughtExceptionHandler . Можно также установить обработчик по умолчанию с помощью статического метода Thread.setDefaultUncaughtExceptionHandler .
Интерфейс Thread.UncaughtExceptionHandler имеет единственный метод uncaughtException(Thread t, Throwable e) , в который передается экземпляр потока, завершившегося исключением, и экземпляр самого исключения. Когда поток завершается из-за непойманного исключения, JVM запрашивает у потока UncaughtExceptionHandler , используя метод Thread.getUncaughtExceptionHandler() , и вызвает метод обработчика – uncaughtException(Thread t, Throwable e) . Все исключения, брошенные этим методом, игнорируются JVM.
Информация об исключениях
- getMessage() . Этот метод возвращает строку, которая была первым параметром при создании исключения;
- getCause() возвращает исключение, которое стало причиной текущего исключения;
- printStackTrace() печатает stack trace, который содержит информацию, с помощью которой можно определить причину исключения и место, где оно было брошено.
Exception in thread "main" java.lang.IllegalStateException: A book has a null property at com.example.myproject.Author.getBookIds(Author.java:38) at com.example.myproject.Bootstrap.main(Bootstrap.java:14) Caused by: java.lang.NullPointerException at com.example.myproject.Book.getId(Book.java:22) at com.example.myproject.Author.getBookIds(Author.java:35)
Все методы выводятся в обратном порядке вызовов. В примере исключение IllegalStateException было брошено в методе getBookIds , который был вызван в main . «Caused by» означает, что исключение NullPointerException является причиной IllegalStateException .
Разработка исключений
Чтобы определить собственное проверяемое исключение, необходимо создать наследника класса java.lang.Exception . Желательно, чтобы у исключения был конструкор, которому можно передать сообщение:
public class FooException extends Exception < public FooException() < super(); > public FooException(String message) < super(message); > public FooException(String message, Throwable cause) < super(message, cause); > public FooException(Throwable cause) < super(cause); > >
Исключения в Java7
- обработка нескольких типов исключений в одном catch -блоке:
catch
(IOException | SQLException ex)
В таких случаях параметры неявно являются final , поэтому нельзя присвоить им другое значение в блоке catch .
Байт-код, сгенерированный компиляцией такого catch -блока будет короче, чем код нескольких catch -блоков.
- Try с ресурсами позволяет прямо в try -блоке объявлять необходимые ресурсы, которые по завершению блока будут корректно закрыты (с помощью метода close() ). Любой объект реализующий java.lang.AutoCloseable может быть использован как ресурс.
static String readFirstLineFromFile(String path) throws IOException < try (BufferedReader br = new BufferedReader(new FileReader(path))) < return br.readLine(); > >
В приведенном примере в качестве ресурса использутся объект класса BufferedReader , который будет закрыт вне зависимосити от того, как выполнится try -блок.
Можно объявлять несколько ресурсов, разделяя их точкой с запятой:
public static void viewTable(Connection con) throws SQLException < String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES"; try (Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query)) < //Work with Statement and ResultSet > catch (SQLException e) < e.printStackTrace; >>
Во время закрытия ресурсов тоже может быть брошено исключение. В try-with-resources добавленна возможность хранения «подавленных» исключений, и брошенное try -блоком исключение имеет больший приоритет, чем исключения получившиеся во время закрытия. Получить последние можно вызовом метода getSuppressed() от исключения брошенного try -блоком.
- Перебрасывание исключений с улучшенной проверкой соответствия типов.
Компилятор Java SE 7 тщательнее анализирует перебрасываемые исключения. Рассмотрим следующий пример:
static class FirstException extends Exception < >static class SecondException extends Exception < >public void rethrowException(String exceptionName) throws Exception < try < if ("First".equals(exceptionName)) < throw new FirstException(); > else < throw new SecondException(); > > catch (Exception ex) < throw e; > >
В примере try -блок может бросить либо FirstException , либо SecondException . В версиях до Java SE 7 невозможно указать эти исключения в декларации метода, потому что catch -блок перебрасывает исключение ex , тип которого — Exception .
В Java SE 7 вы можете указать, что метод rethrowException бросает только FirstException и SecondException . Компилятор определит, что исключение Exception ex могло возникнуть только в try -блоке, в котором может быть брошено FirstException или SecondException . Даже если тип параметра catch — Exception , компилятор определит, что это экземпляр либо FirstException , либо SecondException :
public void rethrowException(String exceptionName) throws FirstException, SecondException < try < // . > catch (Exception e) < throw e; > >
Если FirstException и SecondException не являются наследниками Exception , то необходимо указать и Exception в объявлении метода.
Примеры исключений
- любая операция может бросить VirtualMachineError . Как правило это происходит в результате системных сбоев.
- OutOfMemoryError . Приложение может бросить это исключение, если, например, не хватает места в куче, или не хватает памяти для того, чтобы создать стек нового потока.
- IllegalArgumentException используется для того, чтобы избежать передачи некорректных значений аргументов. Например:
public void f(Object a) < if (a == null) < throw new IllegalArgumentException("a must not be null"); > >
- IllegalStateException возникает в результате некорректного состояния объекта. Например, использование объекта перед тем как он будет инициализирован.
Гарантии безопасности
При возникновении исключительной ситуации, состояния объектов и программы могут удовлетворять некоторым условиям, которые определяются различными типами гарантий безопасности:
- Отсутствие гарантий (no exceptional safety). Если было брошено исключение, то не гарантируется, что все ресурсы будут корректно закрыты и что объекты, методы которых бросили исключения, могут в дальнейшем использоваться. Пользователю придется пересоздавать все необходимые объекты и он не может быть уверен в том, что может переиспозовать те же самые ресурсы.
- Отсутствие утечек (no-leak guarantee). Объект, даже если какой-нибудь его метод бросает исключение, освобождает все ресурсы или предоставляет способ сделать это.
- Слабые гарантии (weak exceptional safety). Если объект бросил исключение, то он находится в корректном состоянии, и все инварианты сохранены. Рассмотрим пример:
class Interval < //invariant: left double left; double right; //. >
Если будет брошено исключение в этом классе, то тогда гарантируется, что ивариант «левая граница интервала меньше правой» сохранится, но значения left и right могли измениться.
- Сильные гарантии (strong exceptional safety). Если при выполнении операции возникает исключение, то это не должно оказать какого-либо влияния на состояние приложения. Состояние объектов должно быть таким же как и до вызовов методов.
- Гарантия отсутствия исключений (no throw guarantee). Ни при каких обстоятельствах метод не должен генерировать исключения. В Java это невозможно, например, из-за того, что VirtualMachineError может произойти в любом месте, и это никак не зависит от кода. Кроме того, эту гарантию практически невозможно обеспечить в общем случае.
Источники
- Обработка ошибок и исключения — Сайт Георгия Корнеева
- Лекция Георгия Корнеева — Лекториум
- The Java Tutorials. Lesson: Exceptions
- Обработка исключений — Википедия
- Throwable (Java Platform SE 7 ) — Oracle Documentation
- try/catch/finally и исключения — www.skipy.ru
Доступ к переменной из другого класса [закрыт]
Уже битую неделю я пытаюсь заставить мой код достать recievedData из ServerThread и отправить его в Main , чтобы потом записать его в JTextArea . Пробовал и геттеры, и сеттеры, но к результату это меня не привело.
Main.java
import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.ServerSocket; public class Main extends ServerThread < public static void main(String args[])< JFrame main_frame = new JFrame(); JPanel main_panel = new JPanel(); main_frame.setSize(600,500); main_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); main_frame.setTitle("MessageBox"); main_frame.add(main_panel); main_panel.setLayout(null); JButton send_button = new JButton("Send"); send_button.setBounds(480,360,80,25); main_panel.add(send_button); JButton menu = new JButton("Menu"); menu.setBounds(480,390,80,25); JFrame frame_menu = new JFrame(); JPanel panel_menu = new JPanel(); main_panel.add(menu); frame_menu.setSize(400,400); frame_menu.setTitle("Menu"); frame_menu.add(panel_menu); panel_menu.setLayout(null); JTextField TX_port = new JTextField(5); TX_port.setBounds(20,20,45,20); panel_menu.add(TX_port); JLabel TX = new JLabel("TX:"); TX.setBounds(1,20,45,20); panel_menu.add(TX); JTextField RX_port = new JTextField(5); RX_port.setBounds(20,50,45,20); panel_menu.add(RX_port); JLabel RX = new JLabel("RX:"); RX.setBounds(1,50,45,20); panel_menu.add(RX); JTextField send_text_field = new JTextField(30); send_text_field.setBounds(20,360,450,25); main_panel.add(send_text_field); JTextArea textArea = new JTextArea(); textArea.setEditable(false); main_panel.add(textArea); JScrollPane textAreaPane = new JScrollPane(textArea); textAreaPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); textAreaPane.setBounds(20,20,540,325); main_panel.add(textAreaPane); /* Вот тут мне нужно получить доступ к переменной recievedData. */ send_button.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent actionEvent) < String sended_data=send_text_field.getText(); String sum = "TX: " + sended_data; textArea.append(sum + "\n"); send_text_field.setText(""); >>); menu.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent actionEvent) < frame_menu.setVisible(true); frame_menu.setLocationRelativeTo(null); >>); main_frame.setVisible(true); main_frame.setLocationRelativeTo(null); > >
SocketThread.java —->ServerThread
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; class ServerThread extends Thread < ServerSocket ss = null; Socket s = null; public ServerThread(ServerSocket sSocket) < ss = sSocket; >public void run() < InputStream is; OutputStream os; try < s = ss.accept(); >catch(Exception ex) < stop(); >System.out.println("Connected."); try < is = s.getInputStream(); os = s.getOutputStream(); while(true) < String recievedData = recvString(is); sendString(os, recievedData); os.flush(); /* Отсюда нужно достать recievedData */ System.out.println(recievedData); if(recievedData.equals("quit")) break; >is.close(); os.close(); > catch(Exception ex) < stop(); >try < s.close(); ss.close(); >catch(Exception ex) < stop(); >> static void sendString(OutputStream os, String s) throws IOException < for(int i = 0; i < s.length(); i++) < os.write((byte)s.charAt(i)); >os.write('\n'); os.flush(); > static String recvString(InputStream is) throws IOException < String szBuf = ""; int ch = is.read(); while (ch >= 0 && ch != '\n') < szBuf += (char)ch; ch = is.read(); >return szBuf; > >
SocketServer
import java.net.*; public class SocketServer < public static void main(String args[]) < System.out.println( "* Socket Server *"); ServerSocket ss = null; try < ss = new ServerSocket(9998); >catch(Exception ex) < System.out.println(ex.toString()); System.exit(0); >int nPort = ss.getLocalPort(); System.out.println( "Local Port: " + nPort); ServerThread sThread = null; sThread = new ServerThread(ss); sThread.start(); System.out.println( "Waiting connection. "); try < sThread.join(); >catch(InterruptedException ex) < System.out.println(ex.toString()); >try < ss.close(); >catch(Exception ex) < System.out.println(ex.toString()); >System.exit(0); > >
SocketClient
package com.ooo; import java.net.*; import java.util.*; import java.io.*; import com.ooo.Main.*; public class SocketClient < public static void main(String args[])< System.out.println( "* Socket Client *"); Socket s = null; try < s = new Socket("localhost", 9999); >catch(Exception ex) < System.out.println(ex.toString()); System.exit(0); >int nPort = s.getLocalPort(); System.out.println("Local Port: " + nPort); InputStream is; OutputStream os; try < is = s.getInputStream(); os = s.getOutputStream(); String transievingData; while(true) < transievingData = getKbdString(); sendString(os, transievingData); os.flush(); if(transievingData.equals("quit")) break; transievingData = recvString(is); System.out.println(transievingData); >is.close(); os.close(); s.close(); > catch(Exception ex) < System.out.println(ex.toString()); >> static void sendString(OutputStream os, String s) throws IOException < for(int i = 0; i < s.length(); i++) < os.write((byte)s.charAt(i)); >os.write('\n'); os.flush(); > static String recvString(InputStream is) throws IOException < String szBuf = ""; int ch = is.read(); while (ch >= 0 && ch != '\n') < szBuf += (char)ch; ch = is.read(); >return szBuf; > static public String getKbdString() < byte bKbd[] = new byte[256]; int iCnt = 0; String szStr = ""; try < iCnt = System.in.read(bKbd); >catch(Exception ex) < System.out.println(ex.toString()); >szStr = new String(bKbd, 0, iCnt); szStr = szStr.trim(); return szStr; > >
Run
package com.ooo; class Run < public static void main(final String . args) throws InterruptedException < Thread one = new Thread(() ->SocketServer.main(args)); Thread two = new Thread(() -> SocketClient.main(args)); one.start(); two.start(); one.join(); two.join(); > >
Отслеживать
Quark-Coder
задан 26 июн 2021 в 23:14
Quark-Coder Quark-Coder
43 9 9 бронзовых знаков
Чтобы получить доступ к переменной, она должна быть как минимум полем какого-либо класса. Но ни как не локальной переменной метода, цикла и пр. Либо можно передать данные с помощью callback-ов. Это типа листенеров. И что-то не заметно, чтобы Ваш треад запускался в работу. Следовательно за его переменными следить бесполезно:)
27 июн 2021 в 3:10
Потоки создаются в своей независимой памяти, поэтому они не имеют доступа к переменным другого класса, который является другим потоком. Для того чтобы передавать данные между потоками нужно создать сервис, который будет вызываться независимо от каждого потока и через него передать требуемые данные. Имплементации этого сервиса не обязательно делать через сокет, например можно использовать буффер, или файл, в худшем случае можно воспользоваться другим сервисом и протоколом обмена. В вашем коде ничего не передается и ничего не принимается, поэтому вы не можете использовать геттеры и сеттеры.
27 июн 2021 в 3:50
@Sergey , SocketThread.java —->ServerThread это продолжение SocketServer, его код я добавил в вопрос.
27 июн 2021 в 8:15
Ясно. Чтобы решить поставленный вопрос, надо сначала решить другие проблемы с Вашей программой или двумя программами. Вообще очень смутно видится, что Вы хотите получить. Main — это графическая оболочка к серверу? Или это графический клиент сервера? Зачем вообще Main extends ServerThread ? extends он может и extends, но никаким образом не связан с реально работающим экземпляром ServerThread, чтобы получать из него данные тем или иным образом.
27 июн 2021 в 8:39
@Sergey , extends — это ещё одна попытка получить данные из переменной =) Сама программа -это p2p связь. Main создаёт графический интерфейс для общения. В то же время запускается SocketServer и SocketClient.
27 июн 2021 в 11:25
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Сначала запустить RunServer , а затем RunClient
Main
import javax.swing.*; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Main < public static String t = "test"; public static String sendtext = ""; public static String text = ""; public static void main(String args[]) < try < UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); >catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e1) < e1.printStackTrace(); >JFrame main_frame = new JFrame(); JPanel main_panel = new JPanel(); main_frame.setSize(600,500); main_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); main_frame.setTitle("MessageBox"); main_frame.add(main_panel); main_panel.setLayout(null); JButton send_button = new JButton("Send"); send_button.setBounds(480,360,80,25); main_panel.add(send_button); JButton menu = new JButton("Menu"); menu.setBounds(480,390,80,25); JFrame frame_menu = new JFrame(); JPanel panel_menu = new JPanel(); main_panel.add(menu); frame_menu.setSize(400,400); frame_menu.setTitle("Menu"); frame_menu.add(panel_menu); panel_menu.setLayout(null); JTextField TX_port = new JTextField(5); TX_port.setBounds(20,20,45,20); panel_menu.add(TX_port); JLabel TX = new JLabel("TX:"); TX.setBounds(1,20,45,20); panel_menu.add(TX); JTextField RX_port = new JTextField(5); RX_port.setBounds(20,50,45,20); panel_menu.add(RX_port); JLabel RX = new JLabel("RX:"); RX.setBounds(1,50,45,20); panel_menu.add(RX); JTextField send_text_field = new JTextField(30); send_text_field.setBounds(20,360,450,25); main_panel.add(send_text_field); JTextArea textArea = new JTextArea(); textArea.setEditable(false); textArea.setFont(new Font(textArea.getFont().getFamily(), Font.BOLD, 15)); main_panel.add(textArea); JScrollPane textAreaPane = new JScrollPane(textArea); textAreaPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); textAreaPane.setBounds(20,20,540,325); main_panel.add(textAreaPane); Thread update = new Thread() < public void run() < while (true) < try < Thread.sleep(100); >catch (InterruptedException e) < >if(!textArea.getText().equals(text)) textArea.setText(text); send_button.setEnabled(!send_text_field.getText().isEmpty()); > >; >; update.start(); send_button.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent actionEvent) < sendtext = send_text_field.getText(); send_text_field.setText(""); >>); menu.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent actionEvent) < frame_menu.setVisible(true); frame_menu.setLocationRelativeTo(null); >>); main_frame.setVisible(true); main_frame.setLocationRelativeTo(null); > >
RunClient
import javax.swing.JOptionPane; public class RunClient < public static void main(final String . args) throws InterruptedException < System.err.println("Frame: "); Thread frame = new Thread(() ->Main.main(null)); frame.start(); String input = JOptionPane.showInputDialog("Username:"); if(input == null || input.isEmpty()) input = "User_" + System.nanoTime(); final String name = input; System.err.println("SocketClient: "); Thread two = new Thread(() -> SocketClient.main(name)); two.start(); two.join(); > >
RunServer
public class RunServer < public static void main(final String . args) throws InterruptedException < System.err.println("Frame: "); Thread frame = new Thread(() ->Main.main(null)); frame.start(); Thread one = new Thread(() -> SocketServer.main(args)); one.start(); one.join(); > >
ServerThread
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; class ServerThread extends Thread < public static String username = ""; public static String text = ""; public static String sendtext = "Test"; ServerSocket ss = null; Socket s = null; public ServerThread(ServerSocket sSocket) < ss = sSocket; >public void run() < InputStream is; OutputStream os; try < s = ss.accept(); >catch(Exception ex) < stop(); >System.out.println("Connected."); try < is = s.getInputStream(); os = s.getOutputStream(); String transievingData; while(true) < sendtext = "" + Main.sendtext; if(Main.sendtext.isEmpty()) sendtext = ""; if(Main.sendtext.equals("quit")) break; Main.sendtext = ""; if(!sendtext.isEmpty()) < System.err.println(sendtext); Main.text += sendtext + "\n"; >transievingData = sendtext; sendString(os, transievingData); os.flush(); transievingData = recvString(is); if(!transievingData.isEmpty()) Main.text += transievingData + "\n"; if(!transievingData.isEmpty()) System.out.println(transievingData); sendtext = ""; // sendtext = Main.sendtext; // Main.sendtext = ""; // // String recievedData = recvString(is); // Main.text += recievedData + "\n"; // sendString(os, recievedData); // os.flush(); // /* // Отсюда нужно достать recievedData // */ // // System.out.println(recievedData); // // if(recievedData.equals("quit")) // break; > is.close(); os.close(); > catch(Exception ex) < stop(); >try < s.close(); ss.close(); >catch(Exception ex) < stop(); >> static void sendString(OutputStream os, String s) throws IOException < for(int i = 0; i < s.length(); i++) < os.write((byte)s.charAt(i)); >os.write('\n'); os.flush(); > static String recvString(InputStream is) throws IOException < String szBuf = ""; int ch = is.read(); while (ch >= 0 && ch != '\n') < szBuf += (char)ch; ch = is.read(); >return szBuf; > >
SocketClient
import java.net.*; import java.io.*; public class SocketClient < public static String username = ""; public static String text = ""; public static String sendtext = "Test"; public static void main(String username) < SocketClient.username = username; System.out.println("* Socket Client *"); Socket s = null; try < s = new Socket(InetAddress.getLocalHost(), 4040); >catch(Exception ex) < ex.printStackTrace(); System.exit(0); >int nPort = s.getLocalPort(); System.out.println("Local Port: " + nPort); InputStream is; OutputStream os; try < is = s.getInputStream(); os = s.getOutputStream(); sendString(os, username + " is join"); String transievingData; while(true) < sendtext = username + ": " + Main.sendtext; if(Main.sendtext.isEmpty()) sendtext = ""; if(Main.sendtext.equals("quit")) < sendString(os, username + " left server"); os.flush(); break; >Main.sendtext = ""; if(!sendtext.isEmpty()) < Main.text += sendtext + "\n"; >transievingData = getKbdString(); sendString(os, transievingData); os.flush(); transievingData = recvString(is); if(!transievingData.isEmpty()) Main.text += transievingData + "\n"; if(!transievingData.isEmpty()) System.out.println(transievingData); sendtext = ""; // transievingData = getKbdString(); // if(!sendtext.isEmpty()) < // System.out.println(sendtext); // if(sendtext.toUpperCase().equals("EXIT")) < // sendString(os, "Client left server"); // break; // >// sendString(os, sendtext); // sendtext = ""; //// os.flush(); // > // // transievingData = recvString(is); // > is.close(); os.close(); s.close(); > catch(Exception ex) < ex.printStackTrace(); >System.exit(0); > static void sendString(OutputStream os, String s) throws IOException < for(int i = 0; i < s.length(); i++) < os.write((byte)s.charAt(i)); >os.write('\n'); os.flush(); > static String recvString(InputStream is) throws IOException < String szBuf = ""; int ch = is.read(); while (ch >= 0 && ch != '\n') < szBuf += (char)ch; ch = is.read(); >return szBuf; > static public String getKbdString() < // byte bKbd[] = new byte[256]; // int iCnt = 0; // String szStr = ""; // // try < // iCnt = System.in.read(bKbd); // >catch(Exception ex) < // System.out.println(ex.toString()); // >// // szStr = new String(bKbd, 0, iCnt); // szStr = szStr.trim(); return sendtext; > >
SocketServer
import java.net.*; public class SocketServer < public static void main(String args[]) < System.out.println("* Socket Server *"); ServerSocket ss = null; try < ss = new ServerSocket(4040); >catch(Exception ex) < ex.printStackTrace(); System.exit(0); >int nPort = ss.getLocalPort(); System.out.println("Local Port: " + nPort); ServerThread sThread = null; sThread = new ServerThread(ss); sThread.start(); System.out.println("Waiting connection. "); try < sThread.join(); >catch(InterruptedException ex) < ex.printStackTrace(); >try < ss.close(); >catch(Exception ex) < ex.printStackTrace(); >System.exit(0); > >
src: > Main.java > RunClient.java > RunServer.java > ServerThread.java > SocketClient.java > SocketServer.java