5

考虑我有一个包含 3 条语句的 try 块,它们都导致异常。我希望所有 3 个异常都由其相关的 catch 块处理。这可能吗?

像这样-->

class multicatch
{
    public static void main(String[] args)
    {
        int[] c={1};
        String s="this is a false integer";
        try
        {
            int x=5/args.length;
            c[10]=12;
            int y=Integer.parseInt(s);
        }
        catch(ArithmeticException ae)
        {
            System.out.println("Cannot divide a number by zero.");
        }
        catch(ArrayIndexOutOfBoundsException abe)
        {
            System.out.println("This array index is not accessible.");
        }
        catch(NumberFormatException nfe)
        {
            System.out.println("Cannot parse a non-integer string.");
        }
    }
}

是否可以获得以下输出?-->>

Cannot divide a number by zero.
This array index is not accessible.
Cannot parse a non-integer string.
4

6 回答 6

10

是否可以获得以下输出?

不,因为只会抛出其中一个异常。try一旦抛出异常,执行就会离开该块,并假设有一个匹配的catch块,它会继续在那里。它不会回到try块中,因此您不能以第二个异常结束。

有关异常处理的一般课程,请参阅Java 教程,有关更多详细信息,请参阅JLS 的第 11.3 节

于 2013-06-04T21:06:03.790 回答
2

如果要捕获多个异常,则必须将代码拆分为多个 try/catch 块。

更好的方法是在不触发异常的情况下验证您的数据和记录错误。

于 2013-06-04T21:06:36.283 回答
0

这是一个非常糟糕的做法,但你可以做下一步(使用finally块解决你的问题):

private static void Main()
        {
            int[] c={1};
            String s="this is a false integer";
            try
            {
                int z = 0;
                int x = 5/z;
            }
            catch (ArithmeticException exception)
            {
                Console.WriteLine(exception.GetType().ToString());
            }
            finally
            {
                try
                {
                    c[10] = 12;
                }
                catch(IndexOutOfRangeException exception)
                {
                    Console.WriteLine(exception.GetType().ToString());
                }
                finally
                {
                    try
                    {
                        int y = int.Parse(s);
                    }
                    catch (FormatException exception)
                    {
                        Console.WriteLine(exception.GetType().ToString());
                    }
                }

                Console.ReadKey();
            }
        } 
于 2013-06-04T21:21:12.200 回答
0

一次显示所有异常处理是不可能的。每个异常的目标catch是对每种Exception类型进行不同的处理,否则将它们一起打印是没有意义的。

于 2013-06-04T21:32:05.807 回答
0

为了补充乔恩的答案,虽然您不会从单个try块中捕获多个异常,但您可以让多个处理程序处理一个异常。

try
{
    try
    {
        throw new Exception("This is an exception.");
    }
    catch(Exception foo)
    {
        System.Console.WriteLine(foo.Message);
        throw; // rethrows foo for the next handler.
    }
}
catch(Exception bar)
{
    System.Console.WriteLine("And again: " + bar.Message);
}

这将产生输出:

This is an exception.
And again: This is an exception.
于 2013-06-04T21:18:37.913 回答
0

不 ,

它不会执行所有三个 catch 语句。TRY块检查错误,然后执行从 TRY 块中出来。然后将执行合适的捕获。在您的情况下,ArithmeticException位于异常层次结构的顶部。所以它将执行,然后程序终止。

如果您在ArithmeticException之前给出Catch(Exception e)则将执行异常捕获...更好地阅读MSDN上的 SystemException Hierarchies

于 2014-12-16T11:08:15.927 回答