<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://mit.spbau.ru/sewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Snurk</id>
		<title>SEWiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://mit.spbau.ru/sewiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Snurk"/>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Snurk"/>
		<updated>2026-06-10T00:46:56Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2483</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2483"/>
				<updated>2013-05-22T22:46:49Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Лекции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Условия получения зачета ==&lt;br /&gt;
&lt;br /&gt;
Зачет автоматом (оценка - отлично):&lt;br /&gt;
#Азаров Андрей&lt;br /&gt;
#Карташев Дмитрий&lt;br /&gt;
#Козятинский Алексей&lt;br /&gt;
#Ломшаков Вадим&lt;br /&gt;
#Орлов Андрей&lt;br /&gt;
#Пивоваров Алексей&lt;br /&gt;
#Савенко Сергей&lt;br /&gt;
#Шабалин Александр&lt;br /&gt;
&lt;br /&gt;
Зачет полуавтоматом (подойти и обсудить с АМ условия получения зачета)&lt;br /&gt;
#Гулецкий Артур&lt;br /&gt;
#Мартынов Семен&lt;br /&gt;
#Таланов Павел&lt;br /&gt;
&lt;br /&gt;
Общие условия получения зачета - зачесть контрольную работу (для этого договориться с АМ о том, когда ее написать), сдать 9 лабораторных работ, устно побеседовать с преподавателем. Итоговая оценка будет ставиться исходя из количества набранных баллов и ваших ответов в устной беседе.&lt;br /&gt;
&lt;br /&gt;
Примерное количество баллов&lt;br /&gt;
#на оценку удовлетворительно - 50&lt;br /&gt;
#на оценку хорошо - 60&lt;br /&gt;
#на оценку отлично - 70&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
*[[Java_2013-02-08|Лекция 1]]&lt;br /&gt;
*[[Медиа:Java_2013_02.ppt|Лекция 2]]&lt;br /&gt;
*[http://neerc.ifmo.ru/~kgeorgiy/courses/java-advanced/slides/exceptions.pps Лекция 3 (часть 1)]&amp;lt;br&amp;gt;[[Медиа:Java_2013_03_2.ppt|Лекция 3 (часть 2)]]&lt;br /&gt;
*[[Java_2013-02-27|Лекция 4]]&lt;br /&gt;
*[[Медиа:Java_2013_05.ppt|Лекция 5 (часть 2)]]&lt;br /&gt;
*[[Медиа:Java_2013_05-2.ppt|Лекция 6]]&lt;br /&gt;
*[[Медиа:Java_2013_06.ppt|Лекция 7 (Reflection)]]&lt;br /&gt;
*[[Медиа:Java_2013_08.ppt|Лекция 8 (Многопоточное программирование)]]&lt;br /&gt;
*[[Медиа:Java_2013_09.ppt|Лекция 9 (java.util.concurrent)]]&lt;br /&gt;
*[[Java_Swing_2013|Лекция 10]]&lt;br /&gt;
*[[Java_Serialization_2013|Лекция 11]]&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/d/db/Java_hmw_2013_03_06.pdf Третье задание] срок сдачи: 06 марта&lt;br /&gt;
* [[Java_2013_HW4|Четвертое задание]] срок сдачи: 13 марта&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c4/Java_hmw_2013_03_20.pdf Пятое задание] срок сдачи: &amp;lt;b&amp;gt;продлен до 27 марта&amp;lt;/b&amp;gt;&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/79/Java_hmw_2013_04_03.pdf Шестое задание] срок сдачи: 3 апреля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/f/fb/Java_hmw_2013_04_10.pdf Седьмое задание] срок сдачи: 10 апреля&lt;br /&gt;
* [[Java 2013 CW1|Контрольная работа]]&lt;br /&gt;
* [[Java_2013_HW8|Восьмое задание]] срок сдачи: 17 апреля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/4/4c/Java_hmw_2013_9.pdf Девятое задание] срок сдачи 1 мая &amp;lt;b&amp;gt;или&amp;lt;/b&amp;gt; [http://mit.spbau.ru/sewiki/images/7/75/Java_2013_10.pdf Десятое задание] срок сдачи 15 мая и вес &amp;lt;b&amp;gt;20 баллов&amp;lt;/b&amp;gt;. Десятое задание для тех, кто хотел поприменять java.util.concurrent (предупреждение: вам потребуется самостоятельно немного почитать про сеть, сокеты и т.п. )&lt;br /&gt;
* [[Java_2013_HW10|Одиннадцатое задание]] срок сдачи 12 мая&lt;br /&gt;
* [[Java 2013 CW2|Контрольная работа - 2]]&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве точки входа должен использоваться класс с именем &amp;lt;b&amp;gt;Main&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* Перехват исключений слишком общeго типа&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2482</id>
		<title>Java Serialization 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2482"/>
				<updated>2013-05-22T13:21:26Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Лекция о сериализации в Java. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что почитать ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11&lt;br /&gt;
* [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java Object Serialization Specification]&lt;br /&gt;
&lt;br /&gt;
== Материалы лекции ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/****Введение****/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * &lt;br /&gt;
 * Сериализация -- запись объекта в байтовый поток.&lt;br /&gt;
 * &lt;br /&gt;
 * Десереализация -- CO.&lt;br /&gt;
 * &lt;br /&gt;
 * Все в пакете java.io&lt;br /&gt;
 * &lt;br /&gt;
 * Мотивация:&lt;br /&gt;
 *  1. dump (ex. JavaBeans persistence)&lt;br /&gt;
 *  2. RMI&lt;br /&gt;
 */&lt;br /&gt;
class Point {&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * В простейшем случае достаточно добавить маркерный интерфейс implements&lt;br /&gt;
 * Serializable&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
class Point1 implements Serializable {&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
&lt;br /&gt;
    Point1(double x, double y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class SimplePointTest {&lt;br /&gt;
    void SimpleWrite(OutputStream os) throws /*NotSerializableException,*/ IOException {&lt;br /&gt;
        Point1 p = new Point1(10., 10.);&lt;br /&gt;
        ObjectOutput out = new ObjectOutputStream(os);&lt;br /&gt;
        out.writeObject(p);&lt;br /&gt;
        os.flush();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void SimpleRead(InputStream is) throws IOException, ClassNotFoundException {&lt;br /&gt;
        ObjectInput in = new ObjectInputStream(is);&lt;br /&gt;
        Point1 p = (Point1) in.readObject();&lt;br /&gt;
        System.out.println(&amp;quot;x=&amp;quot; + p.x);&lt;br /&gt;
        System.out.println(&amp;quot;y=&amp;quot; + p.y);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void SimpleTest() throws FileNotFoundException, IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        try (OutputStream os = new FileOutputStream(&amp;quot;point.ser&amp;quot;)) {&lt;br /&gt;
            SimpleWrite(os);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        try (InputStream is = new FileInputStream(&amp;quot;point.ser&amp;quot;)) {&lt;br /&gt;
            SimpleRead(is);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/****Процесс сериализации****/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * В сериализации участвуют ВСЕ достижимые объекты.&lt;br /&gt;
 * &lt;br /&gt;
 * Запись:&lt;br /&gt;
 *  1. Запись предка (если он сериализуем)&lt;br /&gt;
 *  2. Запись полей (если они сериализуемы)&lt;br /&gt;
 * &lt;br /&gt;
 * Циклические зависимости корректно обрабатываются автоматически.&lt;br /&gt;
 * &lt;br /&gt;
 * Чтение:&lt;br /&gt;
 *  1. Выделение памяти под объект&lt;br /&gt;
 *  2. Чтение предка&lt;br /&gt;
 *  3. Чтение полей&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Все поля должны быть сериализуемы!&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
class Polygon implements Serializable {&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;Point3&amp;gt; vertices = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Пока все просто, но впечатление обманчиво!&lt;br /&gt;
 * &lt;br /&gt;
 * 1. Внутреннее представление становится частью интерфейса&lt;br /&gt;
 *      Инкапсуляция летит к чертям!&lt;br /&gt;
 * 2. Увеличивает объемы тестирования новых версий&lt;br /&gt;
 * 3. Дополнительный конструктор! &lt;br /&gt;
 *      Необходимо обеспечивать все инварианты&lt;br /&gt;
 *      Некоторые дыры в безопасности&lt;br /&gt;
 * 4. Все потомки становятся сериализуемыми!&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/****Управление сериализацией****/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Serial version UID (stream unique identifier)&lt;br /&gt;
 * &lt;br /&gt;
 * Применяется для обеспечения совместимости, когда версии класса изменяются&lt;br /&gt;
 * &lt;br /&gt;
 * По-умолчанию автоматически создается на основе имени, интерфейсов, &lt;br /&gt;
 * public и protected полей&lt;br /&gt;
 * &lt;br /&gt;
 * В случае несовпадения -- InvalidClassException&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
class Point2 implements Serializable {&lt;br /&gt;
    private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Модификатор transient.&lt;br /&gt;
 * Исключает поле из процесса сериализации.&lt;br /&gt;
 * Примеры:&lt;br /&gt;
 *  1. Избыточная информация (предподсчитанные значения)&lt;br /&gt;
 *  2. Несериализуемые поля&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
class Point3 implements Serializable {&lt;br /&gt;
    private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
    transient int precomputedHash;&lt;br /&gt;
    &lt;br /&gt;
    public int hashCode() {&lt;br /&gt;
        return precomputedHash;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private int countHash() {&lt;br /&gt;
        //some very involved procedure&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Point3(double x, double y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
        precomputedHash = countHash();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Настраиваемая сериализация &lt;br /&gt;
 * Методы &lt;br /&gt;
 *  readObject(ObjectInputStream in) -- должен прочесть состояние из потока &lt;br /&gt;
 *  writeObject(ObjectOutputStream out) -- должен записать состояние в поток&lt;br /&gt;
 * &lt;br /&gt;
 * Процесс чтения&lt;br /&gt;
 *  1. Выделение памяти&lt;br /&gt;
 *  2. Вызов readObject&lt;br /&gt;
 *  &lt;br /&gt;
 */&lt;br /&gt;
class Point4 implements Serializable {&lt;br /&gt;
    private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
    &lt;br /&gt;
    transient int precomputedHash;&lt;br /&gt;
    &lt;br /&gt;
    public int hashCode() {&lt;br /&gt;
        return precomputedHash;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private int countHash() {&lt;br /&gt;
        //some very involved procedure&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Point4(double x, double y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
        precomputedHash = countHash();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
     * Отвечает только за запись полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
     */&lt;br /&gt;
    private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
        /*&lt;br /&gt;
         * Реализует стандартный механизм сериализации.&lt;br /&gt;
         * Может вызываться только из writeObject, иначе NotActiveException&lt;br /&gt;
         */&lt;br /&gt;
        s.defaultWriteObject();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //отвечает только за чтение полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
    private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        /*&lt;br /&gt;
         * Реализует стандартный механизм десериализации.&lt;br /&gt;
         * Может вызываться только из readObject, иначе NotActiveException&lt;br /&gt;
         */&lt;br /&gt;
        s.defaultReadObject();&lt;br /&gt;
        //восстановление инвариантов&lt;br /&gt;
        precomputedHash = countHash();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Что если внутреннее представление класса изменилось?&lt;br /&gt;
 * &lt;br /&gt;
 * Ручная сериализация полей&lt;br /&gt;
 * &lt;br /&gt;
 * Константа ObjectStreamField[] serialPersistentFields -- сериализуемые поля&lt;br /&gt;
 * ObjectOutputStream.PutField putFields() -- поля для записи&lt;br /&gt;
 * &lt;br /&gt;
 * writeFields записывает поля&lt;br /&gt;
 * &lt;br /&gt;
 * ObjectInputStream.GetField readFields() -- чтение полей&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
class Point5 implements Serializable {&lt;br /&gt;
    private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
    double angle;&lt;br /&gt;
    double rad;&lt;br /&gt;
&lt;br /&gt;
    private static final ObjectStreamField[] serialPersistentFields = {&lt;br /&gt;
            new ObjectStreamField(&amp;quot;x&amp;quot;, double.class),&lt;br /&gt;
            new ObjectStreamField(&amp;quot;y&amp;quot;, double.class) };&lt;br /&gt;
&lt;br /&gt;
    private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
        ObjectOutputStream.PutField fields = s.putFields();&lt;br /&gt;
        fields.put(&amp;quot;x&amp;quot;, Math.cos(angle) * rad);&lt;br /&gt;
        fields.put(&amp;quot;y&amp;quot;, Math.sin(angle) * rad);&lt;br /&gt;
        s.writeFields();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        ObjectInputStream.GetField fields = s.readFields();&lt;br /&gt;
        double x = (double) fields.get(&amp;quot;x&amp;quot;, 0.);&lt;br /&gt;
        double y = (double) fields.get(&amp;quot;y&amp;quot;, 0.);&lt;br /&gt;
        // count angle and mod here&lt;br /&gt;
        // angle = ...&lt;br /&gt;
        // rad = ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Сериализация с несериализуемым предком.&lt;br /&gt;
 * &lt;br /&gt;
 * Если хочется отнаследовать сериализуемый класс от &lt;br /&gt;
 * несериализуемого предка, то могут быть проблемы...&lt;br /&gt;
 * &lt;br /&gt;
 * Формальное требование одно -- предок должен иметь &lt;br /&gt;
 * конструктор по-умолчанию.&lt;br /&gt;
 * &lt;br /&gt;
 * Но только ли?!&lt;br /&gt;
 */&lt;br /&gt;
class NonSerializablePoint {&lt;br /&gt;
    private double x;&lt;br /&gt;
    private double y;&lt;br /&gt;
    &lt;br /&gt;
    protected double getX() {return x;}&lt;br /&gt;
    &lt;br /&gt;
    protected double getY() {return y;}&lt;br /&gt;
    &lt;br /&gt;
    protected void init(double x, double y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    protected NonSerializablePoint() {}&lt;br /&gt;
    &lt;br /&gt;
    public NonSerializablePoint(double x, double y) {&lt;br /&gt;
        init(x, y);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Serializable subclass of nonserializable stateful class&lt;br /&gt;
class ColoredPoint extends NonSerializablePoint implements Serializable {&lt;br /&gt;
    private int color;&lt;br /&gt;
&lt;br /&gt;
    // Конструктор использует обычный механизм&lt;br /&gt;
    public ColoredPoint(double x, double y, int color) {&lt;br /&gt;
        super(x, y);&lt;br /&gt;
        this.color = color;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        s.defaultReadObject();&lt;br /&gt;
        // Manually deserialize and initialize superclass state&lt;br /&gt;
        double x = s.readDouble();&lt;br /&gt;
        double y = s.readDouble();&lt;br /&gt;
        init(x, y);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
        s.defaultWriteObject();&lt;br /&gt;
        // Manually serialize superclass state&lt;br /&gt;
        s.writeDouble(getX());&lt;br /&gt;
        s.writeDouble(getY());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private static final long serialVersionUID = 1856835860954L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Externalizable&lt;br /&gt;
 * &lt;br /&gt;
 * Сериализация &amp;quot;в ручную&amp;quot;&lt;br /&gt;
 *  &lt;br /&gt;
 *  void readExternal(ObjectInput in)&lt;br /&gt;
 *  void writeExternal(ObjectOutput out) &lt;br /&gt;
 * &lt;br /&gt;
 * Должен быть конструктор по-умолчанию&lt;br /&gt;
 * &lt;br /&gt;
 * Чтение: вызов конструктора по-умолчанию, вызов readExternal&lt;br /&gt;
 */&lt;br /&gt;
class Point6 implements Externalizable {&lt;br /&gt;
    private double x;&lt;br /&gt;
    private double y;&lt;br /&gt;
&lt;br /&gt;
    Point6(double x, double y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Override&lt;br /&gt;
    public void writeExternal(ObjectOutput out) throws IOException {&lt;br /&gt;
        out.writeDouble(x);&lt;br /&gt;
        out.writeDouble(y);&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void readExternal(ObjectInput in) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        this.x = in.readDouble();&lt;br /&gt;
        this.y = in.readDouble();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;quot;Подмена&amp;quot; сериализуемого объекта.&lt;br /&gt;
 * &lt;br /&gt;
 * Когда вместо самого объекта сериализуется его альтернативное представление&lt;br /&gt;
 * в виде другого объекта некоторого (возможно того же самого) сериализуемого класса. &lt;br /&gt;
 * &lt;br /&gt;
 * Object writeReplace() -- какой объект записать вместо данного&lt;br /&gt;
 * Object readResolve() -- какой объект восстановить вместо прочитанного&lt;br /&gt;
 * &lt;br /&gt;
 * Реализуются у разных классов!!!&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2481</id>
		<title>Java Serialization 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2481"/>
				<updated>2013-05-22T13:20:15Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Лекция о сериализации в Java. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что почитать ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11&lt;br /&gt;
* [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java Object Serialization Specification]&lt;br /&gt;
&lt;br /&gt;
== Лекция о сериализации в Java. ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/****Введение****/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * &lt;br /&gt;
 * Сериализация -- запись объекта в байтовый поток.&lt;br /&gt;
 * &lt;br /&gt;
 * Десереализация -- CO.&lt;br /&gt;
 * &lt;br /&gt;
 * Все в пакете java.io&lt;br /&gt;
 * &lt;br /&gt;
 * Мотивация:&lt;br /&gt;
 *  1. dump (ex. JavaBeans persistence)&lt;br /&gt;
 *  2. RMI&lt;br /&gt;
 */&lt;br /&gt;
class Point {&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * В простейшем случае достаточно добавить маркерный интерфейс implements&lt;br /&gt;
 * Serializable&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
class Point1 implements Serializable {&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
&lt;br /&gt;
    Point1(double x, double y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class SimplePointTest {&lt;br /&gt;
    void SimpleWrite(OutputStream os) throws /*NotSerializableException,*/ IOException {&lt;br /&gt;
        Point1 p = new Point1(10., 10.);&lt;br /&gt;
        ObjectOutput out = new ObjectOutputStream(os);&lt;br /&gt;
        out.writeObject(p);&lt;br /&gt;
        os.flush();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void SimpleRead(InputStream is) throws IOException, ClassNotFoundException {&lt;br /&gt;
        ObjectInput in = new ObjectInputStream(is);&lt;br /&gt;
        Point1 p = (Point1) in.readObject();&lt;br /&gt;
        System.out.println(&amp;quot;x=&amp;quot; + p.x);&lt;br /&gt;
        System.out.println(&amp;quot;y=&amp;quot; + p.y);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Test&lt;br /&gt;
    public void SimpleTest() throws FileNotFoundException, IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        try (OutputStream os = new FileOutputStream(&amp;quot;point.ser&amp;quot;)) {&lt;br /&gt;
            SimpleWrite(os);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        try (InputStream is = new FileInputStream(&amp;quot;point.ser&amp;quot;)) {&lt;br /&gt;
            SimpleRead(is);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/****Процесс сериализации****/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * В сериализации участвуют ВСЕ достижимые объекты.&lt;br /&gt;
 * &lt;br /&gt;
 * Запись:&lt;br /&gt;
 *  1. Запись предка (если он сериализуем)&lt;br /&gt;
 *  2. Запись полей (если они сериализуемы)&lt;br /&gt;
 * &lt;br /&gt;
 * Циклические зависимости корректно обрабатываются автоматически.&lt;br /&gt;
 * &lt;br /&gt;
 * Чтение:&lt;br /&gt;
 *  1. Выделение памяти под объект&lt;br /&gt;
 *  2. Чтение предка&lt;br /&gt;
 *  3. Чтение полей&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Все поля должны быть сериализуемы!&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
class Polygon implements Serializable {&lt;br /&gt;
&lt;br /&gt;
    List&amp;lt;Point3&amp;gt; vertices = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Пока все просто, но впечатление обманчиво!&lt;br /&gt;
 * &lt;br /&gt;
 * 1. Внутреннее представление становится частью интерфейса&lt;br /&gt;
 *      Инкапсуляция летит к чертям!&lt;br /&gt;
 * 2. Увеличивает объемы тестирования новых версий&lt;br /&gt;
 * 3. Дополнительный конструктор! &lt;br /&gt;
 *      Необходимо обеспечивать все инварианты&lt;br /&gt;
 *      Некоторые дыры в безопасности&lt;br /&gt;
 * 4. Все потомки становятся сериализуемыми!&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/****Управление сериализацией****/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Serial version UID (stream unique identifier)&lt;br /&gt;
 * &lt;br /&gt;
 * Применяется для обеспечения совместимости, когда версии класса изменяются&lt;br /&gt;
 * &lt;br /&gt;
 * По-умолчанию автоматически создается на основе имени, интерфейсов, &lt;br /&gt;
 * public и protected полей&lt;br /&gt;
 * &lt;br /&gt;
 * В случае несовпадения -- InvalidClassException&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
class Point2 implements Serializable {&lt;br /&gt;
    private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Модификатор transient.&lt;br /&gt;
 * Исключает поле из процесса сериализации.&lt;br /&gt;
 * Примеры:&lt;br /&gt;
 *  1. Избыточная информация (предподсчитанные значения)&lt;br /&gt;
 *  2. Несериализуемые поля&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
class Point3 implements Serializable {&lt;br /&gt;
    private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
    transient int precomputedHash;&lt;br /&gt;
    &lt;br /&gt;
    public int hashCode() {&lt;br /&gt;
        return precomputedHash;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private int countHash() {&lt;br /&gt;
        //some very involved procedure&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Point3(double x, double y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
        precomputedHash = countHash();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Настраиваемая сериализация &lt;br /&gt;
 * Методы &lt;br /&gt;
 *  readObject(ObjectInputStream in) -- должен прочесть состояние из потока &lt;br /&gt;
 *  writeObject(ObjectOutputStream out) -- должен записать состояние в поток&lt;br /&gt;
 * &lt;br /&gt;
 * Процесс чтения&lt;br /&gt;
 *  1. Выделение памяти&lt;br /&gt;
 *  2. Вызов readObject&lt;br /&gt;
 *  &lt;br /&gt;
 */&lt;br /&gt;
class Point4 implements Serializable {&lt;br /&gt;
    private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
    double x;&lt;br /&gt;
    double y;&lt;br /&gt;
    &lt;br /&gt;
    transient int precomputedHash;&lt;br /&gt;
    &lt;br /&gt;
    public int hashCode() {&lt;br /&gt;
        return precomputedHash;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private int countHash() {&lt;br /&gt;
        //some very involved procedure&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    Point4(double x, double y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
        precomputedHash = countHash();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /*&lt;br /&gt;
     * Отвечает только за запись полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
     */&lt;br /&gt;
    private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
        /*&lt;br /&gt;
         * Реализует стандартный механизм сериализации.&lt;br /&gt;
         * Может вызываться только из writeObject, иначе NotActiveException&lt;br /&gt;
         */&lt;br /&gt;
        s.defaultWriteObject();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //отвечает только за чтение полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
    private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        /*&lt;br /&gt;
         * Реализует стандартный механизм десериализации.&lt;br /&gt;
         * Может вызываться только из readObject, иначе NotActiveException&lt;br /&gt;
         */&lt;br /&gt;
        s.defaultReadObject();&lt;br /&gt;
        //восстановление инвариантов&lt;br /&gt;
        precomputedHash = countHash();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Что если внутреннее представление класса изменилось?&lt;br /&gt;
 * &lt;br /&gt;
 * Ручная сериализация полей&lt;br /&gt;
 * &lt;br /&gt;
 * Константа ObjectStreamField[] serialPersistentFields -- сериализуемые поля&lt;br /&gt;
 * ObjectOutputStream.PutField putFields() -- поля для записи&lt;br /&gt;
 * &lt;br /&gt;
 * writeFields записывает поля&lt;br /&gt;
 * &lt;br /&gt;
 * ObjectInputStream.GetField readFields() -- чтение полей&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
class Point5 implements Serializable {&lt;br /&gt;
    private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
    double angle;&lt;br /&gt;
    double rad;&lt;br /&gt;
&lt;br /&gt;
    private static final ObjectStreamField[] serialPersistentFields = {&lt;br /&gt;
            new ObjectStreamField(&amp;quot;x&amp;quot;, double.class),&lt;br /&gt;
            new ObjectStreamField(&amp;quot;y&amp;quot;, double.class) };&lt;br /&gt;
&lt;br /&gt;
    private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
        ObjectOutputStream.PutField fields = s.putFields();&lt;br /&gt;
        fields.put(&amp;quot;x&amp;quot;, Math.cos(angle) * rad);&lt;br /&gt;
        fields.put(&amp;quot;y&amp;quot;, Math.sin(angle) * rad);&lt;br /&gt;
        s.writeFields();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        ObjectInputStream.GetField fields = s.readFields();&lt;br /&gt;
        double x = (double) fields.get(&amp;quot;x&amp;quot;, 0.);&lt;br /&gt;
        double y = (double) fields.get(&amp;quot;y&amp;quot;, 0.);&lt;br /&gt;
        // count angle and mod here&lt;br /&gt;
        // angle = ...&lt;br /&gt;
        // rad = ...&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Сериализация с несериализуемым предком.&lt;br /&gt;
 * &lt;br /&gt;
 * Если хочется отнаследовать сериализуемый класс от &lt;br /&gt;
 * несериализуемого предка, то могут быть проблемы...&lt;br /&gt;
 * &lt;br /&gt;
 * Формальное требование одно -- предок должен иметь &lt;br /&gt;
 * конструктор по-умолчанию.&lt;br /&gt;
 * &lt;br /&gt;
 * Но только ли?!&lt;br /&gt;
 */&lt;br /&gt;
class NonSerializablePoint {&lt;br /&gt;
    private double x;&lt;br /&gt;
    private double y;&lt;br /&gt;
    &lt;br /&gt;
    protected double getX() {return x;}&lt;br /&gt;
    &lt;br /&gt;
    protected double getY() {return y;}&lt;br /&gt;
    &lt;br /&gt;
    protected void init(double x, double y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    protected NonSerializablePoint() {}&lt;br /&gt;
    &lt;br /&gt;
    public NonSerializablePoint(double x, double y) {&lt;br /&gt;
        init(x, y);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Serializable subclass of nonserializable stateful class&lt;br /&gt;
class ColoredPoint extends NonSerializablePoint implements Serializable {&lt;br /&gt;
    private int color;&lt;br /&gt;
&lt;br /&gt;
    // Конструктор использует обычный механизм&lt;br /&gt;
    public ColoredPoint(double x, double y, int color) {&lt;br /&gt;
        super(x, y);&lt;br /&gt;
        this.color = color;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        s.defaultReadObject();&lt;br /&gt;
        // Manually deserialize and initialize superclass state&lt;br /&gt;
        double x = s.readDouble();&lt;br /&gt;
        double y = s.readDouble();&lt;br /&gt;
        init(x, y);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
        s.defaultWriteObject();&lt;br /&gt;
        // Manually serialize superclass state&lt;br /&gt;
        s.writeDouble(getX());&lt;br /&gt;
        s.writeDouble(getY());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private static final long serialVersionUID = 1856835860954L;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Externalizable&lt;br /&gt;
 * &lt;br /&gt;
 * Сериализация &amp;quot;в ручную&amp;quot;&lt;br /&gt;
 *  &lt;br /&gt;
 *  void readExternal(ObjectInput in)&lt;br /&gt;
 *  void writeExternal(ObjectOutput out) &lt;br /&gt;
 * &lt;br /&gt;
 * Должен быть конструктор по-умолчанию&lt;br /&gt;
 * &lt;br /&gt;
 * Чтение: вызов конструктора по-умолчанию, вызов readExternal&lt;br /&gt;
 */&lt;br /&gt;
class Point6 implements Externalizable {&lt;br /&gt;
    private double x;&lt;br /&gt;
    private double y;&lt;br /&gt;
&lt;br /&gt;
    Point6(double x, double y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    @Override&lt;br /&gt;
    public void writeExternal(ObjectOutput out) throws IOException {&lt;br /&gt;
        out.writeDouble(x);&lt;br /&gt;
        out.writeDouble(y);&lt;br /&gt;
    }&lt;br /&gt;
    @Override&lt;br /&gt;
    public void readExternal(ObjectInput in) throws IOException,&lt;br /&gt;
            ClassNotFoundException {&lt;br /&gt;
        this.x = in.readDouble();&lt;br /&gt;
        this.y = in.readDouble();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;quot;Подмена&amp;quot; сериализуемого объекта.&lt;br /&gt;
 * &lt;br /&gt;
 * Когда вместо самого объекта сериализуется его альтернативное представление&lt;br /&gt;
 * в виде другого объекта некоторого (возможно того же самого) сериализуемого класса. &lt;br /&gt;
 * &lt;br /&gt;
 * Object writeReplace() -- какой объект записать вместо данного&lt;br /&gt;
 * Object readResolve() -- какой объект восстановить вместо прочитанного&lt;br /&gt;
 * &lt;br /&gt;
 * Реализуются у разных классов!!!&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2480</id>
		<title>Java Serialization 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2480"/>
				<updated>2013-05-22T13:09:56Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* 1. Serialization.java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что почитать ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11&lt;br /&gt;
* [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java Object Serialization Specification]&lt;br /&gt;
&lt;br /&gt;
== Лекция о сериализации в Java. ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/****Введение****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация -- запись объекта в байтовый поток.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Десереализация -- CO.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Все в пакете java.io&lt;br /&gt;
	 * &lt;br /&gt;
	 * Мотивация:&lt;br /&gt;
	 * 	1. dump (ex. JavaBeans persistence)&lt;br /&gt;
	 * 	2. RMI&lt;br /&gt;
	 */&lt;br /&gt;
	class Point {&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point1.java and SimplePointTest.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/****Процесс сериализации****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * В сериализации участвуют ВСЕ достижимые объекты.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Запись:&lt;br /&gt;
	 * 	1. Запись предка (если он сериализуем)&lt;br /&gt;
	 * 	2. Запись полей (если они сериализуемы)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Циклические зависимости корректно обрабатываются автоматически.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение:&lt;br /&gt;
	 * 	1. Выделение памяти под объект&lt;br /&gt;
	 * 	2. Чтение предка&lt;br /&gt;
	 * 	3. Чтение полей&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Все поля должны быть сериализуемы!&lt;br /&gt;
	 */&lt;br /&gt;
	@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
	class Polygon implements Serializable {&lt;br /&gt;
&lt;br /&gt;
		List&amp;lt;Point3&amp;gt; vertices = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Пока все просто, но впечатление обманчиво!&lt;br /&gt;
	 * &lt;br /&gt;
	 * 1. Внутреннее представление становится частью интерфейса&lt;br /&gt;
	 * 		Инкапсуляция летит к чертям!&lt;br /&gt;
	 * 2. Увеличивает объемы тестирования новых версий&lt;br /&gt;
	 * 3. Дополнительный конструктор! &lt;br /&gt;
	 * 		Необходимо обеспечивать все инварианты&lt;br /&gt;
	 * 		Некоторые дыры в безопасности&lt;br /&gt;
	 * 4. Все потомки становятся сериализуемыми!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/****Управление сериализацией****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Serial version UID (stream unique identifier)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Применяется для обеспечения совместимости, когда версии класса изменяются&lt;br /&gt;
	 * &lt;br /&gt;
	 * По-умолчанию автоматически создается на основе имени, интерфейсов, &lt;br /&gt;
	 * public и protected полей&lt;br /&gt;
	 * &lt;br /&gt;
	 * В случае несовпадения -- InvalidClassException&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point2 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Модификатор transient.&lt;br /&gt;
	 * Исключает поле из процесса сериализации.&lt;br /&gt;
	 * Примеры:&lt;br /&gt;
	 * 	1. Избыточная информация (предподсчитанные значения)&lt;br /&gt;
	 * 	2. Несериализуемые поля&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point3 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point3(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Настраиваемая сериализация &lt;br /&gt;
	 * Методы &lt;br /&gt;
	 * 	readObject(ObjectInputStream in) -- должен прочесть состояние из потока &lt;br /&gt;
	 * 	writeObject(ObjectOutputStream out) -- должен записать состояние в поток&lt;br /&gt;
	 * &lt;br /&gt;
	 * Процесс чтения&lt;br /&gt;
	 * 	1. Выделение памяти&lt;br /&gt;
	 * 	2. Вызов readObject&lt;br /&gt;
	 *  &lt;br /&gt;
	 */&lt;br /&gt;
	class Point4 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point4(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		/*&lt;br /&gt;
		 * Отвечает только за запись полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		 */&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм сериализации.&lt;br /&gt;
			 * Может вызываться только из writeObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//отвечает только за чтение полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм десериализации.&lt;br /&gt;
			 * Может вызываться только из readObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			//восстановление инвариантов&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point5.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Сериализация с несериализуемым предком.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Если хочется отнаследовать сериализуемый класс от &lt;br /&gt;
	 * несериализуемого предка, то могут быть проблемы...&lt;br /&gt;
	 * &lt;br /&gt;
	 * Формальное требование одно -- предок должен иметь &lt;br /&gt;
	 * конструктор по-умолчанию.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Но только ли?!&lt;br /&gt;
	 */&lt;br /&gt;
	class NonSerializablePoint {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
		&lt;br /&gt;
		protected double getX() {return x;}&lt;br /&gt;
		&lt;br /&gt;
		protected double getY() {return y;}&lt;br /&gt;
		&lt;br /&gt;
		protected void init(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		protected NonSerializablePoint() {}&lt;br /&gt;
		&lt;br /&gt;
		public NonSerializablePoint(double x, double y) {&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Serializable subclass of nonserializable stateful class&lt;br /&gt;
	class ColoredPoint extends NonSerializablePoint implements Serializable {&lt;br /&gt;
		private int color;&lt;br /&gt;
&lt;br /&gt;
		// Конструктор использует обычный механизм&lt;br /&gt;
		public ColoredPoint(double x, double y, int color) {&lt;br /&gt;
			super(x, y);&lt;br /&gt;
			this.color = color;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			// Manually deserialize and initialize superclass state&lt;br /&gt;
			double x = s.readDouble();&lt;br /&gt;
			double y = s.readDouble();&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
			// Manually serialize superclass state&lt;br /&gt;
			s.writeDouble(getX());&lt;br /&gt;
			s.writeDouble(getY());&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		private static final long serialVersionUID = 1856835860954L;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Externalizable&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация &amp;quot;в ручную&amp;quot;&lt;br /&gt;
	 *  &lt;br /&gt;
	 * 	void readExternal(ObjectInput in)&lt;br /&gt;
	 * 	void writeExternal(ObjectOutput out) &lt;br /&gt;
	 * &lt;br /&gt;
	 * Должен быть конструктор по-умолчанию&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение: вызов конструктора по-умолчанию, вызов readExternal&lt;br /&gt;
	 */&lt;br /&gt;
	class Point6 implements Externalizable {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
&lt;br /&gt;
		Point6(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		@Override&lt;br /&gt;
		public void writeExternal(ObjectOutput out) throws IOException {&lt;br /&gt;
			out.writeDouble(x);&lt;br /&gt;
			out.writeDouble(y);&lt;br /&gt;
		}&lt;br /&gt;
		@Override&lt;br /&gt;
		public void readExternal(ObjectInput in) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			this.x = in.readDouble();&lt;br /&gt;
			this.y = in.readDouble();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &amp;quot;Подмена&amp;quot; сериализуемого объекта.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Когда вместо самого объекта сериализуется его альтернативное представление&lt;br /&gt;
	 * в виде другого объекта некоторого (возможно того же самого) сериализуемого класса. &lt;br /&gt;
	 * &lt;br /&gt;
	 * Object writeReplace() -- какой объект записать вместо данного&lt;br /&gt;
	 * Object readResolve() -- какой объект восстановить вместо прочитанного&lt;br /&gt;
	 * &lt;br /&gt;
	 * Реализуются у разных классов!!!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * В простейшем случае достаточно добавить маркерный интерфейс implements&lt;br /&gt;
 * Serializable&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings({ &amp;quot;serial&amp;quot;})&lt;br /&gt;
public class Point1 implements Serializable {&lt;br /&gt;
	double x;&lt;br /&gt;
	double y;&lt;br /&gt;
&lt;br /&gt;
	Point1(double x, double y) {&lt;br /&gt;
		this.x = x;&lt;br /&gt;
		this.y = y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.ObjectInput;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutput;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
@SuppressWarnings(&amp;quot;javadoc&amp;quot;)&lt;br /&gt;
public class SimplePointTest {&lt;br /&gt;
	void SimpleWrite(OutputStream os) throws /*NotSerializableException,*/ IOException {&lt;br /&gt;
		Point1 p = new Point1(10., 10.);&lt;br /&gt;
		ObjectOutput out = new ObjectOutputStream(os);&lt;br /&gt;
		out.writeObject(p);&lt;br /&gt;
		os.flush();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	void SimpleRead(InputStream is) throws IOException, ClassNotFoundException {&lt;br /&gt;
		ObjectInput in = new ObjectInputStream(is);&lt;br /&gt;
		Point1 p = (Point1) in.readObject();&lt;br /&gt;
		System.out.println(&amp;quot;x=&amp;quot; + p.x);&lt;br /&gt;
		System.out.println(&amp;quot;y=&amp;quot; + p.y);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void SimpleTest() throws FileNotFoundException, IOException,&lt;br /&gt;
			ClassNotFoundException {&lt;br /&gt;
		try (OutputStream os = new FileOutputStream(&amp;quot;point.ser&amp;quot;)) {&lt;br /&gt;
			SimpleWrite(os);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		try (InputStream is = new FileInputStream(&amp;quot;point.ser&amp;quot;)) {&lt;br /&gt;
			SimpleRead(is);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.ObjectStreamField;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Что если внутреннее представление класса изменилось?&lt;br /&gt;
 * &lt;br /&gt;
 * Ручная сериализация полей&lt;br /&gt;
 * &lt;br /&gt;
 * Константа ObjectStreamField[] serialPersistentFields -- сериализуемые поля&lt;br /&gt;
 * ObjectOutputStream.PutField putFields() -- поля для записи&lt;br /&gt;
 * &lt;br /&gt;
 * writeFields записывает поля&lt;br /&gt;
 * &lt;br /&gt;
 * ObjectInputStream.GetField readFields() -- чтение полей&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings(&amp;quot;unused&amp;quot;)&lt;br /&gt;
public class Point5 implements Serializable {&lt;br /&gt;
	private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
	double angle;&lt;br /&gt;
	double rad;&lt;br /&gt;
&lt;br /&gt;
	private static final ObjectStreamField[] serialPersistentFields = {&lt;br /&gt;
			new ObjectStreamField(&amp;quot;x&amp;quot;, double.class),&lt;br /&gt;
			new ObjectStreamField(&amp;quot;y&amp;quot;, double.class) };&lt;br /&gt;
&lt;br /&gt;
	private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
		ObjectOutputStream.PutField fields = s.putFields();&lt;br /&gt;
		fields.put(&amp;quot;x&amp;quot;, Math.cos(angle) * rad);&lt;br /&gt;
		fields.put(&amp;quot;y&amp;quot;, Math.sin(angle) * rad);&lt;br /&gt;
		s.writeFields();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
			ClassNotFoundException {&lt;br /&gt;
		ObjectInputStream.GetField fields = s.readFields();&lt;br /&gt;
		double x = (double) fields.get(&amp;quot;x&amp;quot;, 0.);&lt;br /&gt;
		double y = (double) fields.get(&amp;quot;y&amp;quot;, 0.);&lt;br /&gt;
		// count angle and mod here&lt;br /&gt;
		// angle = ...&lt;br /&gt;
		// rad = ...&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2479</id>
		<title>Java Serialization 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2479"/>
				<updated>2013-05-22T12:10:58Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* 1. Serialization.java (основная часть) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что почитать ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11&lt;br /&gt;
* [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java Object Serialization Specification]&lt;br /&gt;
&lt;br /&gt;
== 1. Serialization.java ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.Externalizable;&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.ObjectInput;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutput;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.ObjectStreamField;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Лекция о сериализации в Java.&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings({&amp;quot;unused&amp;quot;})&lt;br /&gt;
public class Serialization {&lt;br /&gt;
&lt;br /&gt;
	/****Введение****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация -- запись объекта в байтовый поток.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Десереализация -- CO.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Все в пакете java.io&lt;br /&gt;
	 * &lt;br /&gt;
	 * Мотивация:&lt;br /&gt;
	 * 	1. dump (ex. JavaBeans persistence)&lt;br /&gt;
	 * 	2. RMI&lt;br /&gt;
	 */&lt;br /&gt;
	class Point {&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point1.java and SimplePointTest.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/****Процесс сериализации****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * В сериализации участвуют ВСЕ достижимые объекты.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Запись:&lt;br /&gt;
	 * 	1. Запись предка (если он сериализуем)&lt;br /&gt;
	 * 	2. Запись полей (если они сериализуемы)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Циклические зависимости корректно обрабатываются автоматически.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение:&lt;br /&gt;
	 * 	1. Выделение памяти под объект&lt;br /&gt;
	 * 	2. Чтение предка&lt;br /&gt;
	 * 	3. Чтение полей&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Все поля должны быть сериализуемы!&lt;br /&gt;
	 */&lt;br /&gt;
	@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
	class Polygon implements Serializable {&lt;br /&gt;
&lt;br /&gt;
		List&amp;lt;Point3&amp;gt; vertices = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Пока все просто, но впечатление обманчиво!&lt;br /&gt;
	 * &lt;br /&gt;
	 * 1. Внутреннее представление становится частью интерфейса&lt;br /&gt;
	 * 		Инкапсуляция летит к чертям!&lt;br /&gt;
	 * 2. Увеличивает объемы тестирования новых версий&lt;br /&gt;
	 * 3. Дополнительный конструктор! &lt;br /&gt;
	 * 		Необходимо обеспечивать все инварианты&lt;br /&gt;
	 * 		Некоторые дыры в безопасности&lt;br /&gt;
	 * 4. Все потомки становятся сериализуемыми!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/****Управление сериализацией****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Serial version UID (stream unique identifier)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Применяется для обеспечения совместимости, когда версии класса изменяются&lt;br /&gt;
	 * &lt;br /&gt;
	 * По-умолчанию автоматически создается на основе имени, интерфейсов, &lt;br /&gt;
	 * public и protected полей&lt;br /&gt;
	 * &lt;br /&gt;
	 * В случае несовпадения -- InvalidClassException&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point2 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Модификатор transient.&lt;br /&gt;
	 * Исключает поле из процесса сериализации.&lt;br /&gt;
	 * Примеры:&lt;br /&gt;
	 * 	1. Избыточная информация (предподсчитанные значения)&lt;br /&gt;
	 * 	2. Несериализуемые поля&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point3 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point3(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Настраиваемая сериализация &lt;br /&gt;
	 * Методы &lt;br /&gt;
	 * 	readObject(ObjectInputStream in) -- должен прочесть состояние из потока &lt;br /&gt;
	 * 	writeObject(ObjectOutputStream out) -- должен записать состояние в поток&lt;br /&gt;
	 * &lt;br /&gt;
	 * Процесс чтения&lt;br /&gt;
	 * 	1. Выделение памяти&lt;br /&gt;
	 * 	2. Вызов readObject&lt;br /&gt;
	 *  &lt;br /&gt;
	 */&lt;br /&gt;
	class Point4 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point4(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		/*&lt;br /&gt;
		 * Отвечает только за запись полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		 */&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм сериализации.&lt;br /&gt;
			 * Может вызываться только из writeObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//отвечает только за чтение полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм десериализации.&lt;br /&gt;
			 * Может вызываться только из readObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			//восстановление инвариантов&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point5.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Сериализация с несериализуемым предком.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Если хочется отнаследовать сериализуемый класс от &lt;br /&gt;
	 * несериализуемого предка, то могут быть проблемы...&lt;br /&gt;
	 * &lt;br /&gt;
	 * Формальное требование одно -- предок должен иметь &lt;br /&gt;
	 * конструктор по-умолчанию.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Но только ли?!&lt;br /&gt;
	 */&lt;br /&gt;
	class NonSerializablePoint {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
		&lt;br /&gt;
		protected double getX() {return x;}&lt;br /&gt;
		&lt;br /&gt;
		protected double getY() {return y;}&lt;br /&gt;
		&lt;br /&gt;
		protected void init(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		protected NonSerializablePoint() {}&lt;br /&gt;
		&lt;br /&gt;
		public NonSerializablePoint(double x, double y) {&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Serializable subclass of nonserializable stateful class&lt;br /&gt;
	class ColoredPoint extends NonSerializablePoint implements Serializable {&lt;br /&gt;
		private int color;&lt;br /&gt;
&lt;br /&gt;
		// Конструктор использует обычный механизм&lt;br /&gt;
		public ColoredPoint(double x, double y, int color) {&lt;br /&gt;
			super(x, y);&lt;br /&gt;
			this.color = color;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			// Manually deserialize and initialize superclass state&lt;br /&gt;
			double x = s.readDouble();&lt;br /&gt;
			double y = s.readDouble();&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
			// Manually serialize superclass state&lt;br /&gt;
			s.writeDouble(getX());&lt;br /&gt;
			s.writeDouble(getY());&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		private static final long serialVersionUID = 1856835860954L;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Externalizable&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация &amp;quot;в ручную&amp;quot;&lt;br /&gt;
	 *  &lt;br /&gt;
	 * 	void readExternal(ObjectInput in)&lt;br /&gt;
	 * 	void writeExternal(ObjectOutput out) &lt;br /&gt;
	 * &lt;br /&gt;
	 * Должен быть конструктор по-умолчанию&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение: вызов конструктора по-умолчанию, вызов readExternal&lt;br /&gt;
	 */&lt;br /&gt;
	class Point6 implements Externalizable {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
&lt;br /&gt;
		Point6(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		@Override&lt;br /&gt;
		public void writeExternal(ObjectOutput out) throws IOException {&lt;br /&gt;
			out.writeDouble(x);&lt;br /&gt;
			out.writeDouble(y);&lt;br /&gt;
		}&lt;br /&gt;
		@Override&lt;br /&gt;
		public void readExternal(ObjectInput in) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			this.x = in.readDouble();&lt;br /&gt;
			this.y = in.readDouble();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &amp;quot;Подмена&amp;quot; сериализуемого объекта.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Когда вместо самого объекта сериализуется его альтернативное представление&lt;br /&gt;
	 * в виде другого объекта некоторого (возможно того же самого) сериализуемого класса. &lt;br /&gt;
	 * &lt;br /&gt;
	 * Object writeReplace() -- какой объект записать вместо данного&lt;br /&gt;
	 * Object readResolve() -- какой объект восстановить вместо прочитанного&lt;br /&gt;
	 * &lt;br /&gt;
	 * Реализуются у разных классов!!!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * В простейшем случае достаточно добавить маркерный интерфейс implements&lt;br /&gt;
 * Serializable&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings({ &amp;quot;serial&amp;quot;})&lt;br /&gt;
public class Point1 implements Serializable {&lt;br /&gt;
	double x;&lt;br /&gt;
	double y;&lt;br /&gt;
&lt;br /&gt;
	Point1(double x, double y) {&lt;br /&gt;
		this.x = x;&lt;br /&gt;
		this.y = y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.ObjectInput;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutput;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
@SuppressWarnings(&amp;quot;javadoc&amp;quot;)&lt;br /&gt;
public class SimplePointTest {&lt;br /&gt;
	void SimpleWrite(OutputStream os) throws /*NotSerializableException,*/ IOException {&lt;br /&gt;
		Point1 p = new Point1(10., 10.);&lt;br /&gt;
		ObjectOutput out = new ObjectOutputStream(os);&lt;br /&gt;
		out.writeObject(p);&lt;br /&gt;
		os.flush();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	void SimpleRead(InputStream is) throws IOException, ClassNotFoundException {&lt;br /&gt;
		ObjectInput in = new ObjectInputStream(is);&lt;br /&gt;
		Point1 p = (Point1) in.readObject();&lt;br /&gt;
		System.out.println(&amp;quot;x=&amp;quot; + p.x);&lt;br /&gt;
		System.out.println(&amp;quot;y=&amp;quot; + p.y);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void SimpleTest() throws FileNotFoundException, IOException,&lt;br /&gt;
			ClassNotFoundException {&lt;br /&gt;
		try (OutputStream os = new FileOutputStream(&amp;quot;point.ser&amp;quot;)) {&lt;br /&gt;
			SimpleWrite(os);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		try (InputStream is = new FileInputStream(&amp;quot;point.ser&amp;quot;)) {&lt;br /&gt;
			SimpleRead(is);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.ObjectStreamField;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Что если внутреннее представление класса изменилось?&lt;br /&gt;
 * &lt;br /&gt;
 * Ручная сериализация полей&lt;br /&gt;
 * &lt;br /&gt;
 * Константа ObjectStreamField[] serialPersistentFields -- сериализуемые поля&lt;br /&gt;
 * ObjectOutputStream.PutField putFields() -- поля для записи&lt;br /&gt;
 * &lt;br /&gt;
 * writeFields записывает поля&lt;br /&gt;
 * &lt;br /&gt;
 * ObjectInputStream.GetField readFields() -- чтение полей&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings(&amp;quot;unused&amp;quot;)&lt;br /&gt;
public class Point5 implements Serializable {&lt;br /&gt;
	private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
	double angle;&lt;br /&gt;
	double rad;&lt;br /&gt;
&lt;br /&gt;
	private static final ObjectStreamField[] serialPersistentFields = {&lt;br /&gt;
			new ObjectStreamField(&amp;quot;x&amp;quot;, double.class),&lt;br /&gt;
			new ObjectStreamField(&amp;quot;y&amp;quot;, double.class) };&lt;br /&gt;
&lt;br /&gt;
	private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
		ObjectOutputStream.PutField fields = s.putFields();&lt;br /&gt;
		fields.put(&amp;quot;x&amp;quot;, Math.cos(angle) * rad);&lt;br /&gt;
		fields.put(&amp;quot;y&amp;quot;, Math.sin(angle) * rad);&lt;br /&gt;
		s.writeFields();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
			ClassNotFoundException {&lt;br /&gt;
		ObjectInputStream.GetField fields = s.readFields();&lt;br /&gt;
		double x = (double) fields.get(&amp;quot;x&amp;quot;, 0.);&lt;br /&gt;
		double y = (double) fields.get(&amp;quot;y&amp;quot;, 0.);&lt;br /&gt;
		// count angle and mod here&lt;br /&gt;
		// angle = ...&lt;br /&gt;
		// rad = ...&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2478</id>
		<title>Java Serialization 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2478"/>
				<updated>2013-05-22T12:10:42Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* 1. Serialization.java (основная часть) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что почитать ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11&lt;br /&gt;
* [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java Object Serialization Specification]&lt;br /&gt;
&lt;br /&gt;
== 1. Serialization.java (основная часть) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.Externalizable;&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.ObjectInput;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutput;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.ObjectStreamField;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Лекция о сериализации в Java.&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings({&amp;quot;unused&amp;quot;})&lt;br /&gt;
public class Serialization {&lt;br /&gt;
&lt;br /&gt;
	/****Введение****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация -- запись объекта в байтовый поток.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Десереализация -- CO.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Все в пакете java.io&lt;br /&gt;
	 * &lt;br /&gt;
	 * Мотивация:&lt;br /&gt;
	 * 	1. dump (ex. JavaBeans persistence)&lt;br /&gt;
	 * 	2. RMI&lt;br /&gt;
	 */&lt;br /&gt;
	class Point {&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point1.java and SimplePointTest.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/****Процесс сериализации****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * В сериализации участвуют ВСЕ достижимые объекты.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Запись:&lt;br /&gt;
	 * 	1. Запись предка (если он сериализуем)&lt;br /&gt;
	 * 	2. Запись полей (если они сериализуемы)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Циклические зависимости корректно обрабатываются автоматически.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение:&lt;br /&gt;
	 * 	1. Выделение памяти под объект&lt;br /&gt;
	 * 	2. Чтение предка&lt;br /&gt;
	 * 	3. Чтение полей&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Все поля должны быть сериализуемы!&lt;br /&gt;
	 */&lt;br /&gt;
	@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
	class Polygon implements Serializable {&lt;br /&gt;
&lt;br /&gt;
		List&amp;lt;Point3&amp;gt; vertices = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Пока все просто, но впечатление обманчиво!&lt;br /&gt;
	 * &lt;br /&gt;
	 * 1. Внутреннее представление становится частью интерфейса&lt;br /&gt;
	 * 		Инкапсуляция летит к чертям!&lt;br /&gt;
	 * 2. Увеличивает объемы тестирования новых версий&lt;br /&gt;
	 * 3. Дополнительный конструктор! &lt;br /&gt;
	 * 		Необходимо обеспечивать все инварианты&lt;br /&gt;
	 * 		Некоторые дыры в безопасности&lt;br /&gt;
	 * 4. Все потомки становятся сериализуемыми!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/****Управление сериализацией****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Serial version UID (stream unique identifier)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Применяется для обеспечения совместимости, когда версии класса изменяются&lt;br /&gt;
	 * &lt;br /&gt;
	 * По-умолчанию автоматически создается на основе имени, интерфейсов, &lt;br /&gt;
	 * public и protected полей&lt;br /&gt;
	 * &lt;br /&gt;
	 * В случае несовпадения -- InvalidClassException&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point2 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Модификатор transient.&lt;br /&gt;
	 * Исключает поле из процесса сериализации.&lt;br /&gt;
	 * Примеры:&lt;br /&gt;
	 * 	1. Избыточная информация (предподсчитанные значения)&lt;br /&gt;
	 * 	2. Несериализуемые поля&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point3 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point3(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Настраиваемая сериализация &lt;br /&gt;
	 * Методы &lt;br /&gt;
	 * 	readObject(ObjectInputStream in) -- должен прочесть состояние из потока &lt;br /&gt;
	 * 	writeObject(ObjectOutputStream out) -- должен записать состояние в поток&lt;br /&gt;
	 * &lt;br /&gt;
	 * Процесс чтения&lt;br /&gt;
	 * 	1. Выделение памяти&lt;br /&gt;
	 * 	2. Вызов readObject&lt;br /&gt;
	 *  &lt;br /&gt;
	 */&lt;br /&gt;
	class Point4 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point4(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		/*&lt;br /&gt;
		 * Отвечает только за запись полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		 */&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм сериализации.&lt;br /&gt;
			 * Может вызываться только из writeObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//отвечает только за чтение полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм десериализации.&lt;br /&gt;
			 * Может вызываться только из readObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			//восстановление инвариантов&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point5.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Сериализация с несериализуемым предком.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Если хочется отнаследовать сериализуемый класс от &lt;br /&gt;
	 * несериализуемого предка, то могут быть проблемы...&lt;br /&gt;
	 * &lt;br /&gt;
	 * Формальное требование одно -- предок должен иметь &lt;br /&gt;
	 * конструктор по-умолчанию.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Но только ли?!&lt;br /&gt;
	 */&lt;br /&gt;
	class NonSerializablePoint {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
		&lt;br /&gt;
		protected double getX() {return x;}&lt;br /&gt;
		&lt;br /&gt;
		protected double getY() {return y;}&lt;br /&gt;
		&lt;br /&gt;
		protected void init(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		protected NonSerializablePoint() {}&lt;br /&gt;
		&lt;br /&gt;
		public NonSerializablePoint(double x, double y) {&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Serializable subclass of nonserializable stateful class&lt;br /&gt;
	class ColoredPoint extends NonSerializablePoint implements Serializable {&lt;br /&gt;
		private int color;&lt;br /&gt;
&lt;br /&gt;
		// Конструктор использует обычный механизм&lt;br /&gt;
		public ColoredPoint(double x, double y, int color) {&lt;br /&gt;
			super(x, y);&lt;br /&gt;
			this.color = color;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			// Manually deserialize and initialize superclass state&lt;br /&gt;
			double x = s.readDouble();&lt;br /&gt;
			double y = s.readDouble();&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
			// Manually serialize superclass state&lt;br /&gt;
			s.writeDouble(getX());&lt;br /&gt;
			s.writeDouble(getY());&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		private static final long serialVersionUID = 1856835860954L;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Externalizable&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация &amp;quot;в ручную&amp;quot;&lt;br /&gt;
	 *  &lt;br /&gt;
	 * 	void readExternal(ObjectInput in)&lt;br /&gt;
	 * 	void writeExternal(ObjectOutput out) &lt;br /&gt;
	 * &lt;br /&gt;
	 * Должен быть конструктор по-умолчанию&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение: вызов конструктора по-умолчанию, вызов readExternal&lt;br /&gt;
	 */&lt;br /&gt;
	class Point6 implements Externalizable {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
&lt;br /&gt;
		Point6(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		@Override&lt;br /&gt;
		public void writeExternal(ObjectOutput out) throws IOException {&lt;br /&gt;
			out.writeDouble(x);&lt;br /&gt;
			out.writeDouble(y);&lt;br /&gt;
		}&lt;br /&gt;
		@Override&lt;br /&gt;
		public void readExternal(ObjectInput in) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			this.x = in.readDouble();&lt;br /&gt;
			this.y = in.readDouble();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &amp;quot;Подмена&amp;quot; сериализуемого объекта.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Когда вместо самого объекта сериализуется его альтернативное представление&lt;br /&gt;
	 * в виде другого объекта некоторого (возможно того же самого) сериализуемого класса. &lt;br /&gt;
	 * &lt;br /&gt;
	 * Object writeReplace() -- какой объект записать вместо данного&lt;br /&gt;
	 * Object readResolve() -- какой объект восстановить вместо прочитанного&lt;br /&gt;
	 * &lt;br /&gt;
	 * Реализуются у разных классов!!!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * В простейшем случае достаточно добавить маркерный интерфейс implements&lt;br /&gt;
 * Serializable&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings({ &amp;quot;serial&amp;quot;})&lt;br /&gt;
public class Point1 implements Serializable {&lt;br /&gt;
	double x;&lt;br /&gt;
	double y;&lt;br /&gt;
&lt;br /&gt;
	Point1(double x, double y) {&lt;br /&gt;
		this.x = x;&lt;br /&gt;
		this.y = y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.ObjectInput;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutput;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
@SuppressWarnings(&amp;quot;javadoc&amp;quot;)&lt;br /&gt;
public class SimplePointTest {&lt;br /&gt;
	void SimpleWrite(OutputStream os) throws /*NotSerializableException,*/ IOException {&lt;br /&gt;
		Point1 p = new Point1(10., 10.);&lt;br /&gt;
		ObjectOutput out = new ObjectOutputStream(os);&lt;br /&gt;
		out.writeObject(p);&lt;br /&gt;
		os.flush();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	void SimpleRead(InputStream is) throws IOException, ClassNotFoundException {&lt;br /&gt;
		ObjectInput in = new ObjectInputStream(is);&lt;br /&gt;
		Point1 p = (Point1) in.readObject();&lt;br /&gt;
		System.out.println(&amp;quot;x=&amp;quot; + p.x);&lt;br /&gt;
		System.out.println(&amp;quot;y=&amp;quot; + p.y);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Test&lt;br /&gt;
	public void SimpleTest() throws FileNotFoundException, IOException,&lt;br /&gt;
			ClassNotFoundException {&lt;br /&gt;
		try (OutputStream os = new FileOutputStream(&amp;quot;point.ser&amp;quot;)) {&lt;br /&gt;
			SimpleWrite(os);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		try (InputStream is = new FileInputStream(&amp;quot;point.ser&amp;quot;)) {&lt;br /&gt;
			SimpleRead(is);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.ObjectStreamField;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Что если внутреннее представление класса изменилось?&lt;br /&gt;
 * &lt;br /&gt;
 * Ручная сериализация полей&lt;br /&gt;
 * &lt;br /&gt;
 * Константа ObjectStreamField[] serialPersistentFields -- сериализуемые поля&lt;br /&gt;
 * ObjectOutputStream.PutField putFields() -- поля для записи&lt;br /&gt;
 * &lt;br /&gt;
 * writeFields записывает поля&lt;br /&gt;
 * &lt;br /&gt;
 * ObjectInputStream.GetField readFields() -- чтение полей&lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings(&amp;quot;unused&amp;quot;)&lt;br /&gt;
public class Point5 implements Serializable {&lt;br /&gt;
	private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
	double angle;&lt;br /&gt;
	double rad;&lt;br /&gt;
&lt;br /&gt;
	private static final ObjectStreamField[] serialPersistentFields = {&lt;br /&gt;
			new ObjectStreamField(&amp;quot;x&amp;quot;, double.class),&lt;br /&gt;
			new ObjectStreamField(&amp;quot;y&amp;quot;, double.class) };&lt;br /&gt;
&lt;br /&gt;
	private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
		ObjectOutputStream.PutField fields = s.putFields();&lt;br /&gt;
		fields.put(&amp;quot;x&amp;quot;, Math.cos(angle) * rad);&lt;br /&gt;
		fields.put(&amp;quot;y&amp;quot;, Math.sin(angle) * rad);&lt;br /&gt;
		s.writeFields();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
			ClassNotFoundException {&lt;br /&gt;
		ObjectInputStream.GetField fields = s.readFields();&lt;br /&gt;
		double x = (double) fields.get(&amp;quot;x&amp;quot;, 0.);&lt;br /&gt;
		double y = (double) fields.get(&amp;quot;y&amp;quot;, 0.);&lt;br /&gt;
		// count angle and mod here&lt;br /&gt;
		// angle = ...&lt;br /&gt;
		// rad = ...&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2477</id>
		<title>Java Serialization 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2477"/>
				<updated>2013-05-22T12:09:44Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* 1. Serialization.java (основная часть) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что почитать ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11&lt;br /&gt;
* [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java Object Serialization Specification]&lt;br /&gt;
&lt;br /&gt;
== 1. Serialization.java (основная часть) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.Externalizable;&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.ObjectInput;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutput;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.ObjectStreamField;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Лекция о сериализации в Java.&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings({&amp;quot;unused&amp;quot;})&lt;br /&gt;
public class Serialization {&lt;br /&gt;
&lt;br /&gt;
	/****Введение****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация -- запись объекта в байтовый поток.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Десереализация -- CO.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Все в пакете java.io&lt;br /&gt;
	 * &lt;br /&gt;
	 * Мотивация:&lt;br /&gt;
	 * 	1. dump (ex. JavaBeans persistence)&lt;br /&gt;
	 * 	2. RMI&lt;br /&gt;
	 */&lt;br /&gt;
	class Point {&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point1.java and SimplePointTest.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/****Процесс сериализации****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * В сериализации участвуют ВСЕ достижимые объекты.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Запись:&lt;br /&gt;
	 * 	1. Запись предка (если он сериализуем)&lt;br /&gt;
	 * 	2. Запись полей (если они сериализуемы)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Циклические зависимости корректно обрабатываются автоматически.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение:&lt;br /&gt;
	 * 	1. Выделение памяти под объект&lt;br /&gt;
	 * 	2. Чтение предка&lt;br /&gt;
	 * 	3. Чтение полей&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Все поля должны быть сериализуемы!&lt;br /&gt;
	 */&lt;br /&gt;
	@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
	class Polygon implements Serializable {&lt;br /&gt;
&lt;br /&gt;
		List&amp;lt;Point3&amp;gt; vertices = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Пока все просто, но впечатление обманчиво!&lt;br /&gt;
	 * &lt;br /&gt;
	 * 1. Внутреннее представление становится частью интерфейса&lt;br /&gt;
	 * 		Инкапсуляция летит к чертям!&lt;br /&gt;
	 * 2. Увеличивает объемы тестирования новых версий&lt;br /&gt;
	 * 3. Дополнительный конструктор! &lt;br /&gt;
	 * 		Необходимо обеспечивать все инварианты&lt;br /&gt;
	 * 		Некоторые дыры в безопасности&lt;br /&gt;
	 * 4. Все потомки становятся сериализуемыми!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/****Управление сериализацией****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Serial version UID (stream unique identifier)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Применяется для обеспечения совместимости, когда версии класса изменяются&lt;br /&gt;
	 * &lt;br /&gt;
	 * По-умолчанию автоматически создается на основе имени, интерфейсов, &lt;br /&gt;
	 * public и protected полей&lt;br /&gt;
	 * &lt;br /&gt;
	 * В случае несовпадения -- InvalidClassException&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point2 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Модификатор transient.&lt;br /&gt;
	 * Исключает поле из процесса сериализации.&lt;br /&gt;
	 * Примеры:&lt;br /&gt;
	 * 	1. Избыточная информация (предподсчитанные значения)&lt;br /&gt;
	 * 	2. Несериализуемые поля&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point3 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point3(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Настраиваемая сериализация &lt;br /&gt;
	 * Методы &lt;br /&gt;
	 * 	readObject(ObjectInputStream in) -- должен прочесть состояние из потока &lt;br /&gt;
	 * 	writeObject(ObjectOutputStream out) -- должен записать состояние в поток&lt;br /&gt;
	 * &lt;br /&gt;
	 * Процесс чтения&lt;br /&gt;
	 * 	1. Выделение памяти&lt;br /&gt;
	 * 	2. Вызов readObject&lt;br /&gt;
	 *  &lt;br /&gt;
	 */&lt;br /&gt;
	class Point4 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point4(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		/*&lt;br /&gt;
		 * Отвечает только за запись полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		 */&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм сериализации.&lt;br /&gt;
			 * Может вызываться только из writeObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//отвечает только за чтение полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм десериализации.&lt;br /&gt;
			 * Может вызываться только из readObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			//восстановление инвариантов&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point5.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Сериализация с несериализуемым предком.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Если хочется отнаследовать сериализуемый класс от &lt;br /&gt;
	 * несериализуемого предка, то могут быть проблемы...&lt;br /&gt;
	 * &lt;br /&gt;
	 * Формальное требование одно -- предок должен иметь &lt;br /&gt;
	 * конструктор по-умолчанию.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Но только ли?!&lt;br /&gt;
	 */&lt;br /&gt;
	class NonSerializablePoint {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
		&lt;br /&gt;
		protected double getX() {return x;}&lt;br /&gt;
		&lt;br /&gt;
		protected double getY() {return y;}&lt;br /&gt;
		&lt;br /&gt;
		protected void init(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		protected NonSerializablePoint() {}&lt;br /&gt;
		&lt;br /&gt;
		public NonSerializablePoint(double x, double y) {&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Serializable subclass of nonserializable stateful class&lt;br /&gt;
	class ColoredPoint extends NonSerializablePoint implements Serializable {&lt;br /&gt;
		private int color;&lt;br /&gt;
&lt;br /&gt;
		// Конструктор использует обычный механизм&lt;br /&gt;
		public ColoredPoint(double x, double y, int color) {&lt;br /&gt;
			super(x, y);&lt;br /&gt;
			this.color = color;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			// Manually deserialize and initialize superclass state&lt;br /&gt;
			double x = s.readDouble();&lt;br /&gt;
			double y = s.readDouble();&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
			// Manually serialize superclass state&lt;br /&gt;
			s.writeDouble(getX());&lt;br /&gt;
			s.writeDouble(getY());&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		private static final long serialVersionUID = 1856835860954L;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Externalizable&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация &amp;quot;в ручную&amp;quot;&lt;br /&gt;
	 *  &lt;br /&gt;
	 * 	void readExternal(ObjectInput in)&lt;br /&gt;
	 * 	void writeExternal(ObjectOutput out) &lt;br /&gt;
	 * &lt;br /&gt;
	 * Должен быть конструктор по-умолчанию&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение: вызов конструктора по-умолчанию, вызов readExternal&lt;br /&gt;
	 */&lt;br /&gt;
	class Point6 implements Externalizable {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
&lt;br /&gt;
		Point6(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		@Override&lt;br /&gt;
		public void writeExternal(ObjectOutput out) throws IOException {&lt;br /&gt;
			out.writeDouble(x);&lt;br /&gt;
			out.writeDouble(y);&lt;br /&gt;
		}&lt;br /&gt;
		@Override&lt;br /&gt;
		public void readExternal(ObjectInput in) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			this.x = in.readDouble();&lt;br /&gt;
			this.y = in.readDouble();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &amp;quot;Подмена&amp;quot; сериализуемого объекта.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Когда вместо самого объекта сериализуется его альтернативное представление&lt;br /&gt;
	 * в виде другого объекта некоторого (возможно того же самого) сериализуемого класса. &lt;br /&gt;
	 * &lt;br /&gt;
	 * Object writeReplace() -- какой объект записать вместо данного&lt;br /&gt;
	 * Object readResolve() -- какой объект восстановить вместо прочитанного&lt;br /&gt;
	 * &lt;br /&gt;
	 * Реализуются у разных классов!!!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * В простейшем случае достаточно добавить маркерный интерфейс implements&lt;br /&gt;
 * Serializable&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings({ &amp;quot;serial&amp;quot;})&lt;br /&gt;
public class Point1 implements Serializable {&lt;br /&gt;
	double x;&lt;br /&gt;
	double y;&lt;br /&gt;
&lt;br /&gt;
	Point1(double x, double y) {&lt;br /&gt;
		this.x = x;&lt;br /&gt;
		this.y = y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2476</id>
		<title>Java Serialization 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2476"/>
				<updated>2013-05-22T12:08:13Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* 1. Serialization.java (основная часть) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что почитать ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11&lt;br /&gt;
* [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java Object Serialization Specification]&lt;br /&gt;
&lt;br /&gt;
== 1. Serialization.java (основная часть) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.Externalizable;&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.ObjectInput;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutput;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.ObjectStreamField;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Лекция о сериализации в Java.&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings({&amp;quot;unused&amp;quot;})&lt;br /&gt;
public class Serialization {&lt;br /&gt;
&lt;br /&gt;
	/****Введение****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация -- запись объекта в байтовый поток.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Десереализация -- CO.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Все в пакете java.io&lt;br /&gt;
	 * &lt;br /&gt;
	 * Мотивация:&lt;br /&gt;
	 * 	1. dump (ex. JavaBeans persistence)&lt;br /&gt;
	 * 	2. RMI&lt;br /&gt;
	 */&lt;br /&gt;
	class Point {&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point1.java and SimplePointTest.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/****Процесс сериализации****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * В сериализации участвуют ВСЕ достижимые объекты.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Запись:&lt;br /&gt;
	 * 	1. Запись предка (если он сериализуем)&lt;br /&gt;
	 * 	2. Запись полей (если они сериализуемы)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Циклические зависимости корректно обрабатываются автоматически.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение:&lt;br /&gt;
	 * 	1. Выделение памяти под объект&lt;br /&gt;
	 * 	2. Чтение предка&lt;br /&gt;
	 * 	3. Чтение полей&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Все поля должны быть сериализуемы!&lt;br /&gt;
	 */&lt;br /&gt;
	@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
	class Polygon implements Serializable {&lt;br /&gt;
&lt;br /&gt;
		List&amp;lt;Point3&amp;gt; vertices = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Пока все просто, но впечатление обманчиво!&lt;br /&gt;
	 * &lt;br /&gt;
	 * 1. Внутреннее представление становится частью интерфейса&lt;br /&gt;
	 * 		Инкапсуляция летит к чертям!&lt;br /&gt;
	 * 2. Увеличивает объемы тестирования новых версий&lt;br /&gt;
	 * 3. Дополнительный конструктор! &lt;br /&gt;
	 * 		Необходимо обеспечивать все инварианты&lt;br /&gt;
	 * 		Некоторые дыры в безопасности&lt;br /&gt;
	 * 4. Все потомки становятся сериализуемыми!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/****Управление сериализацией****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Serial version UID (stream unique identifier)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Применяется для обеспечения совместимости, когда версии класса изменяются&lt;br /&gt;
	 * &lt;br /&gt;
	 * По-умолчанию автоматически создается на основе имени, интерфейсов, &lt;br /&gt;
	 * public и protected полей&lt;br /&gt;
	 * &lt;br /&gt;
	 * В случае несовпадения -- InvalidClassException&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point2 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Модификатор transient.&lt;br /&gt;
	 * Исключает поле из процесса сериализации.&lt;br /&gt;
	 * Примеры:&lt;br /&gt;
	 * 	1. Избыточная информация (предподсчитанные значения)&lt;br /&gt;
	 * 	2. Несериализуемые поля&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point3 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point3(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Настраиваемая сериализация &lt;br /&gt;
	 * Методы &lt;br /&gt;
	 * 	readObject(ObjectInputStream in) -- должен прочесть состояние из потока &lt;br /&gt;
	 * 	writeObject(ObjectOutputStream out) -- должен записать состояние в поток&lt;br /&gt;
	 * &lt;br /&gt;
	 * Процесс чтения&lt;br /&gt;
	 * 	1. Выделение памяти&lt;br /&gt;
	 * 	2. Вызов readObject&lt;br /&gt;
	 *  &lt;br /&gt;
	 */&lt;br /&gt;
	class Point4 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point4(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		/*&lt;br /&gt;
		 * Отвечает только за запись полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		 */&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм сериализации.&lt;br /&gt;
			 * Может вызываться только из writeObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//отвечает только за чтение полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм десериализации.&lt;br /&gt;
			 * Может вызываться только из readObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			//восстановление инвариантов&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point5.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Сериализация с несериализуемым предком.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Если хочется отнаследовать сериализуемый класс от &lt;br /&gt;
	 * несериализуемого предка, то могут быть проблемы...&lt;br /&gt;
	 * &lt;br /&gt;
	 * Формальное требование одно -- предок должен иметь &lt;br /&gt;
	 * конструктор по-умолчанию.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Но только ли?!&lt;br /&gt;
	 */&lt;br /&gt;
	class NonSerializablePoint {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
		&lt;br /&gt;
		protected double getX() {return x;}&lt;br /&gt;
		&lt;br /&gt;
		protected double getY() {return y;}&lt;br /&gt;
		&lt;br /&gt;
		protected void init(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		protected NonSerializablePoint() {}&lt;br /&gt;
		&lt;br /&gt;
		public NonSerializablePoint(double x, double y) {&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Serializable subclass of nonserializable stateful class&lt;br /&gt;
	class ColoredPoint extends NonSerializablePoint implements Serializable {&lt;br /&gt;
		private int color;&lt;br /&gt;
&lt;br /&gt;
		// Конструктор использует обычный механизм&lt;br /&gt;
		public ColoredPoint(double x, double y, int color) {&lt;br /&gt;
			super(x, y);&lt;br /&gt;
			this.color = color;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			// Manually deserialize and initialize superclass state&lt;br /&gt;
			double x = s.readDouble();&lt;br /&gt;
			double y = s.readDouble();&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
			// Manually serialize superclass state&lt;br /&gt;
			s.writeDouble(getX());&lt;br /&gt;
			s.writeDouble(getY());&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		private static final long serialVersionUID = 1856835860954L;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Externalizable&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация &amp;quot;в ручную&amp;quot;&lt;br /&gt;
	 *  &lt;br /&gt;
	 * 	void readExternal(ObjectInput in)&lt;br /&gt;
	 * 	void writeExternal(ObjectOutput out) &lt;br /&gt;
	 * &lt;br /&gt;
	 * Должен быть конструктор по-умолчанию&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение: вызов конструктора по-умолчанию, вызов readExternal&lt;br /&gt;
	 */&lt;br /&gt;
	class Point6 implements Externalizable {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
&lt;br /&gt;
		Point6(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		@Override&lt;br /&gt;
		public void writeExternal(ObjectOutput out) throws IOException {&lt;br /&gt;
			out.writeDouble(x);&lt;br /&gt;
			out.writeDouble(y);&lt;br /&gt;
		}&lt;br /&gt;
		@Override&lt;br /&gt;
		public void readExternal(ObjectInput in) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			this.x = in.readDouble();&lt;br /&gt;
			this.y = in.readDouble();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &amp;quot;Подмена&amp;quot; сериализуемого объекта.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Когда вместо самого объекта сериализуется его альтернативное представление&lt;br /&gt;
	 * в виде другого объекта некоторого (возможно того же самого) сериализуемого класса. &lt;br /&gt;
	 * &lt;br /&gt;
	 * Object writeReplace() -- какой объект записать вместо данного&lt;br /&gt;
	 * Object readResolve() -- какой объект восстановить вместо прочитанного&lt;br /&gt;
	 * &lt;br /&gt;
	 * Реализуются у разных классов!!!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
import java.io.Externalizable;&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.ObjectInput;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutput;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.ObjectStreamField;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Лекция о сериализации в Java.&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings({&amp;quot;unused&amp;quot;})&lt;br /&gt;
public class Serialization {&lt;br /&gt;
&lt;br /&gt;
	/****Введение****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация -- запись объекта в байтовый поток.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Десереализация -- CO.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Все в пакете java.io&lt;br /&gt;
	 * &lt;br /&gt;
	 * Мотивация:&lt;br /&gt;
	 * 	1. dump (ex. JavaBeans persistence)&lt;br /&gt;
	 * 	2. RMI&lt;br /&gt;
	 */&lt;br /&gt;
	class Point {&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point1.java and SimplePointTest.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/****Процесс сериализации****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * В сериализации участвуют ВСЕ достижимые объекты.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Запись:&lt;br /&gt;
	 * 	1. Запись предка (если он сериализуем)&lt;br /&gt;
	 * 	2. Запись полей (если они сериализуемы)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Циклические зависимости корректно обрабатываются автоматически.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение:&lt;br /&gt;
	 * 	1. Выделение памяти под объект&lt;br /&gt;
	 * 	2. Чтение предка&lt;br /&gt;
	 * 	3. Чтение полей&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Все поля должны быть сериализуемы!&lt;br /&gt;
	 */&lt;br /&gt;
	@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
	class Polygon implements Serializable {&lt;br /&gt;
&lt;br /&gt;
		List&amp;lt;Point3&amp;gt; vertices = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Пока все просто, но впечатление обманчиво!&lt;br /&gt;
	 * &lt;br /&gt;
	 * 1. Внутреннее представление становится частью интерфейса&lt;br /&gt;
	 * 		Инкапсуляция летит к чертям!&lt;br /&gt;
	 * 2. Увеличивает объемы тестирования новых версий&lt;br /&gt;
	 * 3. Дополнительный конструктор! &lt;br /&gt;
	 * 		Необходимо обеспечивать все инварианты&lt;br /&gt;
	 * 		Некоторые дыры в безопасности&lt;br /&gt;
	 * 4. Все потомки становятся сериализуемыми!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/****Управление сериализацией****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Serial version UID (stream unique identifier)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Применяется для обеспечения совместимости, когда версии класса изменяются&lt;br /&gt;
	 * &lt;br /&gt;
	 * По-умолчанию автоматически создается на основе имени, интерфейсов, &lt;br /&gt;
	 * public и protected полей&lt;br /&gt;
	 * &lt;br /&gt;
	 * В случае несовпадения -- InvalidClassException&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point2 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Модификатор transient.&lt;br /&gt;
	 * Исключает поле из процесса сериализации.&lt;br /&gt;
	 * Примеры:&lt;br /&gt;
	 * 	1. Избыточная информация (предподсчитанные значения)&lt;br /&gt;
	 * 	2. Несериализуемые поля&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point3 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point3(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Настраиваемая сериализация &lt;br /&gt;
	 * Методы &lt;br /&gt;
	 * 	readObject(ObjectInputStream in) -- должен прочесть состояние из потока &lt;br /&gt;
	 * 	writeObject(ObjectOutputStream out) -- должен записать состояние в поток&lt;br /&gt;
	 * &lt;br /&gt;
	 * Процесс чтения&lt;br /&gt;
	 * 	1. Выделение памяти&lt;br /&gt;
	 * 	2. Вызов readObject&lt;br /&gt;
	 *  &lt;br /&gt;
	 */&lt;br /&gt;
	class Point4 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point4(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		/*&lt;br /&gt;
		 * Отвечает только за запись полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		 */&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм сериализации.&lt;br /&gt;
			 * Может вызываться только из writeObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//отвечает только за чтение полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм десериализации.&lt;br /&gt;
			 * Может вызываться только из readObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			//восстановление инвариантов&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point5.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Сериализация с несериализуемым предком.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Если хочется отнаследовать сериализуемый класс от &lt;br /&gt;
	 * несериализуемого предка, то могут быть проблемы...&lt;br /&gt;
	 * &lt;br /&gt;
	 * Формальное требование одно -- предок должен иметь &lt;br /&gt;
	 * конструктор по-умолчанию.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Но только ли?!&lt;br /&gt;
	 */&lt;br /&gt;
	class NonSerializablePoint {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
		&lt;br /&gt;
		protected double getX() {return x;}&lt;br /&gt;
		&lt;br /&gt;
		protected double getY() {return y;}&lt;br /&gt;
		&lt;br /&gt;
		protected void init(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		protected NonSerializablePoint() {}&lt;br /&gt;
		&lt;br /&gt;
		public NonSerializablePoint(double x, double y) {&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Serializable subclass of nonserializable stateful class&lt;br /&gt;
	class ColoredPoint extends NonSerializablePoint implements Serializable {&lt;br /&gt;
		private int color;&lt;br /&gt;
&lt;br /&gt;
		// Конструктор использует обычный механизм&lt;br /&gt;
		public ColoredPoint(double x, double y, int color) {&lt;br /&gt;
			super(x, y);&lt;br /&gt;
			this.color = color;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			// Manually deserialize and initialize superclass state&lt;br /&gt;
			double x = s.readDouble();&lt;br /&gt;
			double y = s.readDouble();&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
			// Manually serialize superclass state&lt;br /&gt;
			s.writeDouble(getX());&lt;br /&gt;
			s.writeDouble(getY());&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		private static final long serialVersionUID = 1856835860954L;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Externalizable&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация &amp;quot;в ручную&amp;quot;&lt;br /&gt;
	 *  &lt;br /&gt;
	 * 	void readExternal(ObjectInput in)&lt;br /&gt;
	 * 	void writeExternal(ObjectOutput out) &lt;br /&gt;
	 * &lt;br /&gt;
	 * Должен быть конструктор по-умолчанию&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение: вызов конструктора по-умолчанию, вызов readExternal&lt;br /&gt;
	 */&lt;br /&gt;
	class Point6 implements Externalizable {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
&lt;br /&gt;
		Point6(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		@Override&lt;br /&gt;
		public void writeExternal(ObjectOutput out) throws IOException {&lt;br /&gt;
			out.writeDouble(x);&lt;br /&gt;
			out.writeDouble(y);&lt;br /&gt;
		}&lt;br /&gt;
		@Override&lt;br /&gt;
		public void readExternal(ObjectInput in) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			this.x = in.readDouble();&lt;br /&gt;
			this.y = in.readDouble();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &amp;quot;Подмена&amp;quot; сериализуемого объекта.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Когда вместо самого объекта сериализуется его альтернативное представление&lt;br /&gt;
	 * в виде другого объекта некоторого (возможно того же самого) сериализуемого класса. &lt;br /&gt;
	 * &lt;br /&gt;
	 * Object writeReplace() -- какой объект записать вместо данного&lt;br /&gt;
	 * Object readResolve() -- какой объект восстановить вместо прочитанного&lt;br /&gt;
	 * &lt;br /&gt;
	 * Реализуются у разных классов!!!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2475</id>
		<title>Java Serialization 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2475"/>
				<updated>2013-05-22T12:07:39Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* 1. TestFrame */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что почитать ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11&lt;br /&gt;
* [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java Object Serialization Specification]&lt;br /&gt;
&lt;br /&gt;
== 1. Serialization.java (основная часть) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.Externalizable;&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.ObjectInput;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutput;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.ObjectStreamField;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Лекция о сериализации в Java.&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings({&amp;quot;unused&amp;quot;})&lt;br /&gt;
public class Serialization {&lt;br /&gt;
&lt;br /&gt;
	/****Введение****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация -- запись объекта в байтовый поток.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Десереализация -- CO.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Все в пакете java.io&lt;br /&gt;
	 * &lt;br /&gt;
	 * Мотивация:&lt;br /&gt;
	 * 	1. dump (ex. JavaBeans persistence)&lt;br /&gt;
	 * 	2. RMI&lt;br /&gt;
	 */&lt;br /&gt;
	class Point {&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point1.java and SimplePointTest.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/****Процесс сериализации****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * В сериализации участвуют ВСЕ достижимые объекты.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Запись:&lt;br /&gt;
	 * 	1. Запись предка (если он сериализуем)&lt;br /&gt;
	 * 	2. Запись полей (если они сериализуемы)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Циклические зависимости корректно обрабатываются автоматически.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение:&lt;br /&gt;
	 * 	1. Выделение памяти под объект&lt;br /&gt;
	 * 	2. Чтение предка&lt;br /&gt;
	 * 	3. Чтение полей&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Все поля должны быть сериализуемы!&lt;br /&gt;
	 */&lt;br /&gt;
	@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
	class Polygon implements Serializable {&lt;br /&gt;
&lt;br /&gt;
		List&amp;lt;Point3&amp;gt; vertices = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Пока все просто, но впечатление обманчиво!&lt;br /&gt;
	 * &lt;br /&gt;
	 * 1. Внутреннее представление становится частью интерфейса&lt;br /&gt;
	 * 		Инкапсуляция летит к чертям!&lt;br /&gt;
	 * 2. Увеличивает объемы тестирования новых версий&lt;br /&gt;
	 * 3. Дополнительный конструктор! &lt;br /&gt;
	 * 		Необходимо обеспечивать все инварианты&lt;br /&gt;
	 * 		Некоторые дыры в безопасности&lt;br /&gt;
	 * 4. Все потомки становятся сериализуемыми!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/****Управление сериализацией****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Serial version UID (stream unique identifier)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Применяется для обеспечения совместимости, когда версии класса изменяются&lt;br /&gt;
	 * &lt;br /&gt;
	 * По-умолчанию автоматически создается на основе имени, интерфейсов, &lt;br /&gt;
	 * public и protected полей&lt;br /&gt;
	 * &lt;br /&gt;
	 * В случае несовпадения -- InvalidClassException&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point2 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Модификатор transient.&lt;br /&gt;
	 * Исключает поле из процесса сериализации.&lt;br /&gt;
	 * Примеры:&lt;br /&gt;
	 * 	1. Избыточная информация (предподсчитанные значения)&lt;br /&gt;
	 * 	2. Несериализуемые поля&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point3 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point3(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Настраиваемая сериализация &lt;br /&gt;
	 * Методы &lt;br /&gt;
	 * 	readObject(ObjectInputStream in) -- должен прочесть состояние из потока &lt;br /&gt;
	 * 	writeObject(ObjectOutputStream out) -- должен записать состояние в поток&lt;br /&gt;
	 * &lt;br /&gt;
	 * Процесс чтения&lt;br /&gt;
	 * 	1. Выделение памяти&lt;br /&gt;
	 * 	2. Вызов readObject&lt;br /&gt;
	 *  &lt;br /&gt;
	 */&lt;br /&gt;
	class Point4 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point4(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		/*&lt;br /&gt;
		 * Отвечает только за запись полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		 */&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм сериализации.&lt;br /&gt;
			 * Может вызываться только из writeObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//отвечает только за чтение полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм десериализации.&lt;br /&gt;
			 * Может вызываться только из readObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			//восстановление инвариантов&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point5.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Сериализация с несериализуемым предком.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Если хочется отнаследовать сериализуемый класс от &lt;br /&gt;
	 * несериализуемого предка, то могут быть проблемы...&lt;br /&gt;
	 * &lt;br /&gt;
	 * Формальное требование одно -- предок должен иметь &lt;br /&gt;
	 * конструктор по-умолчанию.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Но только ли?!&lt;br /&gt;
	 */&lt;br /&gt;
	class NonSerializablePoint {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
		&lt;br /&gt;
		protected double getX() {return x;}&lt;br /&gt;
		&lt;br /&gt;
		protected double getY() {return y;}&lt;br /&gt;
		&lt;br /&gt;
		protected void init(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		protected NonSerializablePoint() {}&lt;br /&gt;
		&lt;br /&gt;
		public NonSerializablePoint(double x, double y) {&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Serializable subclass of nonserializable stateful class&lt;br /&gt;
	class ColoredPoint extends NonSerializablePoint implements Serializable {&lt;br /&gt;
		private int color;&lt;br /&gt;
&lt;br /&gt;
		// Конструктор использует обычный механизм&lt;br /&gt;
		public ColoredPoint(double x, double y, int color) {&lt;br /&gt;
			super(x, y);&lt;br /&gt;
			this.color = color;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			// Manually deserialize and initialize superclass state&lt;br /&gt;
			double x = s.readDouble();&lt;br /&gt;
			double y = s.readDouble();&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
			// Manually serialize superclass state&lt;br /&gt;
			s.writeDouble(getX());&lt;br /&gt;
			s.writeDouble(getY());&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		private static final long serialVersionUID = 1856835860954L;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Externalizable&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация &amp;quot;в ручную&amp;quot;&lt;br /&gt;
	 *  &lt;br /&gt;
	 * 	void readExternal(ObjectInput in)&lt;br /&gt;
	 * 	void writeExternal(ObjectOutput out) &lt;br /&gt;
	 * &lt;br /&gt;
	 * Должен быть конструктор по-умолчанию&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение: вызов конструктора по-умолчанию, вызов readExternal&lt;br /&gt;
	 */&lt;br /&gt;
	class Point6 implements Externalizable {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
&lt;br /&gt;
		Point6(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		@Override&lt;br /&gt;
		public void writeExternal(ObjectOutput out) throws IOException {&lt;br /&gt;
			out.writeDouble(x);&lt;br /&gt;
			out.writeDouble(y);&lt;br /&gt;
		}&lt;br /&gt;
		@Override&lt;br /&gt;
		public void readExternal(ObjectInput in) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			this.x = in.readDouble();&lt;br /&gt;
			this.y = in.readDouble();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &amp;quot;Подмена&amp;quot; сериализуемого объекта.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Когда вместо самого объекта сериализуется его альтернативное представление&lt;br /&gt;
	 * в виде другого объекта некоторого (возможно того же самого) сериализуемого класса. &lt;br /&gt;
	 * &lt;br /&gt;
	 * Object writeReplace() -- какой объект записать вместо данного&lt;br /&gt;
	 * Object readResolve() -- какой объект восстановить вместо прочитанного&lt;br /&gt;
	 * &lt;br /&gt;
	 * Реализуются у разных классов!!!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2474</id>
		<title>Java Serialization 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2474"/>
				<updated>2013-05-22T12:06:28Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* 1. TestFrame */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что почитать ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11&lt;br /&gt;
* [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java Object Serialization Specification]&lt;br /&gt;
&lt;br /&gt;
== 1. TestFrame ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.Externalizable;&lt;br /&gt;
import java.io.FileInputStream;&lt;br /&gt;
import java.io.FileNotFoundException;&lt;br /&gt;
import java.io.FileOutputStream;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStream;&lt;br /&gt;
import java.io.ObjectInput;&lt;br /&gt;
import java.io.ObjectInputStream;&lt;br /&gt;
import java.io.ObjectOutput;&lt;br /&gt;
import java.io.ObjectOutputStream;&lt;br /&gt;
import java.io.ObjectStreamField;&lt;br /&gt;
import java.io.OutputStream;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.util.ArrayList;&lt;br /&gt;
import java.util.List;&lt;br /&gt;
&lt;br /&gt;
import org.junit.Test;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Лекция о сериализации в Java.&lt;br /&gt;
 */&lt;br /&gt;
@SuppressWarnings({&amp;quot;unused&amp;quot;})&lt;br /&gt;
public class Serialization {&lt;br /&gt;
&lt;br /&gt;
	/****Введение****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация -- запись объекта в байтовый поток.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Десереализация -- CO.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Все в пакете java.io&lt;br /&gt;
	 * &lt;br /&gt;
	 * Мотивация:&lt;br /&gt;
	 * 	1. dump (ex. JavaBeans persistence)&lt;br /&gt;
	 * 	2. RMI&lt;br /&gt;
	 */&lt;br /&gt;
	class Point {&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point1.java and SimplePointTest.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/****Процесс сериализации****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * В сериализации участвуют ВСЕ достижимые объекты.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Запись:&lt;br /&gt;
	 * 	1. Запись предка (если он сериализуем)&lt;br /&gt;
	 * 	2. Запись полей (если они сериализуемы)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Циклические зависимости корректно обрабатываются автоматически.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение:&lt;br /&gt;
	 * 	1. Выделение памяти под объект&lt;br /&gt;
	 * 	2. Чтение предка&lt;br /&gt;
	 * 	3. Чтение полей&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Все поля должны быть сериализуемы!&lt;br /&gt;
	 */&lt;br /&gt;
	@SuppressWarnings(&amp;quot;serial&amp;quot;)&lt;br /&gt;
	class Polygon implements Serializable {&lt;br /&gt;
&lt;br /&gt;
		List&amp;lt;Point3&amp;gt; vertices = new ArrayList&amp;lt;&amp;gt;();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Пока все просто, но впечатление обманчиво!&lt;br /&gt;
	 * &lt;br /&gt;
	 * 1. Внутреннее представление становится частью интерфейса&lt;br /&gt;
	 * 		Инкапсуляция летит к чертям!&lt;br /&gt;
	 * 2. Увеличивает объемы тестирования новых версий&lt;br /&gt;
	 * 3. Дополнительный конструктор! &lt;br /&gt;
	 * 		Необходимо обеспечивать все инварианты&lt;br /&gt;
	 * 		Некоторые дыры в безопасности&lt;br /&gt;
	 * 4. Все потомки становятся сериализуемыми!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
	/****Управление сериализацией****/&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Serial version UID (stream unique identifier)&lt;br /&gt;
	 * &lt;br /&gt;
	 * Применяется для обеспечения совместимости, когда версии класса изменяются&lt;br /&gt;
	 * &lt;br /&gt;
	 * По-умолчанию автоматически создается на основе имени, интерфейсов, &lt;br /&gt;
	 * public и protected полей&lt;br /&gt;
	 * &lt;br /&gt;
	 * В случае несовпадения -- InvalidClassException&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point2 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Модификатор transient.&lt;br /&gt;
	 * Исключает поле из процесса сериализации.&lt;br /&gt;
	 * Примеры:&lt;br /&gt;
	 * 	1. Избыточная информация (предподсчитанные значения)&lt;br /&gt;
	 * 	2. Несериализуемые поля&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	class Point3 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point3(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Настраиваемая сериализация &lt;br /&gt;
	 * Методы &lt;br /&gt;
	 * 	readObject(ObjectInputStream in) -- должен прочесть состояние из потока &lt;br /&gt;
	 * 	writeObject(ObjectOutputStream out) -- должен записать состояние в поток&lt;br /&gt;
	 * &lt;br /&gt;
	 * Процесс чтения&lt;br /&gt;
	 * 	1. Выделение памяти&lt;br /&gt;
	 * 	2. Вызов readObject&lt;br /&gt;
	 *  &lt;br /&gt;
	 */&lt;br /&gt;
	class Point4 implements Serializable {&lt;br /&gt;
		private static final long serialVersionUID = 4889340678034881968L;&lt;br /&gt;
&lt;br /&gt;
		double x;&lt;br /&gt;
		double y;&lt;br /&gt;
		&lt;br /&gt;
		transient int precomputedHash;&lt;br /&gt;
		&lt;br /&gt;
		public int hashCode() {&lt;br /&gt;
			return precomputedHash;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private int countHash() {&lt;br /&gt;
			//some very involved procedure&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		Point4(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		/*&lt;br /&gt;
		 * Отвечает только за запись полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		 */&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм сериализации.&lt;br /&gt;
			 * Может вызываться только из writeObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		//отвечает только за чтение полей ЭТОГО класса, не предка и не потомка!&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			/*&lt;br /&gt;
			 * Реализует стандартный механизм десериализации.&lt;br /&gt;
			 * Может вызываться только из readObject, иначе NotActiveException&lt;br /&gt;
			 */&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			//восстановление инвариантов&lt;br /&gt;
			precomputedHash = countHash();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	//move to Point5.java&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Сериализация с несериализуемым предком.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Если хочется отнаследовать сериализуемый класс от &lt;br /&gt;
	 * несериализуемого предка, то могут быть проблемы...&lt;br /&gt;
	 * &lt;br /&gt;
	 * Формальное требование одно -- предок должен иметь &lt;br /&gt;
	 * конструктор по-умолчанию.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Но только ли?!&lt;br /&gt;
	 */&lt;br /&gt;
	class NonSerializablePoint {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
		&lt;br /&gt;
		protected double getX() {return x;}&lt;br /&gt;
		&lt;br /&gt;
		protected double getY() {return y;}&lt;br /&gt;
		&lt;br /&gt;
		protected void init(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		protected NonSerializablePoint() {}&lt;br /&gt;
		&lt;br /&gt;
		public NonSerializablePoint(double x, double y) {&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// Serializable subclass of nonserializable stateful class&lt;br /&gt;
	class ColoredPoint extends NonSerializablePoint implements Serializable {&lt;br /&gt;
		private int color;&lt;br /&gt;
&lt;br /&gt;
		// Конструктор использует обычный механизм&lt;br /&gt;
		public ColoredPoint(double x, double y, int color) {&lt;br /&gt;
			super(x, y);&lt;br /&gt;
			this.color = color;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void readObject(ObjectInputStream s) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			s.defaultReadObject();&lt;br /&gt;
			// Manually deserialize and initialize superclass state&lt;br /&gt;
			double x = s.readDouble();&lt;br /&gt;
			double y = s.readDouble();&lt;br /&gt;
			init(x, y);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		private void writeObject(ObjectOutputStream s) throws IOException {&lt;br /&gt;
			s.defaultWriteObject();&lt;br /&gt;
			// Manually serialize superclass state&lt;br /&gt;
			s.writeDouble(getX());&lt;br /&gt;
			s.writeDouble(getY());&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		private static final long serialVersionUID = 1856835860954L;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Externalizable&lt;br /&gt;
	 * &lt;br /&gt;
	 * Сериализация &amp;quot;в ручную&amp;quot;&lt;br /&gt;
	 *  &lt;br /&gt;
	 * 	void readExternal(ObjectInput in)&lt;br /&gt;
	 * 	void writeExternal(ObjectOutput out) &lt;br /&gt;
	 * &lt;br /&gt;
	 * Должен быть конструктор по-умолчанию&lt;br /&gt;
	 * &lt;br /&gt;
	 * Чтение: вызов конструктора по-умолчанию, вызов readExternal&lt;br /&gt;
	 */&lt;br /&gt;
	class Point6 implements Externalizable {&lt;br /&gt;
		private double x;&lt;br /&gt;
		private double y;&lt;br /&gt;
&lt;br /&gt;
		Point6(double x, double y) {&lt;br /&gt;
			this.x = x;&lt;br /&gt;
			this.y = y;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		@Override&lt;br /&gt;
		public void writeExternal(ObjectOutput out) throws IOException {&lt;br /&gt;
			out.writeDouble(x);&lt;br /&gt;
			out.writeDouble(y);&lt;br /&gt;
		}&lt;br /&gt;
		@Override&lt;br /&gt;
		public void readExternal(ObjectInput in) throws IOException,&lt;br /&gt;
				ClassNotFoundException {&lt;br /&gt;
			this.x = in.readDouble();&lt;br /&gt;
			this.y = in.readDouble();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * &amp;quot;Подмена&amp;quot; сериализуемого объекта.&lt;br /&gt;
	 * &lt;br /&gt;
	 * Когда вместо самого объекта сериализуется его альтернативное представление&lt;br /&gt;
	 * в виде другого объекта некоторого (возможно того же самого) сериализуемого класса. &lt;br /&gt;
	 * &lt;br /&gt;
	 * Object writeReplace() -- какой объект записать вместо данного&lt;br /&gt;
	 * Object readResolve() -- какой объект восстановить вместо прочитанного&lt;br /&gt;
	 * &lt;br /&gt;
	 * Реализуются у разных классов!!!&lt;br /&gt;
	 */&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2473</id>
		<title>Java Serialization 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2473"/>
				<updated>2013-05-22T11:36:06Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Что почитать */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что почитать ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11&lt;br /&gt;
* [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java Object Serialization Specification]&lt;br /&gt;
&lt;br /&gt;
== 1. TestFrame ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import javax.swing.*;&lt;br /&gt;
&lt;br /&gt;
public class testFrame {&lt;br /&gt;
	public static void main (String [] args) {&lt;br /&gt;
		JFrame myWindow = new JFrame(&amp;quot;Пробное окно&amp;quot;);&lt;br /&gt;
		myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;
		myWindow.setSize(400, 300);&lt;br /&gt;
		myWindow.setVisible(true);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2472</id>
		<title>Java Serialization 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Serialization_2013&amp;diff=2472"/>
				<updated>2013-05-22T11:34:38Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: Новая страница: «== Что почитать ==  * &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11 * [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java O…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Что почитать ==&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch, Chapter 11&lt;br /&gt;
* [http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html Java Object Serialization Specification]&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2318</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2318"/>
				<updated>2013-04-23T17:11:28Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
*[[Java_2013-02-08|Лекция 1]]&lt;br /&gt;
*[[Медиа:Java_2013_02.ppt|Лекция 2]]&lt;br /&gt;
*[http://neerc.ifmo.ru/~kgeorgiy/courses/java-advanced/slides/exceptions.pps Лекция 3 (часть 1)]&amp;lt;br&amp;gt;[[Медиа:Java_2013_03_2.ppt|Лекция 3 (часть 2)]]&lt;br /&gt;
*[[Java_2013-02-27|Лекция 4]]&lt;br /&gt;
*[[Медиа:Java_2013_05.ppt|Лекция 5 (часть 2)]]&lt;br /&gt;
*[[Медиа:Java_2013_05-2.ppt|Лекция 6]]&lt;br /&gt;
*[[Медиа:Java_2013_06.ppt|Лекция 7]]&lt;br /&gt;
*[[Медиа:Java_2013_08.ppt|Лекция 8]]&lt;br /&gt;
&lt;br /&gt;
== Задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/d/db/Java_hmw_2013_03_06.pdf Третье задание] срок сдачи: 06 марта&lt;br /&gt;
* [[Java_2013_HW4|Четвертое задание]] срок сдачи: 13 марта&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c4/Java_hmw_2013_03_20.pdf Пятое задание] срок сдачи: &amp;lt;b&amp;gt;продлен до 27 марта&amp;lt;/b&amp;gt;&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/79/Java_hmw_2013_04_03.pdf Шестое задание] срок сдачи: 3 апреля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/f/fb/Java_hmw_2013_04_10.pdf Седьмое задание] срок сдачи: 10 апреля&lt;br /&gt;
* [[Java 2013 CW1|Контрольная работа]]&lt;br /&gt;
* [[Java_2013_HW8|Восьмое задание]] срок сдачи: 17 апреля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/4/4c/Java_hmw_2013_9.pdf Девятое задание] срок сдачи 1 мая &amp;lt;b&amp;gt;или&amp;lt;/b&amp;gt; [http://mit.spbau.ru/sewiki/images/7/75/Java_2013_10.pdf Десятое задание] срок сдачи 15 мая и вес &amp;lt;b&amp;gt;20 баллов&amp;lt;/b&amp;gt;. Десятое задание для тех, кто хотел поприменять java.util.concurrent (предупреждение: вам потребуется самостоятельно немного почитать про сеть, сокеты и т.п. )&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве точки входа должен использоваться класс с именем &amp;lt;b&amp;gt;Main&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* Перехват исключений слишком общeго типа&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_2013_10.pdf&amp;diff=2317</id>
		<title>Файл:Java 2013 10.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_2013_10.pdf&amp;diff=2317"/>
				<updated>2013-04-23T17:00:08Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_9.pdf&amp;diff=2316</id>
		<title>Файл:Java hmw 2013 9.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_9.pdf&amp;diff=2316"/>
				<updated>2013-04-23T16:57:43Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2278</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2278"/>
				<updated>2013-03-25T21:11:06Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
*[[Java_2013-02-08|Лекция 1]]&lt;br /&gt;
*[[Медиа:Java_2013_02.ppt|Лекция 2]]&lt;br /&gt;
*[http://neerc.ifmo.ru/~kgeorgiy/courses/java-advanced/slides/exceptions.pps Лекция 3 (часть 1)]&amp;lt;br&amp;gt;[[Медиа:Java_2013_03_2.ppt|Лекция 3 (часть 2)]]&lt;br /&gt;
*[[Java_2013-02-27|Лекция 4]]&lt;br /&gt;
*[[Медиа:Java_2013_05.ppt|Лекция 5 (часть 2)]]&lt;br /&gt;
*[[Медиа:Java_2013_06.ppt|Лекция 7]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/d/db/Java_hmw_2013_03_06.pdf Третье задание] срок сдачи: 06 марта&lt;br /&gt;
* [[Java_2013_HW4|Четвертое задание]] срок сдачи: 13 марта&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c4/Java_hmw_2013_03_20.pdf Пятое задание] срок сдачи: &amp;lt;b&amp;gt;продлен до 27 марта&amp;lt;/b&amp;gt;&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/79/Java_hmw_2013_04_03.pdf Шестое задание] срок сдачи: 3 апреля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/f/fb/Java_hmw_2013_04_10.pdf Седьмое задание] срок сдачи: 10 апреля&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве точки входа должен использоваться класс с именем &amp;lt;b&amp;gt;Main&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* Перехват исключений слишком общeго типа&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_04_10.pdf&amp;diff=2277</id>
		<title>Файл:Java hmw 2013 04 10.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_04_10.pdf&amp;diff=2277"/>
				<updated>2013-03-25T21:10:31Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2271</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2271"/>
				<updated>2013-03-21T20:52:54Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
*[[Java_2013-02-08|Лекция 1]]&lt;br /&gt;
*[[Медиа:Java_2013_02.ppt|Лекция 2]]&lt;br /&gt;
*[http://neerc.ifmo.ru/~kgeorgiy/courses/java-advanced/slides/exceptions.pps Лекция 3 (часть 1)]&amp;lt;br&amp;gt;[[Медиа:Java_2013_03_2.ppt|Лекция 3 (часть 2)]]&lt;br /&gt;
*[[Java_2013-02-27|Лекция 4]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/d/db/Java_hmw_2013_03_06.pdf Третье задание] срок сдачи: 06 марта&lt;br /&gt;
* [[Java_2013_HW4|Четвертое задание]] срок сдачи: 13 марта&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c4/Java_hmw_2013_03_20.pdf Пятое задание] срок сдачи: &amp;lt;b&amp;gt;продлен до 27 марта&amp;lt;/b&amp;gt;&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/79/Java_hmw_2013_04_03.pdf Шестое задание] срок сдачи: 3 апреля&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве точки входа должен использоваться класс с именем &amp;lt;b&amp;gt;Main&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* Перехват исключений слишком общeго типа&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_04_03.pdf&amp;diff=2270</id>
		<title>Файл:Java hmw 2013 04 03.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_04_03.pdf&amp;diff=2270"/>
				<updated>2013-03-21T20:51:53Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2257</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2257"/>
				<updated>2013-03-15T22:00:59Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
*[[Java_2013-02-08|Лекция 1]]&lt;br /&gt;
*[[Медиа:Java_2013_02.ppt|Лекция 2]]&lt;br /&gt;
*[http://neerc.ifmo.ru/~kgeorgiy/courses/java-advanced/slides/exceptions.pps Лекция 3 (часть 1)]&amp;lt;br&amp;gt;[[Медиа:Java_2013_03_2.ppt|Лекция 3 (часть 2)]]&lt;br /&gt;
*[[Java_2013-02-27|Лекция 4]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/d/db/Java_hmw_2013_03_06.pdf Третье задание] срок сдачи: 06 марта&lt;br /&gt;
* [[Java_2013_HW4|Четвертое задание]] срок сдачи: 13 марта&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c4/Java_hmw_2013_03_20.pdf Пятое задание] срок сдачи: &amp;lt;b&amp;gt;продлен до 27 марта&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве точки входа должен использоваться класс с именем &amp;lt;b&amp;gt;Main&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* Перехват исключений слишком общeго типа&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2234</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2234"/>
				<updated>2013-03-10T00:49:39Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
*[[Java_2013-02-08|Лекция 1]]&lt;br /&gt;
*[[Медиа:Java_2013_02.ppt|Лекция 2]]&lt;br /&gt;
*[http://neerc.ifmo.ru/~kgeorgiy/courses/java-advanced/slides/exceptions.pps Лекция 3 (часть 1)]&amp;lt;br&amp;gt;[[Медиа:Java_2013_03_2.ppt|Лекция 3 (часть 2)]]&lt;br /&gt;
*[[Java_2013-02-27|Лекция 4]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/d/db/Java_hmw_2013_03_06.pdf Третье задание] срок сдачи: 06 марта&lt;br /&gt;
* [[Java_2013_HW4|Четвертое задание]] срок сдачи: 13 марта&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c4/Java_hmw_2013_03_20.pdf Пятое задание] срок сдачи: 20 марта&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве точки входа должен использоваться класс с именем &amp;lt;b&amp;gt;Main&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* Перехват исключений слишком общeго типа&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_03_20.pdf&amp;diff=2233</id>
		<title>Файл:Java hmw 2013 03 20.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_03_20.pdf&amp;diff=2233"/>
				<updated>2013-03-10T00:48:49Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2232</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2232"/>
				<updated>2013-03-10T00:02:48Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Форма поставки кода */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
*[[Java_2013-02-08|Лекция 1]]&lt;br /&gt;
*[[Медиа:Java_2013_02.ppt|Лекция 2]]&lt;br /&gt;
*[http://neerc.ifmo.ru/~kgeorgiy/courses/java-advanced/slides/exceptions.pps Лекция 3 (часть 1)]&amp;lt;br&amp;gt;[[Медиа:Java_2013_03_2.ppt|Лекция 3 (часть 2)]]&lt;br /&gt;
*[[Java_2013-02-27|Лекция 4]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/d/db/Java_hmw_2013_03_06.pdf Третье задание] срок сдачи: 06 марта&lt;br /&gt;
* [[Java_2013_HW4|Четвертое задание]] срок сдачи: 13 марта&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве точки входа должен использоваться класс с именем &amp;lt;b&amp;gt;Main&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* Перехват исключений слишком общeго типа&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2231</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2231"/>
				<updated>2013-03-10T00:01:24Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Exceptions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
*[[Java_2013-02-08|Лекция 1]]&lt;br /&gt;
*[[Медиа:Java_2013_02.ppt|Лекция 2]]&lt;br /&gt;
*[http://neerc.ifmo.ru/~kgeorgiy/courses/java-advanced/slides/exceptions.pps Лекция 3 (часть 1)]&amp;lt;br&amp;gt;[[Медиа:Java_2013_03_2.ppt|Лекция 3 (часть 2)]]&lt;br /&gt;
*[[Java_2013-02-27|Лекция 4]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/d/db/Java_hmw_2013_03_06.pdf Третье задание] срок сдачи: 06 марта&lt;br /&gt;
* [[Java_2013_HW4|Четвертое задание]] срок сдачи: 13 марта&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* Перехват исключений слишком общeго типа&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2176</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2176"/>
				<updated>2013-02-21T21:36:03Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
*[[Java_2013-02-08|Лекция 1]]&lt;br /&gt;
*[[Медиа:Java_2013_02.ppt|Лекция 2]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/d/db/Java_hmw_2013_03_06.pdf Третье задание] срок сдачи: 06 марта&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* catch (Exception ex)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_03_06.pdf&amp;diff=2175</id>
		<title>Файл:Java hmw 2013 03 06.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_03_06.pdf&amp;diff=2175"/>
				<updated>2013-02-21T21:34:38Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2164</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2164"/>
				<updated>2013-02-14T13:01:41Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
[[Java_2013-02-08|Лекция 1]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e4/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* catch (Exception ex)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2163</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2163"/>
				<updated>2013-02-14T12:53:46Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dG12aDM0MjI3NlJiOVdXVHpXNVA4alE&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
[[Java_2013-02-08|Лекция 1]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_27.pdf Второе задание] срок сдачи: 27 февраля&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* catch (Exception ex)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_02_27.pdf&amp;diff=2162</id>
		<title>Файл:Java hmw 2013 02 27.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_02_27.pdf&amp;diff=2162"/>
				<updated>2013-02-14T12:53:30Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_02_27.pdf.pdf&amp;diff=2161</id>
		<title>Файл:Java hmw 2013 02 27.pdf.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_02_27.pdf.pdf&amp;diff=2161"/>
				<updated>2013-02-14T12:52:11Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2135</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2135"/>
				<updated>2013-02-06T20:25:15Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/3/35/Java_hmw_2013_02_20.pdf Первое задание] срок сдачи: 20 февраля&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* catch (Exception ex)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_02_20.pdf&amp;diff=2134</id>
		<title>Файл:Java hmw 2013 02 20.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_2013_02_20.pdf&amp;diff=2134"/>
				<updated>2013-02-06T20:24:26Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2133</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2133"/>
				<updated>2013-02-06T13:06:11Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Javadoc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* catch (Exception ex)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2132</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2132"/>
				<updated>2013-02-06T12:17:29Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* catch (Exception ex)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2131</id>
		<title>Java 2013</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_2013&amp;diff=2131"/>
				<updated>2013-02-06T12:15:34Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Лектор - Кузнецов Антон&lt;br /&gt;
&lt;br /&gt;
Практика - Нурк Сергей&lt;br /&gt;
&lt;br /&gt;
== Лекции ==&lt;br /&gt;
&lt;br /&gt;
== Практические задания ==&lt;br /&gt;
&lt;br /&gt;
== Программа курса ==&lt;br /&gt;
&lt;br /&gt;
== Список литературы ==&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* catch (Exception ex)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1406</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1406"/>
				<updated>2012-04-26T19:16:19Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Новости ==&lt;br /&gt;
* 21.02 -- Лучше поздно, чем никогда! Внизу страницы появилось несколько примеров работы с исключениями.&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dDdEZ1NaUWdUakpFdGowRGMwYWVOSGc&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Материалы с лекций ==&lt;br /&gt;
* [[Java_2012-02-09 | Лекция №1]]&lt;br /&gt;
* [[Java_2012-03-00 | Лекция про Generics]]&lt;br /&gt;
* [[Java_2012-03-07 | Лекция про внутренние классы]]&lt;br /&gt;
* [[Медиа:Reflection.pdf | Reflection]]&lt;br /&gt;
* [[Java_2012-04-04 | Лекция про многопоточные программы]]&lt;br /&gt;
* [[Java_Concurrent | Лекция про concurrent &amp;amp; concurrent.util]]&lt;br /&gt;
* [[Java_Network | Лекция о работе с сетью]]&lt;br /&gt;
* [[Java_Swing | Лекция про Swing]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/71/Java_hmw_2012_02_15.pdf Первое задание] срок сдачи: 15 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c1/Java_hmw_2012_02_23_fix.pdf Второе задание] срок сдачи: 23 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/5/55/Java_hmw_3.pdf Третье задание] срок сдачи: 2 марта&lt;br /&gt;
* Четвертое домашнее задание, как вы уже знаете, у вас на выбор. [[Java_2012_02_29 | Первый вариант]], &amp;lt;b&amp;gt;черновик&amp;lt;/b&amp;gt; второго варианта [http://mit.spbau.ru/sewiki/images/b/b6/Java-hmw-4.pdf здесь].&lt;br /&gt;
* [[Java_2012_HW5 | Пятое задание]] НЕОБЯЗАТЕЛЬНО ДЛЯ ВЫПОЛНЕНИЯ&lt;br /&gt;
* [[Java_Test_20120321 | Контрольная]] &lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e5/Java_hmw_6.pdf Шестое задание] срок сдачи: конец семестра&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/1/18/Java_hmw_7.pdf Седьмое задание] срок сдачи: 17 апреля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/6/6c/Java_hmw_8.pdf Восьмое задание] срок сдачи: 10 мая&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* catch (Exception ex)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_8.pdf&amp;diff=1405</id>
		<title>Файл:Java hmw 8.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_8.pdf&amp;diff=1405"/>
				<updated>2012-04-26T19:15:04Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1272</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1272"/>
				<updated>2012-04-10T00:28:53Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Новости ==&lt;br /&gt;
* 21.02 -- Лучше поздно, чем никогда! Внизу страницы появилось несколько примеров работы с исключениями.&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dDdEZ1NaUWdUakpFdGowRGMwYWVOSGc&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Материалы с лекций ==&lt;br /&gt;
* [[Java_2012-02-09 | Лекция №1]]&lt;br /&gt;
* [[Java_2012-03-00 | Лекция про Generics]]&lt;br /&gt;
* [[Java_2012-03-07 | Лекция про внутренние классы]]&lt;br /&gt;
* [[Медиа:Reflection.pdf | Reflection]]&lt;br /&gt;
* [[Java_2012-04-04 | Лекция про многопоточные программы]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/71/Java_hmw_2012_02_15.pdf Первое задание] срок сдачи: 15 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c1/Java_hmw_2012_02_23_fix.pdf Второе задание] срок сдачи: 23 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/5/55/Java_hmw_3.pdf Третье задание] срок сдачи: 2 марта&lt;br /&gt;
* Четвертое домашнее задание, как вы уже знаете, у вас на выбор. [[Java_2012_02_29 | Первый вариант]], &amp;lt;b&amp;gt;черновик&amp;lt;/b&amp;gt; второго варианта [http://mit.spbau.ru/sewiki/images/b/b6/Java-hmw-4.pdf здесь].&lt;br /&gt;
* [[Java_2012_HW5 | Пятое задание]] НЕОБЯЗАТЕЛЬНО ДЛЯ ВЫПОЛНЕНИЯ&lt;br /&gt;
* [[Java_Test_20120321 | Контрольная]] &lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e5/Java_hmw_6.pdf Шестое задание] срок сдачи: конец семестра&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/1/18/Java_hmw_7.pdf Седьмое задание] срок сдачи: 17 апреля&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* catch (Exception ex)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_7.pdf&amp;diff=1271</id>
		<title>Файл:Java hmw 7.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_7.pdf&amp;diff=1271"/>
				<updated>2012-04-10T00:26:25Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1211</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1211"/>
				<updated>2012-03-25T09:05:57Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Новости ==&lt;br /&gt;
* 21.02 -- Лучше поздно, чем никогда! Внизу страницы появилось несколько примеров работы с исключениями.&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dDdEZ1NaUWdUakpFdGowRGMwYWVOSGc&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Материалы с лекций ==&lt;br /&gt;
* [[Java_2012-02-09 | Лекция №1]]&lt;br /&gt;
* [[Java_2012-03-00 | Лекция про Generics]]&lt;br /&gt;
* [[Java_2012-03-07 | Лекция про внутренние классы]]&lt;br /&gt;
* [[Медиа:Reflection.pdf | Reflection]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/71/Java_hmw_2012_02_15.pdf Первое задание] срок сдачи: 15 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c1/Java_hmw_2012_02_23_fix.pdf Второе задание] срок сдачи: 23 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/5/55/Java_hmw_3.pdf Третье задание] срок сдачи: 2 марта&lt;br /&gt;
* Четвертое домашнее задание, как вы уже знаете, у вас на выбор. [[Java_2012_02_29 | Первый вариант]], &amp;lt;b&amp;gt;черновик&amp;lt;/b&amp;gt; второго варианта [http://mit.spbau.ru/sewiki/images/b/b6/Java-hmw-4.pdf здесь].&lt;br /&gt;
* [[Java_2012_HW5 | Пятое задание]] НЕОБЯЗАТЕЛЬНО ДЛЯ ВЫПОЛНЕНИЯ&lt;br /&gt;
* [[Java_Test_20120321 | Контрольная]] &lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/e/e5/Java_hmw_6.pdf Шестое задание] срок сдачи: конец семестра&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* catch (Exception ex)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_6.pdf&amp;diff=1210</id>
		<title>Файл:Java hmw 6.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_6.pdf&amp;diff=1210"/>
				<updated>2012-03-25T09:02:27Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1090</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1090"/>
				<updated>2012-03-03T05:04:12Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Exceptions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Новости ==&lt;br /&gt;
* 21.02 -- Лучше поздно, чем никогда! Внизу страницы появилось несколько примеров работы с исключениями.&lt;br /&gt;
== Рейтинг ==&lt;br /&gt;
[https://docs.google.com/spreadsheet/pub?key=0Aif17q2hwUt4dDdEZ1NaUWdUakpFdGowRGMwYWVOSGc&amp;amp;output=html Текущий рейтинг]&lt;br /&gt;
&lt;br /&gt;
== Материалы с лекций ==&lt;br /&gt;
* [[Java_2012-02-09 | Лекция №1]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/71/Java_hmw_2012_02_15.pdf Первое задание] срок сдачи: 15 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c1/Java_hmw_2012_02_23_fix.pdf Второе задание] срок сдачи: 23 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/5/55/Java_hmw_3.pdf Третье задание] срок сдачи: 2 марта&lt;br /&gt;
* Четвертое домашнее задание, как вы уже знаете, у вас на выбор =)&lt;br /&gt;
Первый вариант был предложен Антоном Михайловичем на лекции, &amp;lt;b&amp;gt;черновик&amp;lt;/b&amp;gt; второго варианта [http://mit.spbau.ru/sewiki/images/b/b6/Java-hmw-4.pdf здесь].&lt;br /&gt;
Постарайтесь выбрать какую из задач вы будете делать как можно скорее, т.к. я хотел провести skype-консультацию для тех, кто выберет вторую задачу и при необходимости скорректировать ее объем и сложность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
* catch (Exception ex)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1080</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1080"/>
				<updated>2012-03-01T19:53:15Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Новости ==&lt;br /&gt;
* 21.02 -- Лучше поздно, чем никогда! Внизу страницы появилось несколько примеров работы с исключениями.&lt;br /&gt;
== Материалы с лекций ==&lt;br /&gt;
* [[Java_2012-02-09 | Лекция №1]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/71/Java_hmw_2012_02_15.pdf Первое задание] срок сдачи: 15 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c1/Java_hmw_2012_02_23_fix.pdf Второе задание] срок сдачи: 23 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/5/55/Java_hmw_3.pdf Третье задание] срок сдачи: 2 марта&lt;br /&gt;
* Четвертое домашнее задание, как вы уже знаете, у вас на выбор =)&lt;br /&gt;
Первый вариант был предложен Антоном Михайловичем на лекции, &amp;lt;b&amp;gt;черновик&amp;lt;/b&amp;gt; второго варианта [http://mit.spbau.ru/sewiki/images/b/b6/Java-hmw-4.pdf здесь].&lt;br /&gt;
Постарайтесь выбрать какую из задач вы будете делать как можно скорее, т.к. я хотел провести skype-консультацию для тех, кто выберет вторую задачу и при необходимости скорректировать ее объем и сложность.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1079</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1079"/>
				<updated>2012-03-01T19:52:13Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Новости ==&lt;br /&gt;
* 21.02 -- Лучше поздно, чем никогда! Внизу страницы появилось несколько примеров работы с исключениями.&lt;br /&gt;
== Материалы с лекций ==&lt;br /&gt;
* [[Java_2012-02-09 | Лекция №1]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/71/Java_hmw_2012_02_15.pdf Первое задание] срок сдачи: 15 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c1/Java_hmw_2012_02_23_fix.pdf Второе задание] срок сдачи: 23 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/5/55/Java_hmw_3.pdf Третье задание] срок сдачи: 2 марта&lt;br /&gt;
* Четвертое домашнее задание, как вы уже знаете, у вас на выбор =)&lt;br /&gt;
Первый вариант был предложен Антоном Михайловичем на лекции, &amp;lt;b&amp;gt;черновик&amp;lt;/b&amp;gt; второго варианта [http://mit.spbau.ru/sewiki/images/b/b6/Java-hmw-4.pdf здесь].&lt;br /&gt;
Постарайтесь выбрать какую из задач вы будете делать как можно скорее, т.к. я хотел провести skype-консультацию для тех, кто выберет вторую задачу.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java-hmw-4.pdf&amp;diff=1078</id>
		<title>Файл:Java-hmw-4.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java-hmw-4.pdf&amp;diff=1078"/>
				<updated>2012-03-01T19:42:48Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: java homework 4&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;java homework 4&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1043</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1043"/>
				<updated>2012-02-25T19:37:47Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Новости ==&lt;br /&gt;
* 21.02 -- Лучше поздно, чем никогда! Внизу страницы появилось несколько примеров работы с исключениями.&lt;br /&gt;
== Материалы с лекций ==&lt;br /&gt;
* [[Java_2012-02-09 | Лекция №1]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/71/Java_hmw_2012_02_15.pdf Первое задание] срок сдачи: 15 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c1/Java_hmw_2012_02_23_fix.pdf Второе задание] срок сдачи: 23 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/5/55/Java_hmw_3.pdf Третье задание] срок сдачи: 2 марта&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1042</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1042"/>
				<updated>2012-02-25T19:34:41Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Домашние задания */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Новости ==&lt;br /&gt;
* 21.02 -- Лучше поздно, чем никогда! Внизу страницы появилось несколько примеров работы с исключениями.&lt;br /&gt;
== Материалы с лекций ==&lt;br /&gt;
* [[Java_2012-02-09 | Лекция №1]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/71/Java_hmw_2012_02_15.pdf Первое задание] срок сдачи: 15 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c1/Java_hmw_2012_02_23_fix.pdf Второе задание] срок сдачи: 23 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/5/55/Java_hmw_3.pdf Третье задание] срок сдачи: 2 марта (хоть условие и появилось достаточно поздно, но само задание было дано еще на паре)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_3.pdf&amp;diff=1041</id>
		<title>Файл:Java hmw 3.pdf</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Java_hmw_3.pdf&amp;diff=1041"/>
				<updated>2012-02-25T19:30:34Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: java course homework 3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;java course homework 3&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1025</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1025"/>
				<updated>2012-02-20T21:42:17Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* Материалы с лекций */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Новости ==&lt;br /&gt;
* 21.02 -- Лучше поздно, чем никогда! Внизу страницы появилось несколько примеров работы с исключениями.&lt;br /&gt;
== Материалы с лекций ==&lt;br /&gt;
* [[Java_2012-02-09 | Лекция №1]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/71/Java_hmw_2012_02_15.pdf Первое задание] срок сдачи: 15 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c1/Java_hmw_2012_02_23_fix.pdf Второе задание] срок сдачи: 23 февраля&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1024</id>
		<title>Java</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java&amp;diff=1024"/>
				<updated>2012-02-20T21:40:48Z</updated>
		
		<summary type="html">&lt;p&gt;Snurk: /* 3 примера работы с &amp;quot;файловыми&amp;quot; исключениями */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Материалы с лекций ==&lt;br /&gt;
* [[Java_2012-02-09 | Лекция №1]]&lt;br /&gt;
&lt;br /&gt;
== Домашние задания ==&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/7/71/Java_hmw_2012_02_15.pdf Первое задание] срок сдачи: 15 февраля&lt;br /&gt;
* [http://mit.spbau.ru/sewiki/images/c/c1/Java_hmw_2012_02_23_fix.pdf Второе задание] срок сдачи: 23 февраля&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Присылать задачи нужно на почту &amp;lt;b&amp;gt;sergeynurk@gmail.com&amp;lt;/b&amp;gt; с копией &amp;lt;b&amp;gt;anton.m.kuznetsov@gmail.com&amp;lt;/b&amp;gt; и темой: &amp;lt;b&amp;gt;Java homework &amp;lt;фамилия&amp;gt; tasks 1,2,3...&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вопросы можно задать по тому же почтовому адресу с темой &amp;lt;b&amp;gt;Java question&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Рекомендуемая литература ==&lt;br /&gt;
* &amp;quot;Thinking in Java&amp;quot;, Bruce Eckel&lt;br /&gt;
* &amp;quot;Effective Java&amp;quot;, Joshua Bloch&lt;br /&gt;
&lt;br /&gt;
== Coding conventions ==&lt;br /&gt;
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconv-138413.html общепринятые coding conventions] от компании Sun.&lt;br /&gt;
&lt;br /&gt;
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекоммендуется отдавать предпочтение длинным мнемоническим идентификаторам.&lt;br /&gt;
&lt;br /&gt;
== Некоторые требования ==&lt;br /&gt;
&lt;br /&gt;
=== Форма поставки кода ===&lt;br /&gt;
Задания должны присылаться в jar архивах. В архивы включаются &amp;lt;b&amp;gt;только ваши исходники&amp;lt;/b&amp;gt; (.java файлы). &lt;br /&gt;
&lt;br /&gt;
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar]. &lt;br /&gt;
&lt;br /&gt;
Каждая задача должна находиться в пакете &amp;lt;b&amp;gt;ru.spbau.&amp;lt;ваша фамилия&amp;gt;.task&amp;lt;# задания&amp;gt;&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Можете складывать несколько заданий в один архив.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
Ко всем классам, интерфейсам и public/protected полям и методам &amp;lt;b&amp;gt;должен быть написан&amp;lt;/b&amp;gt; осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке. &lt;br /&gt;
&lt;br /&gt;
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). &lt;br /&gt;
&lt;br /&gt;
Настоятельно рекоммендуется использовать консольные или встроенные в IDE &amp;lt;b&amp;gt;средства проверки валидности javadoc&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пример хорошего javadoc-а можно найти в любом классе стандартной библиотеки.&lt;br /&gt;
&lt;br /&gt;
=== Exceptions ===&lt;br /&gt;
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.&lt;br /&gt;
&lt;br /&gt;
Распространенные недочеты:&lt;br /&gt;
* Использование исключений для управления логикой программы&lt;br /&gt;
* Оборачивание проверяемых исключений в непроверяемые&lt;br /&gt;
* Подавление исключений (Пустые catch блоки)&lt;br /&gt;
* Отсутствие вывода &amp;lt;b&amp;gt;читаемой&amp;lt;/b&amp;gt; полезной информации в блоках обработки ошибок&lt;br /&gt;
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)&lt;br /&gt;
&lt;br /&gt;
== Общие замечания ==&lt;br /&gt;
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.&lt;br /&gt;
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Q: Можно ли использовать finalize для закрытия открытых файлов?&lt;br /&gt;
&lt;br /&gt;
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли всегда использовать утилиту ant?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?&lt;br /&gt;
&lt;br /&gt;
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.&lt;br /&gt;
&lt;br /&gt;
== Примеры работы с &amp;quot;файловыми&amp;quot; исключениями ==&lt;br /&gt;
&lt;br /&gt;
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).&lt;br /&gt;
&lt;br /&gt;
Можете использовать тот, который вам больше по душе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way I always tried to use dealing with &amp;quot;file-reading&amp;quot; exceptions.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void firstExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try {&lt;br /&gt;
			BufferedReader reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			try {&lt;br /&gt;
				while ((line = reader.readLine()) != null) {&lt;br /&gt;
					/*TODO something*/&lt;br /&gt;
					System.out.println(line);&lt;br /&gt;
				}&lt;br /&gt;
			} catch (IOException e) {&lt;br /&gt;
				System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			} finally {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * The way to get rid of one level of try blocks. &lt;br /&gt;
	 * Significantly reduces depth when dealing with several files. &lt;br /&gt;
	 */&lt;br /&gt;
	public static void secondExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		BufferedReader reader = null;&lt;br /&gt;
		try {&lt;br /&gt;
			reader = new BufferedReader(new FileReader(filename));&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened during reading. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} finally {&lt;br /&gt;
			if (reader != null) {&lt;br /&gt;
				try {&lt;br /&gt;
					reader.close();&lt;br /&gt;
				} catch (IOException e) {&lt;br /&gt;
					System.err.println(&amp;quot;Strange IOException happened during closing file. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
					e.printStackTrace();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * Brand new Java7 way of dealing with this example.&lt;br /&gt;
	 * Uses try-with-resources statement.&lt;br /&gt;
	 * For more information see: &lt;br /&gt;
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html&lt;br /&gt;
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.&lt;br /&gt;
	 */&lt;br /&gt;
	public static void thirdExample() {&lt;br /&gt;
		String filename = &amp;quot;filename&amp;quot;; &lt;br /&gt;
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {&lt;br /&gt;
			String line;&lt;br /&gt;
			while ((line = reader.readLine()) != null) {&lt;br /&gt;
				/*TODO something*/&lt;br /&gt;
				System.out.println(line);&lt;br /&gt;
			}&lt;br /&gt;
		} catch (FileNotFoundException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Couldn't find file: &amp;quot; + filename);&lt;br /&gt;
		} catch (IOException e) {&lt;br /&gt;
			System.err.println(&amp;quot;Strange IOException happened. Message: &amp;quot; + e.getMessage());&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Snurk</name></author>	</entry>

	</feed>