> For the complete documentation index, see [llms.txt](https://opu.gitbook.io/oop/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://opu.gitbook.io/oop/2019-2020-archive/arkhiv-1/labs/lab9/zadanie-na-laboratornuyu-rabotu.md).

# Задание на лабораторную работу

### Задание 1.

Вам дан файл **Sums.java**, в которой содержится программа.&#x20;

Данная программа позволяет пользователю ввести набор целых чисел и вывести сумму этих чисел. Программа спрашивает пользователя, хочет ли он посчитать сумму чисел; если пользователь отвечает ‘y’, то программа принимает на вход из консоли множество целых чисел до тех пор, пока пользователь не введет число ‘0’. После этого программа выводит сумму этих чисел и повторяет вопрос снова. Если пользователь отвечает ‘n’, программа заканчивает работу.

{% code title="Sums.java" %}

```java
public class Sums {

    public static void sum(BufferedReader in){
        // Программа получает последовательность целых чисел на вход
        // и возвращает сумму этих чисел
        int s, nextInt;
        s = 0;

        System.out.println("Пожалуйста, введите последовательность чисел, для окончания ввода, введите 0");
        nextInt = Integer.parseInt(in.readLine());

        // Читаем следующее значение. Ожидаем целое число
        while (nextInt!=0) {
            s = s + nextInt;
            nextInt = Integer.parseInt(in.readLine());
        }

        System.out.println("Сумма равна " + s);
    }

    public static void main(String[] arg) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        // in будет получать данные из стандартного входного потока

        System.out.println("Вы хотите посчитать сумму чисел? (y/n)");

        String c = in.readLine();
        // Проверяем правильность ввода
        // Если ввод некорректен - просим повторить снова
        while (!c.equals("y") && !c.equals("n")) {
            System.out.println("Пожалуйста, повторите ввод (y/n)");
            c = in.readLine();
        }

        while (c.equals("y")) {
            sum(in); // Функция для ввода и подсчета суммы чисел
            System.out.println("Вы хотите посчитать сумму еще раз? (y/n)");
            c = in.readLine();

            while (!c.equals("y") && !c.equals("n")) {
                System.out.println("Пожалуйста, повторите ввод (y/n)");
                c = in.readLine();
            }
        }

        System.out.println("Программа заканчивает работу.");
    }
}
```

{% endcode %}

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

{% hint style="warning" %}
**Внимание! Обработчики исключений должны быть реализованы так, чтобы программа адекватно реагировала на исключения и продолжила работу, как было задумано изначально!**
{% endhint %}

### Задание 2.

Дан класс **ListOfNumbers** (листинг класса представлен ниже). Создайте консольное приложение на основе этого класса. Добавьте в класс **ListOfNumbers** метод **readList()**. Этот метод должен считывать **int** значения из файла, выводить в консоль каждое значение, после чего добавлять значение в коллекцию **List**. Ваш код должен «отлавливать» все соответствующие исключения. Также, создайте текстовый файл со значениями. При сдаче лабораторной работы вы должны представить работоспособную консольную программу.

Также замените блок **finally** на **try-with-resources**.

{% code title="ListOfNumbers.java" %}

```java
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class ListOfNumbers {
    private List<Integer> list;
    private static final int LIST_SIZE = 10;

    public ListOfNumbers() {
        list = new ArrayList<>(LIST_SIZE);
        for (int i = 0; i < list.size(); i++)
            list.add(i);
    }

    public void writeList() {
        PrintWriter out = null;

        try {
            System.out.println("Entering try statement");
            out = new PrintWriter(new FileWriter("OutFile.txt"));

            for (int i = 0; i < list.size(); i++)
                out.println("Value at: " + i + " = " + list.get(i));
        } catch (IndexOutOfBoundsException e) {
            System.err.println("Caught IndexOutOfBoundsException: " +
                    e.getMessage());
        } catch (IOException e) {
            System.err.println("Caught IOException: " + e.getMessage());
        } finally {
            if (out != null) {
                System.out.println("Closing PrintWriter");
                out.close();
            } else {
                System.out.println("PrintWriter not open");
            }
        }
    }
}
```

{% endcode %}

### Задание 3.

Перепишите код **второй лабораторной работы** с использованием механизма исключений. При необходимости, добавьте свои классы исключений (подумайте, от каких стандартных классов исключений они должны наследоваться).&#x20;

### Задание 4.

Перепишите код **первого задания шестой лабораторной работы** с использованием механизма исключений. При необходимости, добавьте свои классы исключений (подумайте, от каких стандартных классов исключений они должны наследоваться).&#x20;
