我无法让用户定义的已检查异常正常工作

时间:2016-06-13 02:11:14

标签: java

我需要创建用户定义的已检查异常。不幸的是,当我尝试抛出它时,我得到错误:未报告的异常InsufficientFunds;必须被抓或宣布被抛出。

我已在方法签名中识别出异常,然后将其抛出到我希望它发生的方法中。但是,我仍然无法理解我所犯的错误。

非常感谢任何输入。

代码示例: main()的

if (e.getSource() == deposit) {
    accountType.deposit(money);
} else if (e.getSource() == withdraw) {
    if (money % 20 == 0) {
        accountType.withdraw(money);
    } else {
        JOptionPane.showMessageDialog(null, "Entry must be in $20 increments.");
    }
}

在此示例中,我在“accountType.deposit(money);”处收到未报告的异常错误。它运行以下方法:

public void withdraw(Double money) throws InsufficientFunds {
    if (count >= 4) {
        this.money = (money + FEE);
    } else {
        this.money = money;
    }
    if (this.balance < this.money) {
        throw new InsufficientFunds("You don't have enough money to do that!");
    } else {
        this.balance -= this.money;
        count++;    
    }
}

这是我的用户定义的异常类

public class InsufficientFunds extends Exception {

    public InsufficientFunds(String s) {
        super(s);
    }
}

任何能够对此有所了解并向我提供一些知识的人都将不胜感激。我确信我忽略了一些事情。

谢谢你, 布赖恩

2 个答案:

答案 0 :(得分:4)

您在InsufficientFunds方法中抛出了一个名为withdraw()的自定义异常,但您从未在调用方法中捕获该异常。因此,让错误消失的一种方法是将withdraw()调用放在try-catch块中:

if (e.getSource() == deposit) {
    accountType.deposit(money);
} else if (e.getSource() == withdraw) {
    if (money % 20 == 0) {
        try {
            accountType.withdraw(money);
        }
        catch (InsufficientFunds ife) {
            System.out.println("No funds to withdraw.");
        }
        catch (Exception e) {
            System.out.println("Some other error occurred.");
        }
    } else {
        JOptionPane.showMessageDialog(null, "Entry must be in $20 increments.");
    }
}

如果仔细观察,您会看到我首先捕获InsufficientFunds例外,然后是普通Exception。这是您通常要遵循的模式,即捕获特定异常后跟更常规的异常,最后捕获Exception以确保您处理可能出错的每个用例。

替代方法是让调用withdraw()的方法抛出异常,即

public static void main(String[] args) throws InsufficientFunds {
    if (e.getSource() == deposit) {
        accountType.deposit(money);
    } else if (e.getSource() == withdraw) {
        if (money % 20 == 0) {
            accountType.withdraw(money);
        } else {
            JOptionPane.showMessageDialog(null, "Entry must be in $20 increments.");
        }
    }
}

答案 1 :(得分:0)

您正在抛出自定义异常,但它永远不会被withdraw()捕获。 Java使用Catch或Declare Rule,这意味着必须在catch块中捕获异常,或者在throws关键字的方法标题中声明异常。

有关其他详细信息,请参阅this reference