抛出异常处理中的子句

时间:2014-07-26 11:08:07

标签: java android exception exception-handling

我已经阅读了数百篇有关此事的帖子,但我仍不清楚这一点。

  • 当我写这样的函数时

     public List<String> getTrackIds(int limit) throws NotConnectedException, UnauthorizedException {
             ...
        } 
    

这意味着该函数可以抛出这些异常。但是不是需要在try / catch块中捕获它吗?我怎么会抓到     在这种情况下例外?

  • 。当我尝试调用此函数时,则强制写入            try / catch块在调用中编写throws子句            功能。再次,如果我不写一个,我将如何捕获这些例外            try / catch block?

6 个答案:

答案 0 :(得分:8)

使用例外,您可以:

  • 使用try catch块来处理它们。 (这是我的问题)
  • 在方法规范中使用throws声明它们。 (这不是我的问题,你处理它)

对于后一种可能性,该方法的调用者再次具有相同的两个选项。如您所见,Exceptions可以在程序流程中一直声明为throws。甚至可以使用这些static void main(String[] args)子句声明throws,这最终意味着当抛出一个声明的Exception时,您的应用程序将崩溃。


让我们看看以下示例:

/**
 * Throws a MyException.
 */
public static void methodThrowsException() throws MyException {
    throw new MyException();
}

/**
 * Calls methodThrowsException(), and handles the thrown MyException
 */
public static void myMethod() {
    try {
        methodThrowsException();
    } catch(MyException e) {
        /* Do something */
    }
}

/**
 * Calls methodThrowsException, but does not handle the thrown MyException.
 */
public static void mySecondMethod() throws MyException {
    methodThrowsException();
}

调用myMethodmySecondMethod时,会发生以下情况:

public static void main(String[] args) {
    myMethod(); /* No catching needed */
    try {
        mySecondMethod();
    } catch(MyException e){
        /* Catching needed */
    }
}

正如您所看到的,mySecondMethod刚刚将MyException的问题转移到其来电者身上。

答案 1 :(得分:2)

假设你有methodA,它由methodB调用,由methodC调用,依此类推......


示例1:

methodA抛出IOException。

然后,methodB必须抛出它,或者捕获它以结束抛出。 (让我们说它抛出它)。

因此,methodC必须抛出它或捕获它(再次,让它说它抛出它)。

让我们说methodD实际上是主要的方法。同样,你必须抛弃它或抓住它。如果你把它扔到这里,我们就处于起点,没有地方可以扔掉它,所以这将阻止程序的运行。或者你可以抓住它。


示例2:

methodA抛出IOException。

方法B再次必须捕获它或抛出它。这一次,它抓住了它。

methodC不再需要抛出或捕获它,因为它在methodB中处理。

答案 2 :(得分:2)

您应该检查此链接以了解何时应该处理异常(try-catch)以及何时应该声明它们(使用throws子句):http://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

现在,回答你的问题 -

但是不需要在try / catch块中捕获它吗?

并非总是如此。这取决于异常的类型。 Java有两种类型的例外:CheckedUncheckedError是运行时无法恢复的情况。请在此处详细了解http://docs.oracle.com/javase/tutorial/essential/exceptions/

对于可能抛出已检查异常的代码,您MUST会提供以下内容之一:

  1. try-catch block
  2. 方法声明中的throws子句
  3. 对于可能抛出未经检查的异常的代码,编译器不会强制您处理它们或声明它们。但是,如果你愿意的话,你可以做其中之一。

    在这种情况下我如何捕捉异常?

    在您的情况下,NotConnectedExceptionUnauthorizedException都是未经检查的例外情况。所以你可以(但不是被编译器强制)在你的方法代码中编写try-catch块,或者你可以在throws子句中声明它们。当你在throws子句中声明它们时,方法的调用者知道从它抛出这些异常MAY并计划在它们的末尾编写自己的try-catch用于异常处理。

    当我尝试调用此函数时,必须在调用函数中编写try / catch块或写一个throws子句。

    正如我所提到的,两个异常都是未选中的(继承自RuntimeException),因此您不需要这两个异常。但你可以做其中一个。

    再次,如果我不编写try / catch块,我将如何捕获这些异常?

    你不这样做。该方法的调用者必须使用自己的try-catch计划异常处理。

