我应该捕获方法抛出的所有异常吗?

时间:2016-10-10 11:30:22

标签: java exception

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会抛出两个exceptionIllegalFormatExceptionFormatterClosedException,但在我的书中,上面的代码会捕获NoSuchElementExceptionFormatterClosedException

  1. 为什么代码捕获NoSuchElementException但没有捕获IllegalFormatException
  2. 如果在documentation的Formatter类format()方法中甚至没有说明NoSuchElementException,我们怎么知道是否需要捕获{{1}}?

3 个答案:

答案 0 :(得分:1)

  

Documentjava.util.NoSuchElementException RuntimeException ,可以是   由Java中的不同类引发,如Iterator,Enumerator, Scanner   或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 :(得分: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

答案 2 :(得分:-1)

使用$("input[name='hello']").click(function(){ var v=$("input[name='hello']:checked").val(); alert("you clicked on"+v); }); 类添加另一个catch。那是父类。

Exception

您可以为代码抛出的每个catch(Exception e){ //your message or System.out.print(e.getMessage()); } 添加catch,最后使用此Exception父类添加此catch。如果exception没有被exception抓住,那么这将抓住您的例外。

它将捕获您的程序引发的所有异常。