在程序中,异常可能是由程序员没有预料到的各种情况产生,也可能由超出了程序员可控制范围的环境因素产生。在Java中,这种在程序运行时可能出现的一些错误称为异常。异常是一个在程序执行期间发生的事件,它中断了正在执行的程序正常指令流。
在项目中创建类,在主方法中定义int型变量将0作为除数的算术表术表达式赋值给该变量,代码如下:
public class Baulk {//创建类
public static void main(String[] args) {//主方法
int result=3/0;//定义int型变量并赋值
System.out.println(result); //将变量输出
}
}
运行结果:
发生了算术异常,系统不再执行下去,提前结束
异常的抛出
异常抛出后,如果不做任何处理,程序就会被终止。
在项目中创建类,在主方法中实现将不是数字形式的字符串转换为int型。运行程序,系统会报出异常提示。代码如下:
public class Test2 {//创建类
public static void main(String[] args) {//主方法
String str="lili";//定义字符串
System.out.println(str+"年龄是:");//输出的提示信息
int age=Integer.parseInt("20L");//数据类型的装换
System.out.println(age);//输出信息
}
}
运行结果:
这是数字格式异常,提示信息”lili年龄是”已经输出,可知该句代码之前并没有异常,而变量age没有输出,可知程序在执行类型转换代码时已经终止。
捕捉异常
Java语言的异常捕获结构由try、catch和finally三部分组成。try语句块存放的是可能发生异常的Java语句;catch语句;catch语句块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块。语法如下:
try{
//程序代码块
}
catch(Exceptiontype1 e){
//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){
//对Exceptiontype2的处理
}
...
finally{
//程序代码块
}
完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论 之前的try-catch语句块是否顺利执行完毕,都会执行finally语句。以下4种特殊情况下,finally块不会被执行:
- 在finally语句块中发生了异常
- 在前面的代码中使用了System.exit()退出程序
- 程序所在的线程死亡
- 关闭CPU
在项目中创建类,在主方法中使用try-catch语句块将可能出现的异常语句进行处理。代码如下:
public class Test2 {//创建类
public static void main(String[] args) {//主方法
try {//try语句块中包含可能出现异常的程序代码
String str="lili";//定义字符串
System.out.println(str+"年龄是:");//输出的提示信息
int age=Integer.parseInt("20L");//数据类型的装换
System.out.println(age);//输出信息
}catch(NumberFormatException e) {//catch语句块用来获取异常信息
System.out.println("出现数字格式异常");//输出异常信息
}finally {
System.out.println("程序结束");
}
}
}
运行结果:
自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户只需要继承Exception类即可自定义异常。在程序中使用异常类,大体可分为以下几个步骤:
- 创建自定义异常
- 在方法中通过throw关键字抛出异常
- 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕捉并处理,否侧在方法的声明处通过throw关键字指明要抛出给方法调用者的异常,继续进行下一步操作
- 在出现异常的方法的调用者中捕获并处理异常
创建自定义异常,在项目创建MyException类,该类继承Exception类。代码如下:
public class MyException extends Exception{//创建自定义异常,继承Exception
public MyException(String message) {//构造方法
super(message);//父类构造方法
}
}
自定义异常的抛出与捕捉,在项目创建Test2类,在该类中创建一个带有int型参数的方法avg(),通过throw关键字抛出一个MyException异常对象,并在main()方法中捕捉该异常。代码如下:
public class Test2{//创建类
static int avg(int num1,int num2) throws MyException{//定义方法发,抛出异常
if(num1<0||num2<0) {//判断方法中参数是否满足指定条件
//System.out.println("存在负数,无法计算");
throw new MyException("存在负数,无法计算");//错误信息
}
if(num1>100||num2>100) {//判断方法中参数是否满足指定条件
//System.out.println("大于一百,无法计算");
throw new MyException("大于一百,无法计算");//错误信息
}
return(num1+num2)/2;//将参数的平均值返回
}
public static void main(String[] args) {//主方法
try {//try语句块处理可能出现异常的代码
int result=avg(-32,56);//调用avg()方法
System.out.println(result);//将avg()方法的返回值输出
}catch(MyException e) {
System.out.println(e);//输出异常信息
}
}
}
运行结果:
使用throw关键字抛出异常
throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中捕获并处理异常则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常则,必须使用try-catch语句块。
创建自定义异常,代码如下:
public class MyException extends Exception {//创建自定义异常类
String message;//定义String类型变量
public MyException(String ErrorMessagr) {//父类方法
message=ErrorMessagr;
}
public String getMessage() {//覆盖getMessage()方法
return message;
}
}
使用throw关键字捕捉自定义异常,代码如下:
public class Test2{//创建类
static int quotient(int x,int y)throws MyException{//定义方法抛出异常
if(y<0) {//判断参数是否小于0
throw new MyException("除数不能是负数");//异常信息
}
return x/y;//返回值
}
public static void main(String args[]) {//主方法
try {//try语句块包含可能发生异常的语句
int result=quotient(3,-1); //调用方法quotient()
}catch(MyException e) {//处理自定义异常
System.out.println(e.getMessage());//输出异常信息
}catch(ArithmeticException e) {//处理ArithmeticException异常
System.out.println("除数不能为0");//输出提示信息
}catch(Exception e) {//处理其他异常
System.out.println("程序发生了其他的异常");//输出提示信息
}
}
}
运行结果: