java 异常捕捉机制
一、相关知识学习
异常是指程序在执行过程中出现的意外事件,异常通常会使得程序的正常流程被打断。
1、 Java的异常处理方法
Java的异常捕捉和处理的语法格式:
try
{
//可能抛出异常的语句模块
}
catch(异常类型1)
{
//处理异常类型1的语句
}
……
catch(异常类型n)
{
//处理异常类型n的语句
}
finally
{
//无论是否抛出异常都会被执行的语句
}
说明:
- 如果try模块中抛出异常,则try模块中异常点之后的语句将不会被继续执行
- 如果try模块中抛出异常,则重写的catch模块顺序去匹配异常的类型,匹配成功的catch模块将被执行,其余的catch模块不会被执行。
- 如果try模块中不抛出异常,则所有的catch模块都不会被执行
- finally模块总是在try-catch语句结束的时候被执行
- 当try-catch-finally语句执行完毕之后,无论是否抛出异常,都接着执行后面的语句
2、 Java的异常类
在Java中定义了很多异常类,主要有两大类:Error类及其子类;Exception类及其子类。当程序抛出异常时,系统会自动产生一个异常类对象,可以被与之类型匹配的catch语句所捕捉到。Java中的所有错误和异常类都继承自Throwable类,在java.lang包中定义。
3、异常的抛出和处理
只有当异常在try模块中被抛出时,可以被catch模块所捕捉。 如果要在程序中由程序自己抛出一个系统未定义过的异常,则必须使用throw语句显示地进行抛出。
throw语句的语法是:
throw <异常类对象>;
注意:只有Throwable类及其子类对象才能被抛出、捕捉。
抛出异常后,对其捕捉和处理有两种情况:
①、在同一个方法中抛出并处理异常
在同一个方法中抛出并处理异常时,throw语句必须写在try模块中,通过try-catch-finally语句来完成异常捕捉。
②、在一个方法中抛出异常而在另外一个方法中处理异常
如果抛出异常和处理异常的不是同一个方法,则要求在抛出异常的方法定义后必须加入语句:throws Exception
然后,在另外的方法中调用此方法时,必须把调用的语句放在try模块中,然后通过try-catch-finally语句来完成异常捕捉。
4、自定义的异常类
系统只会自动抛出系统定义的异常,因此自定义的异常只能人为判断后通过throw语句显示地抛出而无法由系统自动抛出。
自定义异常类:
class 自定义异常类 extends Exception
{
//类的属性、构造方法、其他方法等的定义
}
......
//在其他某个类的某个方法中使用此“自定义异常类”时
//实例化“自定义异常类”对象
自定义异常类 my_e=new 自定义异常类();
try{
if(条件表达式)throw my_e;
//其他语句
}
catch(自定义异常类 e)//捕捉“自定义异常类”异常
{
//捕捉到异常之后的处理程序
}
二、训练
1、完成一个 java application应用程序,完成c=a/b 的计算并输出c的结果,可以为a和b在程序中赋初值、或者接收用户通过键盘输入a和b的数值文本后转换为数字等,在程序要求当 b 为0时c的计算结果正确。
java程序(test1.java)
import java.util.Scanner;
public class test1
{
public static void main(String[] args)
{
Scanner s=new Scanner(System.in);//声明对象Scanner,System.in代表标准输入,就是键盘输入
System.out.println("请输入a:");//输入提示
int a=s.nextInt();//读取输入的字符放入a中
System.out.println("请输入b:");
int b=s.nextInt();
try {
int c=a/b; //计算c的值
System.out.println("输出c:"+c);//输出c=a/b的值
}catch(ArithmeticException e)
{
System.out.println("没有意义,分母b不能为0!");//输出c=a/b的值
}
}
}
运行效果图
2、完成一个 java application应用程序,完成一个计算绝对值表达式 |a-b|的功能。要求当b比a大时人为抛出一个自定义异常,在计算绝对值时通过异常捕捉机制完成此绝对值表达式的计算。
java程序(test2.java)
public class test2
{
public static void main(String[] args)
{
int a=3,b=10,x;
try {
//人为判断的异常,而不是靠系统自动抛出异常
if(a<b) throw new Exception("我抛出的异常:b比a大");
x=a-b;
}catch (Exception e)//异常捕捉
{
x=b-a;
System.out.println(e.toString());
}
System.out.println("x="+x);
}
}
运行效果图