引发并捕获多个异常

时间:2018-10-27 09:53:42

标签: java exception try-catch

嘿StackOverflow社区,

我正在尝试编写引发并捕获我所犯的多个异常的代码。 可能是什么问题?

我想获得以下输出:

Doing risky
Boi
Fooi
Fooi
Fooi
FINAAAL WIN

主类如下:

public class Dorisk {

public static void main(String[] args) {

    Dorisk dora = new Dorisk();

    try {
        dora.Dorisky(1);
    }catch(BoinkException bo){
        System.out.println("Boi");
    }catch(FooException fo){
        System.out.println("Fooi");
    }catch(BazException ba){
        System.out.println("Baaai");
    }finally{
        System.out.println("FINAAAL WIN");
    }
}



public void Dorisky(int x)throws BazException{

        while( x < 5 ){
        System.out.println("Doing risky");
        if(x ==1){
        throw new BoinkException();
        }
        if(x ==2){
        throw new BiffException();
        }   
        if(x ==3){
        throw new BarException();
        }
        if(x ==4){
        throw new FooException();
        }
    x++;

    }
  }
}

例外是:

public class BazException extends Exception{

    public BazException(){
        System.out.println("Baz baja");
    }
}

public class FooException extends BazException{

    public FooException(){
        System.out.println("Foo baja");
    }
}

public class BarException extends FooException{

    public BarException(){
        System.out.println("Bar baja");
    }
}

public class BiffException extends FooException{

    public BiffException(){
        System.out.println("Biff baja");
    }
}


public class BoinkException extends BiffException{

    public BoinkException(){
        System.out.println("Boink baja");
    }
}

但我得到的是:

Doing risky
Baz baja
Foo baja
Biff baja
Boink baja
Boi
FINAAAL WIN

什么告诉我只有doRisky方法中的第一个Exception被抛出,为什么?

谢谢您的回答!

  

编辑:我明白了!抛出的第一个Exception会打印所有其他消息,因为它们是在Exception超类的构造函数中声明的,并且必须对其进行构造,以便子类可以运行。

1 个答案:

答案 0 :(得分:0)

您的Dorisky方法在x = 1时引发异常。 表示Dorisky方法返回了BoinkException的调用者方法作为例外。

if(x ==1){
    throw new BoinkException();
}
  

首先,为什么要返回多个异常?

这不是正确的设计方法。顺便说一句...我为您的理解而实施。

在这里,我为每个抛出创建了CustomException,并创建了ExceptionList来保存抛出异常的列表。

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    private static ArrayList<Exception> ex = new ArrayList<Exception>();

    private static class CustomException extends Exception {
        int i;
        public CustomException(int i) {
            this.i = i;
        }

        public String toString() {
            return "Exception: " + i;
        }
    }

    private static class ExceptionList extends Exception {
        ArrayList<Exception> ex = new ArrayList<Exception>();
        public ExceptionList(ArrayList<Exception> ex) {
            this.ex = ex;
        }

        public ArrayList<Exception> getEx() {
            return ex;
        }
    }

    public static List<Exception> process() throws Exception {
        int i = 0;
        while(i < 5) {
            if(i == 1) {
                ex.add (new CustomException(i));
            } else if(i==2) {
                ex.add (new CustomException(i));
            } else if(i==3) {
                ex.add (new CustomException(i));
            }
            i++;
        }

        if(ex.size() > 0) {
            throw new ExceptionList(ex);
        } else {
            return null;
        }
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        try {
            new Ideone().process();
        } catch(ExceptionList ex) {
            for(Exception ei : ex.getEx()) {
                System.out.println(ei.toString());
            }
        }
    }
}

Output 

Exception: 1
Exception: 2
Exception: 3