Порядок выполнения Try-Catch-Finally

Вот код, демонстрирующий мою точку зрения (java):

public static int getSize(List<String> list)
{
    System.out.println("begin");
    try
    {
        System.out.println("get list size");
        return list.size();
    }
    catch (Exception e)
    {
        System.err.println("exception");
    }
    finally
    {
        System.out.println("finally");
        return -1;
    }
}

public static void main(String[] args) 
{
    List<String> list = null;
    int size = getSize(list);
    System.out.println("list size: " + size);
}

Я ожидал вывода:

begin
get list size
exception
finally
list size: -1

вместо этого я получаю другие вещи, а также тот, что выше... например, исключение может отображаться до получения размера списка и после исключения...

e.g.

begin
exception
get list size
finally
list size: -1

и

begin
get list size
finally
exception
list size: -1

Почему оно это делает? Каков правильный вывод?


person LarsChung    schedule 20.04.2014    source источник


Ответы (1)


System.out и System.err — это разные потоки. Тест отображается, когда поток смывается. Поскольку они разные, вы не можете быть уверены, когда произойдет каждый флеш. Попробуйте отобразить исключение в System.out и увидите разницу.

person jhamon    schedule 20.04.2014