【问题标题】:Try/Catch Blocks and Following StatementsTry/Catch 块和以下语句
【发布时间】:2014-04-24 21:37:52
【问题描述】:

我在下面的代码中遇到了一些问题。在这个程序中,我输入了商品的描述、单位和价格。我为用户输入负数的可能性制作了两个自定义异常类。当我运行程序时,catch 语句确实有效,但我觉得奇怪的是,catch 块之后的语句仍然执行。如果我错了,请纠正我,但是如果有异常,程序不应该在catch语句之后执行语句吗?我的印象是,唯一的方法是使用 finally 块。任何帮助将不胜感激!

  import java.util.Scanner;

public class RetailItemDemo
{
    public static void main (String[] args)
    {
        Scanner keyboard = new Scanner(System.in);
        RetailItem item = new RetailItem();

    System.out.print("Item description: ");
    item.setDescription(keyboard.nextLine());

    try 
    {
        System.out.print("Units on hand: ");
        item.setUnitsOnHand(keyboard.nextInt());

        System.out.print("Item price: ");
        item.setPrice(keyboard.nextDouble());
    }

    catch (NegativeUnitsException nue)
    {
        System.out.println(nue);
    }

    catch (NegativePriceException npe)
    {
        System.out.println(npe);
    }

    System.out.println("\nThe item is a  " + item.getDescription());
    System.out.println("There are " + item.getUnitsOnHand() + " units on hand");
    System.out.println("The item price is " + item.getPrice() + "\n");
 }
}

【问题讨论】:

  • 如果异常被“捕获”,则处理
  • Here's Java 异常处理教程。
  • 这真的很有帮助,谢谢!
  • 感谢所有回答的人!

标签: java exception exception-handling try-catch-finally


【解决方案1】:

如果我错了,请纠正我,但程序不应该执行吗 如果有异常,catch 语句后的语句?我曾是 给人的印象是,唯一的方法是使用 finally 块。

恐怕你错了。 try-catch 的重点是我们在try 中执行一些可能会失败的代码。如果抛出异常,那么我们在 catch 块中处理失败,然后照常进行(而不是将异常传播到更高级别,可能退出整个程序),在 catch 块之后执行任何进一步的代码。

finally 块中的代码无论是否抛出异常都会被执行。这用于关闭无论发生什么都需要清理的资源(例如打开的文件)。

如果您想在抛出异常后跳过所有内容,那么使用try-catch 处理异常是没有意义的。您最好在更高级别处理异常(尽管在您的示例中您已经处于顶层,即main)。

【讨论】:

  • 请注意,终结器不需要运行并且不需要立即运行。这使得它们使用起来有潜在的危险。资料来源:Robert Bloch,Effective Java,第 2 版。
  • @AnubianNoob 这里没有关于终结器的内容。
  • @AnubianNoob finally 块与终结器完全不同。
【解决方案2】:

当一个方法在 try 块中抛出异常时,它会跳过 try 块中的所有其他方法,执行 catch 块,然后从 catch 块之后的下一行继续。

为防止这种情况,请在 catch 块中添加 System.exit(0);

如果你还有一个 finally 块,即使你在 catch 块中关闭程序,它也会被执行。

【讨论】:

    【解决方案3】:

    Java 使用异常处理的终止模型,它的行为基本上与您的体验相同:

    该方法中的进一步处理被终止并且控制是 转移到最近的可以处理该类型的异常处理程序 遇到的异常 从这里:http://www.informit.com/articles/article.aspx?p=464630&seqNum=4

    当异常处理程序(catch 块)完成处理后,在 try/catch 块之后的第一行代码继续执行。

    异常处理的恢复模型中,处理完异常后,流程会从抛出异常的地方返回,程序从那里继续。

    【讨论】:

      【解决方案4】:

      使用 System.exit(0);在 catch 块内。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-20
        • 2011-09-17
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 2015-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多