Arhn - архитектура программирования

Обработка ошибок в задаче Java

public class SomeClass {
    int[] table;    
    int size;

    public SomeClass(int size) {
        this.size = size;    
        table = new int[size];  
    }

    public static void main(String[] args) {
        int[] sizes = {5, 3, -2, 2, 6, -4};
        SomeClass testInst;

        for (int i = 0; i < 6; i++) {
            testInst = new SomeClass(sizes[i]);
            System.out.println("New example size " + testInst.size);
        }   
    }    
}

Когда конструктор SomeClass вызывается с аргументом -2, будет сгенерирована ошибка времени выполнения: NegativeArraySizeException.

Я хочу изменить этот код, чтобы он вел себя более надежно, используя try, catch и throw. Конструктор должен генерировать исключение, но в противном случае ничего не делать при вызове с неположительным аргументом. Основной метод должен перехватить исключение и вывести предупреждающее сообщение, а затем продолжить выполнение через все шесть итераций цикла.
Кто-нибудь указал мне правильное направление?

21.08.2015

Ответы:


1

Вам необходимо генерировать исключение (предпочтительно IllegalArgumentException) из конструктора SomeClass всякий раз, когда вы получаете отрицательное число и обрабатываете его в своем основном методе. Ваш код должен выглядеть так;

public class SomeClass
{
    int[] table;
    int size;

    public SomeClass(int size)
    {
        if ( size < 0 )
        {
            throw new IllegalArgumentException("Negative numbers not allowed");
        }
        this.size = size;
        table = new int[size];
    }

    public static void main(String[] args)
    {
        int[] sizes = { 5, 3, -2, 2, 6, -4 };
        SomeClass testInst;
        for (int i = 0; i < 6; i++)
        {
            try
            {
                testInst = new SomeClass(sizes[i]);

                System.out.println("New example size " + testInst.size);
            }
            catch (IllegalArgumentException e)
            {
                System.out.println(e.getMessage());
            }
        }
    }
}
21.08.2015

2

Существуют операции, такие как подключение к удаленному серверу с помощью Socket, которые могут вызывать исключения, такие как SocketException. Вам нужно поймать и обработать эти исключения, потому что до того, как вы попытаетесь установить соединение, нет никакого способа узнать, будет ли оно успешным или нет.

NegativeArrayException не такой. Прежде чем пытаться создать массив, вы можете быть уверены, что он потерпит неудачу, если вы используете отрицательный размер.
Если размер исходит из вашего кода, как в этом случае, вы должны исправить свой код, а не перехватывать это исключение. .
Если это исходит от каких-либо входных данных, вы должны проверить эти входные данные и действовать соответствующим образом, прежде чем пытаться создать массив.

Предполагая, что ваш массив размеров на самом деле является упрощенным примером ввода, способ работы с ним будет следующим:

public class SomeClass {

    int[] table;
    int size;

    public SomeClass(int size) {
        this.size = size;
        table = new int[size];
    }

    public static void main(String[] args) {
        int[] sizes = {5, 3, -2, 2, 6, -4};
        SomeClass testInst;

        for (int i = 0; i < 6; i++) {
            if (sizes[i] < 0) {
                System.out.println("Warning");
            } else {
                testInst = new SomeClass(sizes[i]);
                System.out.println("New example size " + testInst.size);
            }
        }
    }
}

Что дает в качестве вывода:

New example size 5
New example size 3
Warning
New example size 2
New example size 6
Warning
21.08.2015
  • Большое спасибо :), это действительно отвечает на мою проблему :). 24.08.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..