什么是异常?
就像我们人一样,每个人都希望自己健健康康的,但生活并不会按照我们所想的来,总会出现状况,发热,咳嗽等。程序也一样,程序在运行过程中也会发生各种非正常状况。
除零异常实例:
public class Demo {
public static void main(String[] args) {
//传入两个参数
int result = DivideByZero(4, 0);
System.out.println(result);
}
//定义一个两个数相除的方法
public static int DivideByZero(int a, int b){
return a/b;
}
}
运行结果会报除零异常:
在上面实例中运行结果出现了java.lang.ArithmeticException异常,这个异常只是Java异常类中的一种,下图摘自互联网:
从上图可以看出来,Throwable有两个直接子类Error和Exception类。Error表示程序出现的错误,Exception表示程序中产生的异常。
- Error类称为错误类:表示Java在运行时产生的系统内部错误或资源耗尽的错误,这是比较严重的,仅靠修改程序是无法修复的。
- Exception类称为异常类:表示程勋本身可以处理的错误。Exception类中有一个RuntimeException类,该类及其子类表示运行时异常,除此之外Exception类下的其他类都表示编译时异常。
异常处理try…catch…finally
try…cathc是Java提供的专门用于处理异常的方式。语法如下:
try{
//代码逻辑
}catch(ExceptionType e){
//对ExceptionType的异常处理
}
我们将上面的实例改造一下:
public class Demo {
public static void main(String[] args){
try {
//传入两个参数
int result = DivideByZero(4, 0);
System.out.println(result);
}catch (Exception e){
System.out.println("程序发生了异常...");
}
System.out.println("程序继续向下执行...");
}
//定义一个两个数相除的方法
public static int DivideByZero(int a, int b){
return a/b;
}
}
运行结果:
值得注意的是在try代码块中,发生异常的语句后面的代码不会执行。有时候我们写程序,就是希望有些代码无论是否发生必须要执行的,我们可以在try…catch语句后加一个finally代码块。
格式:
try{
//try块中放可能发生异常的代码。
//如果执行完try且不发生异常,则接着去执行finally块和finally后面的代码(如果有的话)。
//如果发生异常,则尝试去匹配catch块。
}catch(SQLException SQLexception){
//每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。Java7中可以将多个异常声明在一个catch中。
//catch后面的括号定义了异常类型和异常参数。如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。
//在catch块中可以使用这个块的异常参数来获取异常的相关信息。异常参数是这个catch块中的局部变量,其它块不能访问。
//如果当前try块中发生的异常在后续的所有catch中都没捕获到,则先去执行finally,然后到这个函数的外部caller中去匹配异常处理器。
//如果try中没有发生异常,则所有的catch块将被忽略。
}catch(Exception exception){
//...
}finally{
//finally块通常是可选的。
//无论异常是否发生,异常是否匹配被处理,finally都会执行。
//一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常。
//finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
}
实例:
public class Demo {
public static void main(String[] args){
int result = 0;
try {
//传入两个参数
result = DivideByZero(4, 0);
System.out.println(result);
}catch (Exception e){
//对异常进行处理
System.out.println("程序发生了异常...");
}finally {
//finally代码块
System.out.println("finally代码块执行了...");
System.out.println("输出结果:" + result);
}
System.out.println("程序继续向下执行...");
}
//定义一个两个数相除的方法
public static int DivideByZero(int a, int b){
return a/b;
}
}
运行结果:
throws关键字:
throws关键字使用来声明一个方法有可能会出现异常,让调用者必须在程序中处理这个异常。语法格式如下:
//修饰符 返回值 方法名(参数1,参数2) throws ExceptionType1,ExceptionType2{}
//可以抛出多个异常。
public class Demo {
public static void main(String[] args){
DivideByZero(2,0);//调用者不处理该异常就会编译报错
}
//定义一个两个数相除的方法,该方法抛出一个异常
public static int DivideByZero(int a, int b) throws Exception{
return a/b;
}
}
自定义异常:
有时候程序开发中有可能要描述程序中特有的情况,这就需要我们程序员自定义异常了,但自定义异常必须是继承自Exception或子类。实际开发中异常处理类会有状态码,异常信息等。
语法格式:
//throw Exception 异常对象
//thorw关键字用于在方法中声明抛出异常的实例对象
实例:
//自定义异常处理类
public class DivideByZeroMin extends Exception {
public DivideByZeroMin(){
super();//调用Exception的无参构造方法
}
public DivideByZeroMin(String msg){
super(msg);调用Exception的有参构造方法
}
}
//测试类
public class Demo {
public static void main(String[] args){
try {
int i = DivideByZero(4, -2);
} catch (DivideByZeroMin e) {
e.printStackTrace();
}
}
//定义一个两个数相除的方法,该方法抛出一个自定义异常
public static int DivideByZero(int a, int b) throws DivideByZeroMin{
if ( b < 0){
//使用throw关键字声明异常对象
throw new DivideByZeroMin("被除数不能是负数");
}
return a/b;
}
}
运行结果:
加油吧!!!