2016-10-10 6 views
0
try{ 
    output.format("%d %s %s %.2f%n", input.nextInt(), 
     input.next(),input.next(),input.nextDouble()); 
} catch(FormatterClosedException formatterClosedException){ 
    System.err.println("Error writing to file. Terminating."); 
    break; 
} catch(NoSuchElementException noSuchElementException){ 
    System.err.println("Invalid input. Please try again."); 
    input.nextLine(); 
} 

Метод format(String format, Object... args) в Formatter классе бросает два exception: IllegalFormatException и FormatterClosedException, но в моей книге выше код ловит NoSuchElementException и FormatterClosedException.Должен ли я поймать все исключения, которые выбрасываются методом?

  1. Почему код поймал NoSuchElementException, но не поймал IllegalFormatException?
  2. Как мы можем узнать, нужно ли нам поймать NoSuchElementException, если он даже не указан в методе форматирования класса() метода в онлайн documentation?
+0

попробуйте прочитать тему на исключения, например: http://stackoverflow.com/questions/7586305/how-to-know-which-exception-is-thrown – usman

+0

[ Прочитайте это] (https://docs.oracle.com/javase/7/docs/api/java/util/NoSuchElementException.html) вы поймете NoSuchElementException –

+0

Я дал вам объяснение в конце ответа. Это «Сканер», который может выбросить «NoSuchElementException». – xenteros

ответ

1

Document: java.util.NoSuchElementException является RuntimeException, который может быть выброшен различными классами в Java, как итератор, Enumerator, Сканер или StringTokenizer.

В вашем случае это Scanner. Его не от format метода.

Это, чтобы быть в более безопасной стороне (если следующий ввод не задан, то выбросьте это исключение).

Пример кода, который показывает демо

public class NoSuchElementExceptionDemo{ 
    public static void main(String args[]) { 
     Hashtable sampleMap = new Hashtable(); 
     Enumeration enumeration = sampleMap.elements(); 
     enumeration.nextElement(); //java.util.NoSuchElementExcepiton here because enumeration is empty 
    } 
} 

Output: 
Exception in thread "main" java.util.NoSuchElementException: Hashtable Enumerator 
     at java.util.Hashtable$EmptyEnumerator.nextElement(Hashtable.java:1084) 
     at test.ExceptionTest.main(NoSuchElementExceptionDemo.java:23) 
-1

Добавить еще catchException класс. Это родительский класс.

catch(Exception e){ 
//your message or 
    System.out.print(e.getMessage()); 
} 

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

Он поймает все исключения, которые поднимает ваша программа.

+0

@ downvote, почему downvote? – Pirate

+0

Как правило, не рекомендуется переключаться с определенных исключений на общее исключение. Информация может быть потеряна, а конкретные исключения помогут отладить. (не уменьшилось) – Nico

+0

да. я знаю, но в конце вы должны использовать это, если не знаете, какое исключение может быть брошено программой. – Pirate

0

В Java Исключения используются для обозначения неожиданных ситуаций. Например, разбор нечислового String на номер (NumberFormatException) или вызов метода по ссылке null (NullPointerException). Вы можете их поймать разными способами.

try{ 
    //some code 
} catch (FormatterClosedException e1) { 
    e.printStackTrace()  //very important - handles the Exception but prints the information! 
} catch (NoSuchElementException e2) { 
    e.printStackTrace(); 
} 

или используя тот факт, что все они проходят Exception:

try { 
    //somecode 
} catch (Exception e) { 
    e.printStackTrace; 
}; 

или так Java 7:

try { 
    //somecode 
} catch (FormatterClosedException | NoSuchElementExceptione) { 
    e.printStackTrace; 
}; 

Вы должны поймать всех checked exceptions. Это из-за языковой грамматики. С другой стороны, есть unchecked exceptions, который не обязательно должен быть пойман.

IllegalArgumentException - это исключенное исключение, и поэтому его не нужно ловить. NoSuchInputException может быть выброшен input.next(). Вот почему объявлено, что его поймали.

Итак:

  1. вы имеете дело с 3-х различных Exception с.
  2. Все они неконтролируемы, поэтому их не нужно поймать.
  3. input.next() может throw NoSuchElementException
  4. format может throw FormatterClosedException
+0

Зачем? – xenteros

+0

Я думаю, потому что вы не ответили на вопрос. Может быть, вы промахнулись и пошли не в ту сторону. Он просто спросил, почему он должен поймать исключения, замеченные в его посте, (почему книга говорит ему поймать их) и откуда они родом. – Nico

+0

Прочтите последнюю часть ответа – xenteros

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