2016-04-04 4 views
0

У меня есть программа, которая объявляет массив объектов квартиры. В каждом апартаменте есть адрес, номер, подсчет спальни и стоимость аренды. Когда массив инициализируется, каждой квартире дается строка, а конструктор класса Apartment превращает эту строку в значения. Программа является тестовым исследованием при броске и ловушке исключения с использованием нескольких классов.Продолжить программу после того, как Исключение поймано, без использования петель?

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

Вот код для «основного» класса в программе, с токовым выходом под ним:

public class ThrowApartmentException 
{ 
public static void main(String[] args) 
{ 
    // this program uses three classes, the ThrowApartmentException class is the "main" class, it's what you run to use the program. The Apartment class is used to create 
    // apartment objects, and it converts apartment Strings into values, checks those values for validity, and throws an exception if those values are wrong. This exception 
    // is an ApartmentException, which is the third class. It takes the apartment string as an argument and simply prints a message stating that the apartment failed to be 
    // instantiated. 

    // this class creates an array of 6 apartment objects, with both valid and invalid values, and an appropriate message is displayed when one is instantiated successfully 
    // and one is not. 

    Apartment[] apartments = new Apartment[6]; 
    // apartment string parameter is formatted "address, number, rooms, rent". 
    try { 
    apartments[0] = new Apartment("123 Fake Street, 456, 3, 1500"); // valid. 
    apartments[1] = new Apartment("21 Blizzard Avenue, 333, 2, 2600"); // invalid rent. 
    apartments[2] = new Apartment("6 Brr Street, 23, 1, 1000"); // invalid number. 
    apartments[3] = new Apartment("25 Boat Lane, 324, 5, 1200"); // invalid rooms. 
    apartments[4] = new Apartment("47 Kenneth Street, 550, 1, 1000"); // valid. 
    apartments[5] = new Apartment("36 Sanders Drive, 230, 1, 1300"); // valid. 
    } 
    catch(ApartmentException mistake) { 

    } 
} 
} 

----------------------------------------- 
Output: 
Apartment 123 Fake Street, 456, 3, 1500 was successfully initialised. 
Apartment 21 Blizzard Avenue, 333, 2, 2600 failed to be instantiated, one or more of the values was outside of valid range. 

Текущие параметры У меня есть открытое, что я думаю, что может решить эту проблему, являются:

1: Поместите каждый экземпляр объекта в собственный блок try/catch.

2: реструктурируйте программу так, чтобы блок try/catch выполнялся внутри конструктора квартиры.

3: Имейте в виду какой-то способ форматирования цикла, который позволяет создавать уникальные объекты таким образом, я мог бы, вероятно, использовать массив строк, но это кажется невероятно неудобным ленточным решением, а не фактическим решением.

+2

И 1, и 2 должны работать. Я думаю, что 2 лучше, поскольку он более надежный, и вы [Не повторяйте себя] (https://en.wikipedia.org/wiki/Don%27t_repeat_yourself). Однако на самом деле это не вопрос, поэтому я собираюсь проголосовать за закрытие (что даст вам возможность отредактировать его в правильном вопросе) – Knells

ответ

1

Это то, что я хотел бы сделать:

1- Пусть Apartment Class бросает исключение, если неверный ввод передается ему (ApartmentException в вашем случае)

2- Использовать список вместо массивов, таких как следующие:

List<Apartment> myList = new ArrayList<Apartment>(); 

String[] desc = new String {"123 Fake Street, 456, 3, 1500", ... } 

for(int i=0; i<desc.length; i++) 
{ 
    try 
    { 
     myList.add(new Apartment(desc[i])); 
    } 
    catch(ApartmentException mistake) 
    { 
     //do something 
    } 
} 

//at this point myList contains only valid listings 
+0

Итак, у вас будет массив строк информации о квартире? Я полагаю, что если это будет реальная программа, а не просто упражнение, пользовательский ввод, если он будет находиться в таком «хрупком» формате, будет храниться как массив. Я сделаю это. Я до сих пор не совсем уверен, какие лучшие практики для пользовательских Исключений. EDIT: Ну, массив или список. –

+0

@SpaceOstrich, так как ваш конструктор квартиры получает String в качестве входных данных, вам в конечном итоге нужно преобразовать вход пользователя в строку – Pooya

+0

Как ни странно, для этой программы нет пользовательского ввода. Гипотетический практический пример, вероятно, будет частью какого-либо автоматизированного реестра апартаментов, проверяя их на срок действия или цену/спальню. Все входные данные выполняются с помощью экземпляров объектов-объектов до выполнения. Я, вероятно, переформатирую этот вопрос, чтобы быть более конкретным. –