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());
}