
Программирование на java / Метод. ук. к л. р / Метод. ук. к л. р. 4
.docСТО АлтГТУ 13.62.1.0667-2011
Лабораторная работа №4.
Классы файловых потоков. Обработка исключений
Цель работы: получить практические навыки записи объектов в файл и чтения объектов из файла, а также научиться создавать и использовать классы исключений.
В листинге 4.1 представлена программа, которая рассчитывает координаты для перемещения на плоскости геометрических фигур круг и треугольник. Для треугольника также выполняется масштабирование, а для круга – вычисление его площади. В программе описан абстрактный класс shape и на его основе производные классы – треугольник и круг. Класс ErrorTreug используется для обработки исключения, возникающего в случае неверного задания длин сторон треугольника. В программе показана запись объектов класса треугольник в файл и чтение их из файла с использованием механизма сериализации. Программа выполнена в NetBeans IDE 7.3.1.
На рис. 4.1. показан состав проекта программы. Рисунок 4.2 демонстрирует результат выполнения программы
Рисунок 4.1 – Состав проекта программы
Листинг 4.1
// Shape.java
package shape;
import java.io.Serializable;
// базовый класс фигура
public abstract class Shape implements Serializable
{ protected String type;
public Shape() { }
public Shape(String t) { type = t; }
public String GetShape() { return type; }
public abstract void Move(double x1, double y1);
}
// Treug.java
package shape;
// производный класс треугольник
public class Treug extends Shape
{ private double x, y, z;//длины сторон
public Treug(){ }
public Treug(String t, double x1, double y1, double z1) throws ErrorTreug
{ super(t);
if (x1>=y1+z1) throw new ErrorTreug(this.GetShape(),"Сторона А");
if (y1>=x1+z1) throw new ErrorTreug(this.GetShape(),"Сторона В");
if (z1>=x1+y1) throw new ErrorTreug(this.GetShape(),"Сторона С");
else
{x = x1; y = y1; z = z1;}
}
public String toString()
{ return type + ". Длины сторон: a = " + x + ", b = " + y + ", c = " + z;
}
//переопределение метода Move
public void Move(double x1, double y1)
{ String msg = "";
if ((x1 > 0) && (y1 > 0))
msg = "Треугольник передвинули на "
+ x1 + " вправо и на "+ y1 + " вниз";
if ((x1 > 0) && (y1 < 0))
msg = "Треугольник передвинули на "
+ x1 + " вправо и на " + Math.abs(y1) + " вверх";
if ((x1 < 0) && (y1 < 0))
msg = "Треугольник передвинули на " + Math.abs(x1)
+ " влево и на " + Math.abs(y1) + " вверх";
if ((x1 < 0) && (y1 > 0))
msg = "Треугольник передвинули на " + Math.abs(x1)
+ " влево и на " + Math.abs(y1) + " вниз";
System.out.println(type.toUpperCase()+ ". Результат перемещения: "
+ msg);
}
public void Scale(double f)//Масштабирование
{ x *= f; y *= f; z *= f;
String msg = "Новые длины сторон: " + x + " "
+ y + " " + z + " ";
System.out.println(type + ". Результат масштабирования: "
+ msg);
}
public double GetX() { return x; }
public double GetY() { return y; }
public double GetZ() { return z; }
}
// ErrorTreug.java
package shape;
//класс исключений
public class ErrorTreug extends Exception
{//название треугольника
private String name;
//неправильная сторона треугольника
private String side;
public ErrorTreug(){}
public ErrorTreug(String n, String s)
{name = n; side = s;}
public String toString()
{ String st="";
String s = getClass().getName();
if (side.equals("Сторона А")) st =" !!! Перезадайте сторону А";
if (side.equals("Сторона В")) st =" !!! Перезадайте сторону В";
if (side.equals("Сторона С")) st =" !!! Перезадайте сторону С";
return s + ": " + " Невозможно построить " + name + st;
}
}
// Circle.java
package shape;
// производный класс круг
public class Circle extends Shape
{ private double x, y, r;
public Circle(){ }
public Circle(String t, double x1, double y1, double r1)
{ super(t); x = x1; y = y1; r = r1; }
public String toString()
{return type + ". Координаты центра: x = " + x + ", y = " + y + ", r = " + r;
}
//переопределение метода Move
public void Move(double x1, double y1)
{ x += x1; y += y1;
String msg = "Новые координаты центра " + x + " " + y;
System.out.println(type + ". Результат перемещения: " + msg);
}
public double GetSquare()//вычисление площади
{ return Math.PI * Math.pow(r, 2); }
}
// JavaApplication4.java
package javaapplication4;
import shape.*;
import java.util.Scanner;
import java.io.*;
public class JavaApplication4
{ public static void main(String[] args)throws IOException
{ int pr;
double t1, t2, t3, t4, t5, t6;
System.out.println("1 - Задать круг");
System.out.println("2 - Задать треугольник");
Scanner in = new Scanner(System.in);
pr = in.nextInt();
Shape fig1, fig2,fig3;
Circle Cr1; //окружность
Treug Tr1; //треугольник
if (pr == 1)
{ System.out.println("Вв. координату центра x:");
t1 = in.nextDouble();
System.out.println("Вв. координату центра y:");
t2 = in.nextDouble();
System.out.println("Вв. радиус круга:");
t3 = in.nextDouble();
fig1 = new Circle("Окружность", t1, t2, t3);
System.out.println(fig1);
System.out.println("Передвинуть на x:");
t4 = in.nextDouble();
System.out.println("Передвинуть на y:");
t5 = in.nextDouble();
fig1.Move(t4, t5);
if(fig1 instanceof Circle)
{ Cr1=(Circle)fig1;
System.out.println(fig1.GetShape()+ ". Площадь: " + Cr1.GetSquare());}
}
if (pr == 2)
{ try
{
System.out.println("Вв. сторону a:");
t1 = in.nextDouble();
System.out.println("Вв. сторону b:");
t2 = in.nextDouble();
System.out.println("Вв. сторону c:");
t3 = in.nextDouble();
fig2 = new Treug("Треугольник", t1, t2, t3);
System.out.println(fig2);
FileOutputStream fos = new FileOutputStream("E:\\output.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(fig2);
oos.close();
System.out.println("Read object:");
FileInputStream fis = new FileInputStream("E:\\output.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
fig3 = (Treug)ois.readObject();
ois.close();
System.out.println(fig3);
System.out.println("Передвинуть на x:");
t4 = in.nextDouble();
System.out.println("Передвинуть на y:");
t5 = in.nextDouble();
System.out.println("Масштаб:");
t6 = in.nextDouble();
fig2.Move(t4, t5);
if(fig2 instanceof Treug)
{ Tr1=(Treug)fig2; Tr1.Scale(t6);}
}
catch (ErrorTreug e) { System.out.println(e);}
catch(ClassNotFoundException e) { e.printStackTrace(); }
catch(IOException e) { e.printStackTrace(); }
}
}
}
Рисунок 4.2 – Результат выполнения программы
Задание
Изменить программу индивидуального варианта лаб. работы. №3 (задание 1): создать класс исключений из индивидуального варианта, сгенерировать и обработать исключение этого класса в процессе выполнения программы. Обработчик исключения должен предлагать исправить возникшую ошибку. В программе реализовать возможность записи объектов в файл и чтения объектов из файла и предусмотреть обработку возникающих при этом исключительных ситуаций.
-
Класс, генерирующий и обрабатывающий исключения при попытке создать отрезок нулевой длины.
-
Класс, генерирующий и обрабатывающий исключения при попытке создать многочлен нулевой степени.
-
Класс, генерирующий и обрабатывающий исключения при попытке создать журнал с пустым наименованием или адресом.
-
Класс, генерирующий и обрабатывающий исключения при попытке создать дом с неверным годом постройки
-
Класс, генерирующий и обрабатывающий исключения при попытке задать отрицательный объём HDD
-
Класс, генерирующий и обрабатывающий исключения при попытке задать объём двигателя меньше 1 литра.
-
Класс, генерирующий и обрабатывающий исключения при попытке выполнить «закачку» информации, если «отсутствует Bluetooth/IR».
-
Класс, генерирующий и обрабатывающий исключения при попытке создать книгу с незаданным автором
-
Класс, генерирующий и обрабатывающий исключения при постановке в очередь на печать более 10 документов
-
Класс, генерирующий и обрабатывающий исключения при попытке установить режим работы во время отсутствия подключения
-
Класс, генерирующий и обрабатывающий исключения в ситуации когда замечаний в 2 раза больше чем поощрений.
-
Класс, генерирующий и обрабатывающий исключения в ситуации когда абитуриент не сможет поступить ни на одну из специальностей.
-
Класс, генерирующий и обрабатывающий исключения в ситуации когда в зачётке одни двойки.
-
Класс, генерирующий и обрабатывающий исключения при попытке убрать паруса, если они уже убраны.