Бросать и ловить несколько исключений - PullRequest
0 голосов
/ 27 октября 2018

Привет, сообщество 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, но почему?

Спасибо за ответы!

Редактировать: Я получил это сейчас! Первое выброшенное Исключение напечатало все другие сообщения, потому что они были объявлены в конструкторе суперклассов Исключения, и они должны быть сконструированы, чтобы подкласс мог работать.

1 Ответ

0 голосов
/ 27 октября 2018

Ваш 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
...