2014-10-26 2 views
1

Мой метод getChoice() принимает ввод символов с консоли и возвращает символ main(). Если getChoice() просто выбросить исключение, и пусть main() сделки с ним:Конструкция и обработка Java-класса Исключения

static char getChoice() throws IOException 
{ 
    BufferedReader br = new 
    BufferedReader(new InputStreamReader(System.in)); 
    return (char)br.read(); 
} 

Или getChoice() поймать исключение, иметь дело с ним и вернуть символ:

static char getChoice() 
{ 
    BufferedReader br = new 
    BufferedReader(new InputStreamReader(System.in)); 
    char temp; 
    try { 
     temp = (char)br.read(); 
    } catch(IOException exc) { 
     System.out.println("Invalid Input"); 
     temp = (char)0; 
    } 
    return temp; 
} 

Какой подход лучше от проектирования в перспективе? Есть ли лучший способ сделать это?

+0

Кому это нужно?!? Закройте свои ресурсы! WHAAAA !!!!! – CandiedOrange

+0

@CandiedOrange На самом деле, в этом случае закрытие System.in нежелательно. –

+0

Хм, похоже, у вас есть точка: http://stackoverflow.com/questions/17174752/bufferedreader-input-attempt-from-system-in-throwing-exceptions Я смиренно снимаю свой WHAAAA – CandiedOrange

ответ

2

Выдача исключения представляется мне лучшим вариантом, поскольку возврат значения по умолчанию (или код ошибки, если хотите) в случае исключения не позволяет вызывающему абоненту знать, что при чтении ввода с пользователь. Используя возвращаемое значение, подобное (char) 0 как код ошибки, возвращает вас на языки, не имеющие обработки исключений.

При этом вам следует подумать о том, чтобы поймать IOException и выбросить исключение из своего собственного, что описывает ошибку.

Например:

static char getChoice() throws UserInputException 
{ 
    BufferedReader br = new 
    BufferedReader(new InputStreamReader(System.in)); 
    char temp = (char)0; 
    try { 
     temp = (char)br.read(); 
    } 
    catch (IOException ioEx) { 
     throw new UserInputException ("Error reading input", ioEx); 
    } 
    return temp; 
} 
1

Первый способ лучше. Исключения предназначены для сигнализации об исключительных ситуациях. Возвращаемые значения - нет. Во втором случае вызывающий должен знать, что 0 возвращается в случае возникновения проблемы. И кроме того, 0 - допустимое значение char, что делает невозможным отличать «вход« 0 »и« было исключение ».

Не то, чтобы использование BufferedReader для чтения одного символа полностью переборщило: буферизовать нечего.

0

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

Вот причины. Есть 2 случая:

  1. главный знает, как обращаться с exceptinal дело (либо выброшенное исключение или возвращаемый недопустимое значение)
  2. основной не имеет ничего общего с этим делом.

Если главный знает, как справиться с этим делом 2 подхода очень похожи:

// Catching exception 
main(String[] args) { 
    try { 
     char c = getChoice(); 
     // do A 
    } catch (IOException e) { 
     // do B 
    } 
} 


// Returning 0 
main(String[] args) { 
     char c = getChoice(); 
     if (c == 0) { 
      // do B 
     } else { 
     // do A 
     } 
} 

Однако если вы возвращаете 0 вы на самом деле заботитесь о стоимости дважды: сначала в getChoice(), второй раз в main() что создает дополнительную связь между этими двумя методами.

Однако очень часто даже main() не имеет ничего общего с неправильным вводом. В этом случае ваш подход:

main(String[] args) throws IOException { 
    char c = getChoice(); 
    // do A 
} 

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

0

Когда метод должен вызывать исключение? Типичным советом является бросить их только в исключительных ситуациях. Но что считается исключительной ситуацией? Я предлагаю другое правило (изначально предполагаемое Хербом Саттером, я считаю): если и только если альтернатива будет заключаться в том, чтобы не выполнить то, что указано в методе. Это трансформирует вопрос от чего-то неопределенного (что является исключительным) к чему-то потенциально точенному (что говорит спецификация).

Итак, какова спецификация вашего метода getChoice? Он читает выбор. Рассмотрим случай, когда метод не может прочитать выбор. Метод не должен выбирать return для этого случая, поскольку он не смог прочитать выбор. Поэтому вместо этого нужно исключить исключение. Когда операция read выбрасывает IOException, метод getChoice попытался, но не смог прочитать выбор. Поэтому он должен выдать исключение. Следовательно, метод не должен пытаться обрабатывать сам IOException, но должен позволять его вызывающему его обрабатывать.

Смежные вопросы