答案 3 :(得分:0)

有3种异常

  1. 语法错误:编译错误
  2. 逻辑错误:-runtime
  3. 运行时错误:运行时(最危险的错误)
  4. 这里1和2可以由程序员手动解决。

    然而,当存在运行时错误时,例如: - 用户输入1/0这是一个例外,1000行代码在那个时刻消失了。

    所以java开发人员认为他们将如何解决这类问题。 所以他们介绍了两件事: -

    1. 引发
    2. 最后试试。
    3. 所以java中有两种类型的异常

      1. 已选中(您将始终需要处理已检查的例外的处理程序)
      2. 未检查
      3. 现在让我们谈谈投掷的工作方式: -

        投掷从未捕获异常。它只是告诉jvm它包含异常,jvm应该忽略这个异常。 现在我知道你会想到如果代码中有一些异常,jvm将如何处理它。 jvm将在运行时抛出异常。您只能对已检查的execption使用throws。

        而在try catch中,Try块将查看是否存在可捕获的异常,然后捕获该异常,并且可以运行其他代码。该方法的调用者必须使用自己的try-来规划异常处理捉。

答案 4 :(得分:0)

try ... catch(甚至最后:))块应该是调用方法。
例如,调用者方法是:

public void handleTracks() {

 int limit = 100;
 try {
    List<String> trackIds = getTrackIds(trackIds);
 } catch (NotConnectedException ex) {
   System.err.println("No connection was established to the tacks system. Please perform login").
 } catch (UnauthorizedException ex) {
    System.err.println("The user is unauthorized to handle the track").
 }
}

正如您所看到的,各种异常类型有不同的处理方法 如果需要,并且您正在使用JDK 7及更高版本,您可以使用catch块看起来像:

} catch (UnauthorizedException | NotConnectedException ex) {
    System.err.println("An error").
 }

这在您的方法抛出多个异常的情况下很有用,对于2个或更多异常,您希望获得相同的处理,并且对于其他异常处理。

另一种选择当然只有一个

 catch (Exception ex) {
    System.err.println("An error").
 }

但是这将捕获所有异常,包括声明的和非声明的(运行时异常仍然可能被方法抛出,即使未在签名的throws部分声明)。

< / p>

希望这有帮助。

答案 5 :(得分:0)

我想再添加一个我使用自定义异常的示例,这可能有助于进一步了解异常的使用方式以及所有异常如何组合在一起。在Calculator程序中,我有一个ValidationException:

public class ValidationException extends Exception {

    public ValidationException(String msg){
        super(msg);
    }

}

我有一个控制器,它将数学和作为字符串。即它将类似于&#34;(2 + 2) - 1 * 3&#34;。

在计算答案之前,它进入验证器检查总和是否有效(它确实检查总和中没有字母,检查它不为空,检查彼此没有两个数学运算符,等等)。

public class Validator {

    public void check(String sum) throws ValidationException{
        checkForNull(sum);
        checkForLetters(sum);
    }

    private void checkForNull(String sum) throws ValidationException{
        if(sum==null || sum.equals("")){
            throw new ValidationException("You must enter a sum");
        }
    }


    private void checkForLetters(String sum) throws ValidationException {
        if(.......){
            throw new ValidationException("The sum cannot contain letters");
        }
    }

}

然后控制器的句柄如下所示:

public void handle(){

    String sum = view.getSumFromUser();
    try{
        validator.check(sum);
        String answer = calculator.calculate(sum);
        view.outputResponse("The answer is " + answer);
    } catch (ValidationException ex){
        view.outputResponse(ex.getMessage());
    }

}

在最后一个方法中,只有在validator.check(sum)完成且没有例外的情况下才会运行calculator.calculate(sum)。

如果存在异常,则用户会收到异常消息。