2016-10-10 55 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类投2 exceptionIllegalFormatExceptionFormatterClosedException,但在我的书上面的代码捕获NoSuchElementExceptionFormatterClosedException我应该捕获一个方法抛出的所有异常吗?

  1. 为什么代码捕获NoSuchElementException,但没赶上IllegalFormatException
  2. 我们如何知道如果我们需要赶上NoSuchElementException如果甚至没有在在线documentation的格式化程序类format()方法中说明?
+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

我给你在答案的最后解释。这是'Scanner'谁可以抛出'NoSuchElementException'。 – xenteros

回答

1

Documentjava.util.NoSuchElementExceptionRuntimeException在Java中可 抛出由不同类,如迭代器,枚举,扫描器 或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()); 
} 

可以为每台exception你的代码抛出,并在结尾处添加此捕获这种异常的父类添加catch。如果您的exception未被任何catch发现,那么这将引发您的异常。

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

+0

@downvote为什么downvote? – Pirate

+0

从特定异常切换到一般异常通常不是一个好主意。信息可能会丢失,特定的例外将有助于调试。 (虽然没有downvote) – 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

为什么downvote? – xenteros

+0

我猜是因为你没有回答这个问题。也许你错过了,走错了方向。他只是问他为什么要抓住他在帖子中看到的例外(为什么这本书告诉他要抓到这些例外)以及他们来自哪里。 – Nico

+0

阅读答案的最后一部分 – xenteros