这是我第一次发帖提问,所以如果我含糊不清或者不清楚,我会道歉。我还在学习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);
}
}
答案 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字段。
这就是你在第二次印刷声明中使用的内容。因此,您的打印声明将打印出“奇怪的咖啡味道!!!”
通过这样做,您可以得到确切的字符串和异常意图。而且你可能会从茶,柠檬等中抛出相同的例外,但是如果你正在处理咖啡的流动,你会发现这是奇怪的咖啡味,而不是柠檬或茶等等。