在main方法中抛出异常

时间:2013-07-13 10:30:45

标签: java exception

我想弄清楚为什么我必须在主方法中遇到throw异常,而我有try / catch块可以处理这些异常? 即使我删除throws IllegalArgumentException,InputMismatchException部分,该程序仍然可以编译并完美地工作。

public static void main(String[] args) throws IllegalArgumentException,InputMismatchException{
    boolean flag = true;
    Scanner in = new Scanner(System.in);
    do{
        try{
            System.out.println("Please enter the number:");
            int n = in.nextInt();
            int sum = range(n);
            System.out.println("sum = " + sum);
            flag = false;
        }
        catch(IllegalArgumentException e){
            System.out.println(e.getMessage());
        }
        catch(InputMismatchException e){
            System.out.println("The number has to be as integer...");
            in.nextLine();
        } 

6 个答案:

答案 0 :(得分:9)

如果您希望它由“更高”的功能处理,您只会抛出异常。

注意: 异常不会在抛出时消失。它仍然需要处理。

public void functionA() throws Exception{
  throw new Exception("This exception is going to be handled elsewhere");
}

如果要立即处理异常,请使用try/catch块。

public void functionB(){
  try{
    throw new Exception("This exception is handled here.");
  }catch(Exception e){
    System.err.println("Exception caught: "+e);
  }
}

如果您已经使用try/catch块来捕获异常,那么您无需再将该异常抛出。

public void functionC() throws Exception{
  try{
    throw new Exception("This exception doesn't know where to go.");
  }catch(Exception e){
    System.err.println("Exception caught: "+e);
  }
}

答案 1 :(得分:3)

任何方法都有两种选择来处理该方法中可能发生的异常:

首选是使用catch处理方法中的异常,不要告诉任何人。这种方法在处理错误时很有用,这对调用它的方法没有影响。

第二种选择是捕获方法中的异常,可能会也可能不会处理异常。另外告诉调用方法出了问题,所以你需要做。这种方法很有用,应该用于导致需要在上面传播到调用层次结构的问题的异常。

  

我认为从中抛出异常并不是一个好主意   主要方法。因为即使你不扔它,JVM也会得到它   例外并将退出。你能做的最好的就是抓住那些   除外,并在主要内部采取一些纠正措施。如果   无论你是否投掷,例外都是灾难性的   程序将退出。

答案 2 :(得分:2)

简单回答:

如果代码处理了所有已检查的异常,则无需声明要抛出的方法。

另见:

http://www.javapractices.com/topic/TopicAction.do?Id=129

答案 3 :(得分:1)

有时主叫方不希望抛出异常,因为他们不想处理此类异常。在这种情况下,我们将使用try catch finally块抛出异常的代码包含在内。

但是,如果您想要专门捕获某个异常并尝试对其进行某些操作,或者您想要向主叫方抛出客户异常,那么您应该首先捕获它。

建议永远不要吞下异常,也不要捕获并重新抛出相同的异常。

答案 4 :(得分:0)

基本上需要处理检查的异常。编译器力量这样做。你可以通过try catch或throws子句来做到这一点。其中一个就足够了。

当您不想通过调用代码来处理该异常时,您将采用第一种方法。

答案 5 :(得分:0)

您正在使用try-catch在代码中处理异常。这就是原因。