我无法理解异常错误代码的一部分

时间:2015-01-10 07:05:39

标签: java

这是我第一次发帖提问,所以如果我含糊不清或者不清楚,我会道歉。我还在学习Java的一些基本知识,我在网上遇到了关于异常的教程。整个事情可以在这里找到:Java World: Exceptions in Java

这可能是一个愚蠢的问题,但我很难理解它。

class VirtualCafe {
    public static void serveCustomer(VirtualPerson cust,
        CoffeeCup cup) {
        try {
            cust.drinkCoffee(cup);
            System.out.println("Coffee tastes just right.");
        }
        catch (UnusualTasteException e) {
            System.out.println(
                "Customer is complaining of an unusual taste.");
            String s = e.getMessage();
            if (s != null) {
                System.out.println(s);
            }
            // Deal with an unhappy customer...
        }
    }
}

我无法理解你为什么要存储一个字符串对象,然后如果先前的println看起来像是在解决这个问题就打印出来。第二个println到底打印出来的是什么? drinkCoffee()会引发一些类型的例外,包括UnusualTasteException。我很感激任何反馈!

以下是UnusualTasteExpection的代码:

class UnusualTasteException extends Exception {
    UnusualTasteException() { }

    UnusualTasteException(String msg) {
        super(msg);
    }
}

3 个答案:

答案 0 :(得分:1)

举一个例子,如果抛出异常如下:

throw new UnusualTasteException("The coffee is very bitter");

您要问的println()会打印出The coffee is very bitter,这比通用的“异常品味”消息更具信息性。

答案 1 :(得分:1)

这段代码(有点)突出了几个方面:

  • 抓住异常并从中获取有意义的信息
  • 如果null不合适,可以处理

所以,让我们明确一点 - catch块中的代码处理我们从drinkCoffee抛出的UnusualTasteException方法返回的任何错误消息。也就是说,我们打印了一条更为通用的信息,表明客户对咖啡的品味不同寻常。

第二个println关注我们是否有任何有意义的事情可以从异常中学习;消息或线索或其他东西。也可能是某人以这种方式将null传递给构造函数:

throw new UnusualTasteException((String) null);

......或者更无害:

String msg = null;
throw new UnusualTasteException(msg);

如果我们没有任何有意义的打印出来,那么我们就不打印出来。我们还希望避免重复调用该方法,因此我们将调用的结果存储到变量中。这是第二个块完成的。

一般来说,这被认为是使用exceptions as flow control,因为有很多种方法可以恰当地处理这种情况(一种用于满足品味的枚举,或一种用于是否喜欢它的布尔值)饮酒者)。一般来说,它被认为是不好的做法,因为异常的生成成本非常高,应该保留给真正特殊的东西。

答案 2 :(得分:0)

所以你的代码(在drinkCoffee方法中)会做类似的事情:

throw new UnusualTasteException ("Weird coffee taste!!!");

如果您看到Exception类的父级,即Throwable有一个名为detailMessage的字段,然后当您调用上面的构造函数抛出异常时,它将设置detailMessage字段。

这就是你在第二次印刷声明中使用的内容。因此,您的打印声明将打印出“奇怪的咖啡味道!!!”

通过这样做,您可以得到确切的字符串和异常意图。而且你可能会从茶,柠檬等中抛出相同的例外,但是如果你正在处理咖啡的流动,你会发现这是奇怪的咖啡味,而不是柠檬或茶等等。