Java

Материал из SEWiki
Версия от 22:52, 1 марта 2012; Snurk (обсуждение | вклад) (Домашние задания)

Перейти к: навигация, поиск

Новости

  • 21.02 -- Лучше поздно, чем никогда! Внизу страницы появилось несколько примеров работы с исключениями.

Материалы с лекций

Домашние задания

Первый вариант был предложен Антоном Михайловичем на лекции, черновик второго варианта здесь. Постарайтесь выбрать какую из задач вы будете делать как можно скорее, т.к. я хотел провести skype-консультацию для тех, кто выберет вторую задачу.


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

Вопросы можно задать по тому же почтовому адресу с темой 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<# задания>

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

Javadoc

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

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

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

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

Exceptions

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

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

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

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

  • Некоторым вашим классам может понадобиться больше 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();
		} 
	}