Java 2015 — различия между версиями

Материал из SEWiki
Перейти к: навигация, поиск
(Лекции и контрольные)
 
(не показана 21 промежуточная версия 2 участников)
Строка 2: Строка 2:
  
 
Практика - Антон Михайлович Кузнецов
 
Практика - Антон Михайлович Кузнецов
 +
 +
== Результаты ==
 +
 +
[https://docs.google.com/spreadsheet/ccc?key=0Aif17q2hwUt4dE9MbnFmaXBzb2xaT2JuSTlWU0RNLUE&usp=sharing Результаты]
  
 
== Лекции и контрольные ==
 
== Лекции и контрольные ==
Строка 8: Строка 12:
 
*[[Медиа:Java2014_02.pdf|Лекция 2]]
 
*[[Медиа:Java2014_02.pdf|Лекция 2]]
 
*[[Медиа:Java2014_03.pdf|Лекция 3]]
 
*[[Медиа:Java2014_03.pdf|Лекция 3]]
 +
*[[Медиа:Java2014_04.pdf|Лекция 4]]
 +
*[[Медиа:Java2014_05.pdf|Лекция 5]] [[Медиа:Java2014_05_Examples.zip|Примеры]]
 +
*[[Медиа:Java2015_05.pdf|Лекция 6]]
 +
*[[Медиа:Java2015_06_examples.zip|Примеры]]
 +
*[[Медиа:Java2015_07.zip|Примеры]]
 +
*[[Медиа:Java_2014_08.pdf|Лекция 8]]
 +
*[[Медиа:Java_2014_09.pdf|Лекция 9]]
 +
*[[Медиа:Java_2014_10.pdf|Лекция 10]]
 +
*[[Медиа:Java_2015_11.pdf|Лекция 11]]
 +
 +
== Задания ==
 +
 +
* [[Медиа:Java2015_Task02.pdf|Первое задание]] срок сдачи: 1 марта.
 +
* [[Медиа:Java2015_Task03.pdf|Второе задание]] срок сдачи: (<b>22 марта</b>).
 +
* [[Медиа:Java2015_Task04.pdf|Третье задание]] срок сдачи: (<b>30 марта</b>).
 +
* [[Медиа:Java2015_Task05.pdf|Четвертое задание]] (ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ) срок сдачи: (<b>3 мая</b>).
 +
* [[Медиа:Java_2015_Task05.pdf|Пятое задание]] срок сдачи: 29 мая.
 +
 +
* [[Медиа:Java_2015_Task06.pdf|Шестое задание]] срок сдачи: до 20 июня. Это не обязательное задание. Максимум - 20 баллов.
 +
 +
Присылать задачи нужно на почту <b>anton.m.kuznetsov@gmail.com</b> и темой: <b>Java homework <фамилия> tasks 01,02,03...</b>
 +
 +
Вопросы можно задать по тому же почтовому адресу с темой <b>Java question</b>.
 +
 +
== Рекомендуемая литература ==
 +
* "Thinking in Java", Bruce Eckel
 +
* "Effective Java", Joshua Bloch
 +
 +
== Coding conventions ==
 +
В отличие от C++, для Java есть [http://www.oracle.com/technetwork/java/codeconvtoc-136057.html общепринятые coding conventions] от компании Sun.
 +
 +
В первую очередь обратите внимание на Naming Conventions. Настоятельно рекомендуется отдавать предпочтение длинным мнемоническим идентификаторам.
 +
 +
== Некоторые требования ==
 +
 +
=== Форма поставки кода ===
 +
Задания должны присылаться в jar архивах. В архивы включаются <b>только ваши исходники</b> (.java файлы).
 +
 +
Для создания архивов используйте [http://docs.oracle.com/javase/tutorial/deployment/jar/build.html утилиту jar].
 +
 +
Каждая задача должна находиться в пакете <b>ru.spbau.<ваша фамилия>.task<# задания></b>
 +
 +
В качестве точки входа должен использоваться класс с именем <b>Main</b>, если явно не указано другого.
 +
 +
Можете складывать несколько заданий в один архив.
 +
 +
=== Javadoc ===
 +
Ко всем классам, интерфейсам и public/protected полям и методам <b>должен быть написан</b> осмысленный [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags javadoc] на грамотном английском языке.
 +
 +
Javadoc должен быть валидным (в частности, содержать все [http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html#requiredtags required tags]). Также должен быть указан @author.
 +
 +
Настоятельно рекомендуется использовать консольные или встроенные в IDE <b>средства проверки валидности javadoc</b>.
 +
 +
Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.
 +
 +
=== Exceptions ===
 +
При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.
 +
 +
Распространенные недочеты:
 +
* Использование исключений для управления логикой программы
 +
* Оборачивание проверяемых исключений в непроверяемые
 +
* Подавление исключений
 +
* Отсутствие вывода <b>читаемой</b> полезной информации в блоках обработки ошибок
 +
* Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)
 +
* Перехват исключений слишком общeго типа
 +
 +
== Общие замечания ==
 +
* Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.
 +
* Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.
 +
 +
== FAQ ==
 +
Q: Можно ли использовать finalize для закрытия открытых файлов?
 +
 +
A: Нет, нельзя. На лекциях обязательно будет разобрано почему.
 +
 +
 +
Q: Нужно ли всегда использовать утилиту ant?
 +
 +
A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.
 +
 +
 +
Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?
 +
 +
A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.
 +
 +
== Примеры работы с "файловыми" исключениями ==
 +
 +
Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).
 +
 +
Можете использовать тот, который вам больше по душе.
 +
 +
<source lang="java">
 +
/**
 +
* The way I always tried to use dealing with "file-reading" exceptions.
 +
*/
 +
public static void firstExample() {
 +
String filename = "filename";
 +
try {
 +
BufferedReader reader = new BufferedReader(new FileReader(filename));
 +
String line;
 +
try {
 +
while ((line = reader.readLine()) != null) {
 +
/*TODO something*/
 +
System.out.println(line);
 +
}
 +
} catch (IOException e) {
 +
System.err.println("Strange IOException happened during reading. Message: " + e.getMessage());
 +
e.printStackTrace();
 +
} finally {
 +
try {
 +
reader.close();
 +
} catch (IOException e) {
 +
System.err.println("Strange IOException happened during closing file. Message: " + e.getMessage());
 +
e.printStackTrace();
 +
}
 +
}
 +
} catch (FileNotFoundException e) {
 +
System.err.println("Couldn't find file: " + filename);
 +
}
 +
}
 +
 +
/**
 +
* The way to get rid of one level of try blocks.
 +
* Significantly reduces depth when dealing with several files.
 +
*/
 +
public static void secondExample() {
 +
String filename = "filename";
 +
BufferedReader reader = null;
 +
try {
 +
reader = new BufferedReader(new FileReader(filename));
 +
String line;
 +
while ((line = reader.readLine()) != null) {
 +
/*TODO something*/
 +
System.out.println(line);
 +
}
 +
} catch (FileNotFoundException e) {
 +
System.err.println("Couldn't find file: " + filename);
 +
} catch (IOException e) {
 +
System.err.println("Strange IOException happened during reading. Message: " + e.getMessage());
 +
e.printStackTrace();
 +
} finally {
 +
if (reader != null) {
 +
try {
 +
reader.close();
 +
} catch (IOException e) {
 +
System.err.println("Strange IOException happened during closing file. Message: " + e.getMessage());
 +
e.printStackTrace();
 +
}
 +
}
 +
}
 +
}
 +
 +
/**
 +
* Brand new Java7 way of dealing with this example.
 +
* Uses try-with-resources statement.
 +
* For more information see:
 +
* http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
 +
* Remark: some exceptions that you dealt with in two previous examples might be suppressed here.
 +
*/
 +
public static void thirdExample() {
 +
String filename = "filename";
 +
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
 +
String line;
 +
while ((line = reader.readLine()) != null) {
 +
/*TODO something*/
 +
System.out.println(line);
 +
}
 +
} catch (FileNotFoundException e) {
 +
System.err.println("Couldn't find file: " + filename);
 +
} catch (IOException e) {
 +
System.err.println("Strange IOException happened. Message: " + e.getMessage());
 +
e.printStackTrace();
 +
}
 +
}
 +
</source>
  
  
 
[[Category:5 курс. Весна 2015]]
 
[[Category:5 курс. Весна 2015]]

Текущая версия на 23:33, 12 июня 2015

Лектор - Антон Михайлович Кузнецов (anton.m.kuznetsov@gmail.com)

Практика - Антон Михайлович Кузнецов

Результаты

Результаты

Лекции и контрольные

Задания

  • Шестое задание срок сдачи: до 20 июня. Это не обязательное задание. Максимум - 20 баллов.

Присылать задачи нужно на почту anton.m.kuznetsov@gmail.com и темой: Java homework <фамилия> tasks 01,02,03...

Вопросы можно задать по тому же почтовому адресу с темой Java question.

Рекомендуемая литература

  • "Thinking in Java", Bruce Eckel
  • "Effective Java", Joshua Bloch

Coding conventions

В отличие от C++, для Java есть общепринятые coding conventions от компании Sun.

В первую очередь обратите внимание на Naming Conventions. Настоятельно рекомендуется отдавать предпочтение длинным мнемоническим идентификаторам.

Некоторые требования

Форма поставки кода

Задания должны присылаться в jar архивах. В архивы включаются только ваши исходники (.java файлы).

Для создания архивов используйте утилиту jar.

Каждая задача должна находиться в пакете ru.spbau.<ваша фамилия>.task<# задания>

В качестве точки входа должен использоваться класс с именем Main, если явно не указано другого.

Можете складывать несколько заданий в один архив.

Javadoc

Ко всем классам, интерфейсам и public/protected полям и методам должен быть написан осмысленный javadoc на грамотном английском языке.

Javadoc должен быть валидным (в частности, содержать все required tags). Также должен быть указан @author.

Настоятельно рекомендуется использовать консольные или встроенные в IDE средства проверки валидности javadoc.

Пример сносного javadoc-а можно найти в любом классе стандартной библиотеки.

Exceptions

При проверке ваших решений большое внимание будет уделяться тому как вы работаете с исключениями.

Распространенные недочеты:

  • Использование исключений для управления логикой программы
  • Оборачивание проверяемых исключений в непроверяемые
  • Подавление исключений
  • Отсутствие вывода читаемой полезной информации в блоках обработки ошибок
  • Некорректное освобождение используемых ресурсов (в первую очередь, открытых ранее файлов)
  • Перехват исключений слишком общeго типа

Общие замечания

  • Некоторым вашим классам может понадобиться больше public методов, чем те, которые перечислены в условиях задач.
  • Добавление дополнительных уровней абстракции приветствуется в том случае, если вы готовы обосновать принятые вами решения.

FAQ

Q: Можно ли использовать finalize для закрытия открытых файлов?

A: Нет, нельзя. На лекциях обязательно будет разобрано почему.


Q: Нужно ли всегда использовать утилиту ant?

A: Нет, не нужно. С ней обязательно попрактикуемся отдельно, использовать ее не обязательно.


Q: Нужно ли присылать какие-либо файлы помимо .java (metadata, build.xml)?

A: Нет, не нужно. Стандартный манифест файл, генерируемой утилитой jar, конечно можно оставить в архиве.

Примеры работы с "файловыми" исключениями

Ниже приведены три известных нам способа корректно перехватить и обработать исключения при чтении из файла (аналогично для записи).

Можете использовать тот, который вам больше по душе.

	/**
	 * The way I always tried to use dealing with "file-reading" exceptions.
	 */
	public static void firstExample() {
		String filename = "filename"; 
		try {
			BufferedReader reader = new BufferedReader(new FileReader(filename));
			String line;
			try {
				while ((line = reader.readLine()) != null) {
					/*TODO something*/
					System.out.println(line);
				}
			} catch (IOException e) {
				System.err.println("Strange IOException happened during reading. Message: " + e.getMessage());
				e.printStackTrace();
			} finally {
				try {
					reader.close();
				} catch (IOException e) {
					System.err.println("Strange IOException happened during closing file. Message: " + e.getMessage());
					e.printStackTrace();
				}
			}
		} catch (FileNotFoundException e) {
			System.err.println("Couldn't find file: " + filename);
		}
	}

	/**
	 * The way to get rid of one level of try blocks. 
	 * Significantly reduces depth when dealing with several files. 
	 */
	public static void secondExample() {
		String filename = "filename"; 
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new FileReader(filename));
			String line;
			while ((line = reader.readLine()) != null) {
				/*TODO something*/
				System.out.println(line);
			}
		} catch (FileNotFoundException e) {
			System.err.println("Couldn't find file: " + filename);
		} catch (IOException e) {
			System.err.println("Strange IOException happened during reading. Message: " + e.getMessage());
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					System.err.println("Strange IOException happened during closing file. Message: " + e.getMessage());
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * Brand new Java7 way of dealing with this example.
	 * Uses try-with-resources statement.
	 * For more information see: 
	 * http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
	 * Remark: some exceptions that you dealt with in two previous examples might be suppressed here.
	 */
	public static void thirdExample() {
		String filename = "filename"; 
		try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
			String line;
			while ((line = reader.readLine()) != null) {
				/*TODO something*/
				System.out.println(line);
			}
		} catch (FileNotFoundException e) {
			System.err.println("Couldn't find file: " + filename);
		} catch (IOException e) {
			System.err.println("Strange IOException happened. Message: " + e.getMessage());
			e.printStackTrace();
		} 
	}