Java 使用自定义异常处理特定场景
我有Java 使用自定义异常处理特定场景,java,Java,我有狗、巧克力和金枪鱼课程,而狗不能吃巧克力。因此,当用户调用dog.eat(chocolate)时,jshell中所需的输出是: 狗不能吃巧克力 虽然我当前的代码可以工作,但它似乎不是处理异常的正确方法 public boolean eat(食物){ String cannotEat=this.toString()+“不能吃”+food.toString(); if(巧克力食品实例){ 系统错误打印LN(cannotEat); 返回false; } 返回true; } } 但是,如果我试图
狗
、巧克力
和金枪鱼
课程,而狗
不能吃巧克力。因此,当用户调用dog.eat(chocolate)
时,jshell中所需的输出是:
狗不能吃巧克力
虽然我当前的代码可以工作,但它似乎不是处理异常的正确方法
public boolean eat(食物){
String cannotEat=this.toString()+“不能吃”+food.toString();
if(巧克力食品实例){
系统错误打印LN(cannotEat);
返回false;
}
返回true;
}
}
但是,如果我试图将代码封装在try-and-catch块中,例如
public boolean eat(食物)抛出CannoteAteException{
String cannotEat=this.toString()+“不能吃”+food.toString();
试试{
如果(!巧克力食品实例){
抛出新的CannotEatException(cannotEat);
返回false;
}
捕获(CannotateException e){
System.err.println(e.message());
返回true;
}
}
}
返回异常发生在哪一行的异常,这不是所需的输出
处理此异常的正确编码方式是什么?另外,CannoteException
是从IllegalArgumentException
扩展而来的,但我不确定如何表明在dog.eat(Chocolate)
中有巧克力是非法的参数
提前谢谢 当你调用eat方法,传递食物时,你需要捕捉抛出的异常。在你们称之为“吃”的捕捉区内捕捉意味着动物不能吃这种食物。你们可以从你们称之为“吃”的地方继续前进。eat函数可能无效,因为引发异常表示它失败,而不引发异常表示它成功
try{
human.eat(Food.chocolate);
dog.eat(Food.meat);
dog.eat(Food.chocolate);
}
catch(CannotEatException e){
System.err.println(e.message());
// One of the above animals could not eat the provided food.
// Do you care? Maybe, the dog might take damage for the chocolate.
}
异常通常在调用堆栈中抛出的位置上方的某个位置进行处理。相反,在你的进食方法中,当狗吃的食物是巧克力时,你可以伤害狗或治愈人。这完全取决于您如何分离对象责任和交叉关注点 抛出的异常会中断程序的执行。因此,您必须使用“try-catch”块来处理异常,并且您的程序执行类似于向日志文件显示用户消息的操作 想象一下这样的类的行为:
interface Animal {
eat(Food food) throws CannotEatException;
boolean canEat(Food food);
}
class CannotEatException extends IllegalArgumentException {
private Food food;
public CannotEatException(Food food) {
super("Can not eat:" + food.toString());
this.food = food;
}
public Food getFood() {
return this.food;
}
}
您可以使用“if-then-else”或“try-catch”块定义程序流:
你需要一个关于异常的教程。它并不是在返回异常。我同意@Raedwald的观点,那就是它抛出一个并停止执行。这是你需要学习的东西,你可以通过拿起一本好书或一本教程来学习这门学科。
if (myPet.canEat(chocolate)) {
myPet.eat(chocolate);
} else {
myPet.eat(safeFood);
}
...
try {
myDog.eat(someFood);
catch (CannotEatException e) {
callVet(e.getFood());
}