ЕВ-4791
.pdffFormulary.add(theTMedication);
//Об’єкти theTokenizer і TMedication нам більш не потрібні
//Пізніше вони будуть знищені підпрограмами збірки сміття
}
//Закриття файла на диску theStream.close();
}
//Виняткова ситуація FileNotFound є різновидом виняткової cитуації
//IOException. ІІ слід перехоплювати до перехоплення виняткової cитуації
//Exception загального типу
catch (java.io.FileNotFoundException e) { System.err.println(e.getMessage()); e.printStackTrace();
}
catch (java.io.IOException e) { System.err.println(e.getMessage()); e.printStackTrace();
}
}
protected static void show(String theKey)
{
//Для одного значення ключа може бути декілька рядків. Обираємо всі java.util.Iterator theIterator = fFormulary.iterator();
short theCount = 0;
while (theIterator.hasNext())
{
TMedication nextTMedication = (TMedication) theIterator.next(); if ( nextTMedication.fDrugName.equals(theKey))
{
System.out.println (nextTMedication.toString()); theCount++;
}
}
if (theCount == 0)
System.out.println(“У формулярі відсутня інформація про ” + theKey);
}
protected static void show()
{
//Відображення усіх рядків формуляра
java.util.Iterator theIterator = fFormulary.iterator(); while (theIterator.hasNext())
System.out.println (theIterator.next().toString());
}
public String toString()
{
return fDrugName + “ ” + fStrength.toString() + “mg” +fPackage;
}
} |
|
ПРИКЛАД 1. |
|
Finally завжди виконується |
} |
class FourException extends Exception { |
|
public class AllwaysFinally { |
{ |
public static void main(Sting[] args) |
System.out.println(“Входимо в перший блок try” ); try {
System.out.println(“Входимо в другий блок try” ); try {
71
throw new FourException();
}
finally {
System.out.println(“finally в другий блок try” );
}
} catch (FourException e) { System.err.println(“Перехоплено FourException в першому блоці
try” );
} finally {
System.err.println(“finally в першому блоці try” );
}
} }
ПРИКЛАД 2. (Обмеження винятків).
Перевизначені методи можуть збуджувати тільки винятки, що описані у версії базового класу чи винятки, які успадковані від винятків базового класу
class BaseballException extends Exception |
{ } |
|
class Foul extends BaseballException { |
} |
} |
class Strike extends BaseballException |
{ |
|
abstract class Inning { |
|
|
Inning() throws BaseballException {
//Фактично збуджувати виняток не потрібно
}
abstract void atBat() throws Strike, Foul; |
|
|
void walk() { } //Нічого не збуджує |
|
|
} |
{ |
} |
class StormException extends Exception |
||
class RainedOut extends StormException |
{ |
} |
class PopFoul extends Foul { } interface Storm {
void event() throws RainedOut; void rainHard() throws RainedOut;
}
public class StormyInning extends Inning implements Storm {
//Можна додати нові винятки для конструкторів, але треба мати //на увазі й винятки базового конструктора:
StormyInning() throws RainedOut, BaseballException { }
StormyInning(String s) throws Foul, BaseballException { }
// Звичайні методи повинні відповідати базовим:
//! void walk() throws PopFoul { } // Помилка компіляції
//Інтерфейс не МОЖЕ додавати винятки до існуючих методів
//базового класу:
//! void event() throws RainedOut { }
//Якщо метод не був визначений в базовому класі, то виняток
//дозволяється:
public void rainHard() throws RainedOut { }
//Перевизначені методи можуть збуджувати успадковані //винятки: public void event() { }
void atBat() throws PopFoul { }
public static void main(Sting[] args) { try {
StormyInning si = new StormyInning(); si.atBat();
}catch (PopFoul e) { System.err.println(“Pop foul”);
}catch (RainedOut e) {
72
System.err.println(“Rained out”); } catch (RainedOut e) {
System.err.println(“Типова помилка”);
}
// Strike не збуджується в успадкованій версії
try { //Що відбудеться при східному перетворенні?
Inning i = new StormyInning(); i.atBat();
//Ви повинні перехоплювати визначення з базової версії методу:
}catch (Strike e) { System.err.println(“Strike ”);
}catch (Foul e) { System.err.println(“Foul”);
}catch (RainedOut e) { System.err.println(“Rained out”);
}catch (BaseballException e) { System.err.println(“Типовий виняток”);
}
}
}
12.5. Індивідуальне завдання для опрацювання теми
ПРИКЛАД 1. import java.io.*; class InputFile {
private BufferedReader in; InputFile(String fname) throws Exception { try {
in = new BufferedReader(new FileReader(fname));
//Код, який спроможний на виняток
}catch (FileNotFoundException e) { System.err.println(“Неможливо відкрити ” + fname); throw e;
}catch (Exception e) {
try { in.close();
}catch (IOException e2) { System.err.println(“in.close() виконаний невдало”);
throw e; //Повторне збудження
}finally {
//Не закривайте файл тут!!!
}
}
String getLine() { String s;
try {
s = in.readLine();
}catch (IOException e) { System.err.println(“readLine() виконаний невдало”); s = “Помилка”;
return s;
void cleanup() { try {
in.close();
}catch (IOException e2) {
73
System.err.println(“in.close() виконаний невдало”);
}
}
}
public class Cleanup {
public static void main(Sting[] args) { try {
InputFile in = new InputFile(“Cleanup.java”); String s;
int i = 1;
while((s = in.getLine()) != null) System.out.println(“”+ i++ + “: “ + s); in.cleanup();
} catch (Exception e) {
System.err.println(“Перехоплено в main, e.printStackTrace()”); e.printStackTrace(System.err);
}
}
}
ПРИКЛАД 2. import java.io.*;
class ShowFile {
public static void main(String args[]) {
{
int i; FileInputStream fin;
//Переконатися, що файл вказаний if (args.length != 1) {
System.out.println(“ Usage: ShowFile File”); return;
}
try {
//Відкриття файла
fin = new FileInputStream(args[0]);
} catch (FileNotFoundException exc) { System.out.println(“ File Not Found”); return;
}
try {
//Читання файла до отримання ЕОF do {
//Читання з файла i = fin.read();
if(i != -1) System.out.print((char) i);
// Значення -1
//
}while(i != -1);
}catch (IOException exc) { System.out.println(“ Error reading file.”);
}
try {
//Закриття файла fin.close();
} catch (IOException exc) { System.out.println(“ Error reading file.”);
}
}
}
74
ПРИКЛАД 3. import java.io.*;
class CopyFile {
public static void main(String args[]) {
{
int i; FileInputStream fin;
FileOutputStream fout;
//Переконатися, що файл вказаний if (args.length != 2) {
System.out.println(“Usage: CopyFile From To”); return;
}
try {
//Відкриття файла
fin = new FileInputStream(args[0]);
} catch (FileNotFoundException exc) { System.out.println(“File Not Found”); return;
}
try {
// Відкриття файла
fout = new FileOutputStream(args[1); } catch (FileNotFoundException exc) {
System.out.println(“Error Opening Output File”); try {
//Закриття файла fin.close();
} catch (IOException exc2) { System.out.println(“Error closing input file.”);
}
return;
}
try {
//Читання файлу до отримання ЕОF do {
//Читання з файла i = fin.read();
if(i != -1) fout.write (i);
}while(i != -1);
}catch (IOException exc) { System.out.println(“ Error file.”);
}
try { fin.close();
} catch (IOException exc) { System.out.println(“Error closing output file.”);
}
try { fout.close();
} catch (IOException exc) { System.out.println(“Error closing output file.”);
}
}
}
ПРИКЛАД 4.
/* В цій версії програми оператор try з ресурсами використовується для автоматичного закриття файлу, коли він вже більш не потрібен.
75
Для компіляції необхідне JDK 7. */ import java.io.*;
class ShowFile1 {
public static void main(String args[]) {
{
int i;
// Переконатися, що файли вказані if (args.length != 1) {
System.out.println(“Usage: ShowFile filename”); return;
}
try (FileInputStream fin = new FileInputStream(args[0])) { //Блок оператора try з ресурсами
do {
i = fin.read();
if(i != -1) fout.write (i);
}while(i != -1);
}catch (IOException exc) { System.out.println(“ Error file.”);
}
}
}
ПРИКЛАД 5. import java.io.*;
class RWData {
public static void main(String args[]) {
{
int i=10;
double d = 1023.56; boolean b = true;
// Записати ряд значень
try (DataOutputStream dataOut = new DataOutputStream(new DataOutputStream(“testdata”)))
{
System.out.println(“ Writing ” + i); dataOut.writeInt(i); System.out.println(“ Writing ” + d); dataOut. writeDouble (d); System.out.println(“ Writing ” + b); dataOut. writeBoolean (b);
System.out.println(“ Writing ” + 12.2 * 7.4); dataOut. writeDouble (12.2 * 7.4);
}
catch (IOException exc) { System.out.println(“ Write Error.”);
return;
}
System.out.println();
try (DataInputStream dataOut = new DataInputStream(new DataInputStream(“testdata”))) { // Читання двоїстих даних з файлу
i = dataIn.readInt(); System.out.println(“Reading” + i); d = dataIn.readDouble(); System.out.println(“Reading” + d); b = dataIn.readBoolean(); System.out.println(“Reading” + b); d = dataIn.readDouble (); System.out.println(“Reading” + d);
}
76
catch (IOException exc) { System.out.println(“ Read Error.”);
}
}
}
ПРИКЛАД 6. import java.io.*;
class RandomAccessDemo {
public static void main(String args[]) {
double data[] = {19.4, 10.1, 123.54, 33.0, 87.9, 74.25}; double d;
try (RandomAccessFile raf = new RandomAccessFile(”random.dat”, “rw”))
{
//
for(int i=0; i < data.length; i++) { raf.writeDouble(data[i]);
}
raf.seek(0);
d = raf.readDouble(); System.out.println(“First value is” + d); raf.seek(8);
d = raf.readDouble(); System.out.println(“Second value is” + d); raf.seek(8*3);
d = raf.readDouble(); System.out.println(“Fourth value is” + d); System.out.println();
System.out.println(“Here is every other value: ”); for(int i=0; i < data.length; i+=2) {
raf.seek(8*i);
d = raf.readDouble(); System.out.print(d + “ ”);
}
}
catch (IOException exc) { System.out.println(“ I/O Error: ” + exc);
}
}
}
Рекомендована література [3-6; 9-12].
77
Тема 13. МЕХАНІЗМИ СТВОРЕННЯ ВІКОН ТА АПЛЕТІВ
Вивчивши матеріали теми, студенти знатимуть:
характеристику і структуру аплета;
визначення і використання інструментів Appletviewer;
механізми запуску аплетів;
технологію опрацювання подій;
шляхи формування багаторядкових текстових полів;
процедури управління розміщенням компонентів;
модель подій бібліотеки Swing;
каталог компонентів бібліотеки Swing;
процеси організації компонентів.
Вивчення матеріалу теми допоможе студентам:
•створювати різноманітні компоненти;
•визначати характеристики зовнішнього вигляду інтерфейсу;
•формувати динамічне зв’язування подій;
•розрізняти обчислення і користувацький інтерфейс;
•управляти розміщенням компонентів;
•закріпляти дії, що виконують процеси зв’язування подій.
13.1.Навчальні завдання для виконання практичної роботи
Мета роботи: сформувати практичні навички з конструкції аплетів, основних компонентів користувацького інтерфейсу та визначити технологію складання і виконання фрагментів програм різноманітної структури.
План
1.Простий аплет: обмеження аплетів, переваги аплетів, каркаси додатків.
2.Запуск аплетів у Web-броузері. Використання інструменту Appletviewer.
3.Тестування аплетів. Запуск аплетів з командного рядка. Інструмент для показу програм на екрані.
4.Використання Провідника Windows. Створення кнопки.
5.Обробка подій. Багатострокові текстові поля.
6.Управління розташуванням компонентів.
7.Полярне, послідовне, табличне, абсолютне і блокове розташування.
8.Модель подій бібліотеки Swing: типи подій, опрацювання кількох подій одночасно.
9.Каталог компонентів бібліотеки Swing: кнопки, значки, підказки, рамки, флажки, комбіновані списки тощо.
13.2.Завдання і послідовність виконання лабораторної роботи
Індивідуальне виконання лабораторної роботи кожним студентом передбачає закріплення теоретичних знань.
Лабораторна робота
«Організація формування вікон та аплетів мовою Java»
Мета роботи. Навчитися складати і виконувати в середовищі Java форми меню, вікон і аплетів з конкретної обраної теми.
Шляхи досягнення мети. Вивчити теми 8-10 програми дисципліни.
Вивчити технологію програмування меню, вікон, кнопок, аплетів у середовищі Java. Скласти фрагмент програми за обраною темою з одним або більше вікнами чи аплетом. Виконати програму на комп’ютері. Скласти звіт і захистити його.
1.За допомогою будь-якого редактора текстів чи блокнота сформувати готовий приклад аплета, завдання якого запропонує викладач (приклади завдань 1-14 розміщено далі).
2.Виконати компіляцію створеного файла. За наявності повідомлень про помилки виправити останні й запустити скоригований файл на повторну компіляцію.
78
3.Запустити аплет через командний рядок або в браузері. Форми його подання є результатами дії створеного аплета. У разі виникнення різноманітних повідомлень помилкового характеру скористатися опціями й іншими додатковими інструментами.
4.За результатами виконання лабораторної роботи скласти звіт, що має включати:
1)титульну сторінку встановленого зразка (додаток 1);
2)на першій сторінці слід розмістити:
назву роботи;
мету лабораторної роботи;
шляхи виконання лабораторної роботи (розширений план поетапного виконання роботи);
3)сторінки від 2-ї …, мають містити:
перелік усіх повідомлень виконання прикладу 1 та опис їх;
перелік усіх повідомлень прикладу 2 та їх конкретний опис й умови застосування;
текст власно розробленого аплета (якщо власна програма відсутня, цей пункт не зазначають);
текст або тексти програм мовою Java, які запропоновані викладачем.
Приклади завдань для виконання лабораторної роботи
Приклад 1. Міні-редактор
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*;
public class TextPane extends JApplet{ JButton b = new JButton("Додати текст"); JTextPane tp = new JTextPane();
static Generator sg = new Arrays2.RandStringGenerator(7);
public void init(){ b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){ for(int i=0; i<10;i++)
tp.setText(tp.getText() + sg.next() + "\n");
}
});
Container cp = getContentPane(); cp.add(new JScrollPane(tp)); cp.add(BorderLayout.SOUTH,b);
}
public static void main(String[] args){ Console.run(new TextPane(),475,425);
}
}
(Текст пакета com.bruceeckel.swing.*) class Console {
// Create a title string from the class name: public static String title(Object o) { String t = o.getClass().toString();
// Remove the word "class": if(t.indexOf("class") != -1) t = t.substring(6);
return t;
}
public static void
run(JFrame frame, int width, int height) { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
79
frame.setSize(width, height); frame.setVisible(true);
}
public static void
run(JApplet applet, int width, int height) { JFrame frame = new JFrame(title(applet));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(applet);
frame.setSize(width, height); applet.init();
applet.start();
frame.setVisible(true);
}
public static void
run(JPanel panel, int width, int height) { JFrame frame = new JFrame(title(panel));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(panel);
frame.setSize(width, height); frame.setVisible(true);
}
}
(Частина пакета com.bruceeckel.util.*) class Arrays2 {
public static String toString(boolean[] a) { StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) { result.append(a[i]);
if(i < a.length - 1) result.append(", ");
}
result.append("]"); return result.toString();
}
public static String toString(byte[] a) { StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) { result.append(a[i]);
if(i < a.length - 1) result.append(", ");
}
result.append("]"); return result.toString();
}
public static String toString(char[] a) { StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) { result.append(a[i]);
if(i < a.length - 1) result.append(", ");
}
result.append("]"); return result.toString();
}
public static String toString(short[] a) { StringBuffer result = new StringBuffer("[");
for(int i = 0; i < a.length; i++) { result.append(a[i]);
80
