Java 如何捕获抛出子句中列出的异常

Java 如何捕获抛出子句中列出的异常,java,exception,Java,Exception,如果我没有编写try/catch子句,如何捕获在throws子句中声明的异常 当我写这样的函数时 public List<String> getTrackIds(int limit) throws NotConnectedException, UnauthorizedException { ... } public List getTrackId(int limit)引发NotConnectedException、UnauthorizedExc

如果我没有编写
try
/
catch
子句,如何捕获在
throws
子句中声明的异常

  • 当我写这样的函数时

      public List<String> getTrackIds(int limit) throws NotConnectedException, UnauthorizedException {
              ...
         } 
    
    public List getTrackId(int limit)引发NotConnectedException、UnauthorizedException{
    ...
    } 
    
这意味着函数可以抛出这些异常。但是不需要在try/catch块中捕获它吗?我怎样才能抓住你 这种情况下的例外情况

  • 。当我尝试调用此函数时,必须写入 try/catch block在调用 功能。再说一次,如果我不写一个 试一试/接住拦网

除例外情况外,您可以:

  • 使用
    try catch
    块来处理它们。(这是我的问题)
  • 在方法规范中使用
    抛出
    声明它们。(这不是我的问题,你来处理)
对于后一种可能性,该方法的调用方再次具有相同的两个选项。如您所见,
异常
可以声明为
抛出
整个程序流。即使是
static void main(String[]args)
也可以用这些
throws
子句声明,这最终意味着当抛出一个声明的
异常时,应用程序将崩溃


让我们看看下面的例子:

/**
 * 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();
}
调用
myMethod
mySecondMethod
时,会发生以下情况:

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

如您所见,
mySecondMethod
刚刚将捕获
MyException
的问题转移到了它的调用者身上。

有3种异常

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

    然而,当出现运行时错误时,例如:-用户输入1/0,这是一个例外,此时1000行代码就付诸东流了

    所以java开发人员想,他们将如何消除这类问题。 所以他们介绍了两件事:-

  • 投掷
  • 最后试着接球
  • 因此,java中有两种类型的异常

  • 选中(选中的异常始终需要一个处理程序)
  • 未经检查
  • 现在,让我们谈谈投掷是如何工作的:-

    抛出永远不会捕获异常。它只是告诉jvm它包含异常,jvm应该忽略这个异常。 现在我知道您会想,如果代码中有异常,jvm将如何处理它。 jvm将在运行时抛出异常。您只能将抛出与选中的执行选项一起使用


    而在try-catch中,try-block将查看是否存在可以捕获的异常,然后捕获该异常并运行进一步的代码。该方法的调用方必须计划使用自己的try-catch处理异常。

    假设您有methodA,methodB调用该异常,methodC调用该异常,依此类推


    例1:

    methodA抛出IOException

    然后methodB必须要么扔掉它,要么抓住它,这样就结束了投掷。(假设它抛出了它)

    所以methodC要么扔掉它,要么抓住它(再说一遍,假设它扔掉了它)

    假设methodD实际上是主要的方法。再说一次,你要么扔,要么抓。如果你把它扔到这里,我们就在起点,没有地方可以扔,所以这将停止程序的执行。或者你可以抓住它


    例2:

    methodA抛出IOException

    methodB必须再次抓住它或扔掉它。这一次,它抓住了它


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

    您可能应该检查此链接以了解何时应该处理异常(try catch)以及何时应该声明异常(with throws子句):

    现在,回答你们的问题--

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

    不总是这样。这取决于异常的类型。Java有两种类型的异常:
    Checked
    Unchecked
    。而
    Error
    是一种无法恢复的运行时情况,请在此处阅读更多有关它的信息

    对于可能引发选中异常的代码,
    必须提供以下选项之一:

  • 试挡
  • 方法声明中的throws子句
  • 对于可能引发未检查异常的代码,编译器不会强制您处理或声明它们。不过,如果你愿意,你可以做一个

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

    在您的情况下,
    NotConnectedException
    UnauthorizedException
    都是未经检查的异常。因此,您可以(但不受编译器的强制)在方法代码中编写try-catch块,也可以在throws子句中声明它们。当您在throws子句中声明它们时,方法的调用方知道这些异常
    可能会从中抛出,并计划编写自己的try-catch,以便在其端进行异常处理

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

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

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

    你没有。方法的调用方必须计划使用自己的try-catch进行异常处理。

    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").
     }
    }
    
    这在方法引发多个异常的情况下很有用,对于2个或更多异常也很有用
    } catch (UnauthorizedException | NotConnectedException ex) {
        System.err.println("An error").
     }
    
     catch (Exception ex) {
        System.err.println("An error").
     }
    
    public class ValidationException extends Exception {
    
        public ValidationException(String msg){
            super(msg);
        }
    
    }
    
    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());
        }
    
    }