下面的代码有一些问题。在这个程序中,我输入项目的描述、单位和价格。我为用户输入负数的可能性创建了两个自定义异常类。当我运行程序时,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");
}
}
如果我错了,请纠正我,但程序不应该执行吗catch语句之后的语句是否存在异常?我是以为唯一的办法就是使用finally块
恐怕你错了。try-catch
的要点是,我们在try
中执行一些可能失败的代码。如果抛出异常,那么我们在catch
块中处理失败,然后照常进行(而不是将异常传播到更高级别,可能退出整个程序),在catch块之后执行任何进一步的代码。
无论是否引发异常,都会执行finally
块中的代码。这用于关闭无论发生什么情况都需要清理的资源(如打开的文件)。
如果您想在抛出异常后跳过所有内容,那么使用try-catch
处理异常是没有意义的。您最好在更高级别处理异常(尽管在您的示例中您已经处于顶级级别,即main
)。
当一个方法在try块内抛出异常时,它会跳过try块中的所有其他方法,执行catch块,然后从catch块后的下一行继续。
为了防止这种情况,在捕获块中添加一个System.exit(0);
如果您还有一个finally块,即使您关闭catch块中的程序,它也会被执行。
Java使用异常处理的终止模型,它的行为基本上与您所经历的一样:
终止该方法中的进一步处理,并且控制转移到可以处理该类型的最近的异常处理程序遇到个异常,共个从这里:http://www.informit.com/articles/article.aspx?p=464630&seqNum=4.
当异常处理程序(catch块)在try/catch块之后的第一行代码处连续处理完执行时。
在异常处理的恢复模型中,处理完异常后,流返回到抛出异常的位置,程序从那里开始连续。
使用System.exit(0);在挡块内。