java--异常

异常

在学习IO流之前要先学习异常,因为IO流无非就是上传文件和下载文件,在这过程中或许会出现问题,我们要解决这个问题,因此要先学习异常,异常也就是在程序运行时出现的错误,它分为运行异常和编译异常。

编译异常和运行异常的区别
                      编译异常                      运行异常

Java程序必须显示处理,否则程序就会发生错误,无法通过编译

无需显示处理,也可以和编译异常一样处理

异常的继承体系

try...catch的方式处理异常

格式一:
    try	{
			可能出现问题的代码 ;

		}catch(异常名 变量名){

			针对问题的处理 ;

		}finally{

			释放资源;
		}

finally可以省略,如果加上它的话,不管代码是否正确都会执行里面的内容,如下:

	try	{

			可能出现问题的代码 ;

		}catch(异常名1 变量名1){

			针对问题的处理1 ;
		}catch(异常名2 变量名2){

			针对问题的处理2 ;
		}
        .....
注:平级关系的异常谁前谁后无所谓,如果出现了子父关系,父必须在后面

当你需要捕获不同的错误时,catch可以多写几次catch语句,也可以如下(JDK1.7及以上):

    try {
  			可能出现问题的代码 ;

 		}catch(异常名1 | 异常名2 | ....   变量名){

  			对异常的处理方案 ;
  		}
注:多个异常之间只能是平级的关系,不能出现子父类的继承关系

面试题:final,finally和finalize的区别

final:是一个状态修饰符,被它修饰的方法或变量不能被重写,呗它修饰的类不能被继承(也就是不能有子类)

finally:它是用在try...catch语句中,是用来释放资源的,不管程序有没有捕获错误始终要执行这里面的语句

finallize:Object类中的一个方法,用来回收垃圾的

面试题:    如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后
            会执先执行finally,finally是无论有没有异常都会执行的,因此在return前执行

throws的方式处理异常

这种处理异常的方式其实就是把异常抛给调用者去处理,自己不用管,与自定义异常有关,直接在方法声明的大括号前加上throws 错误类型就可以了。

throw的方式处理异常

这种方式处理异常是在方法中处理,当出现错误时就把异常对象抛出

throw和throws的区别
                         throw                         throws
用在方法体内,跟的是异常对象名,只能抛出一个异常对象名,这个异常对象可以是编译异常对象,也可以是运行异常对象,表示抛出异常,由方法体内的语句处理用在方法声明后面,跟的是异常类名,可以跟多个异常类名,用逗号隔开,表示抛出异常,由该方法的调用者来处理, 表示出现异常的一种可能性,并不一定会发生这些异常

自定义异常

在开发过程中会出现各种各样的异常,JKD不可能针对每一种问题都会给出异常与之对应,因此就有了自定义异常,根据我们的需求自己定义异常,需要写一个错误类来继承RuntimeException,再用throw来抛出。

代码演示

自定义异常

//自定义异常需要继承RuntimeException
public class EException extends RuntimeException{
//重写构造函数,这样加载时就可以给出想要的错误提示
    public EException(){
        System.out.println("你取得金额大于你银行卡里的钱!");
    }
}
import java.util.Scanner;
public class Bank1 {
    public static void main(String[] args) {
        int money=100;
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要取的金额:");
        int m=sc.nextInt();

        if((money-m)>=0){
                System.out.println("你所剩的金额为:"+(money-m));
        }else {
            //用throw在方法中抛出错误
                throw new EException();
        }
    }
}

结果

请输入要取的金额:
200
Exception in thread "main" org.ji16.code.EException
	at org.ji16.code.Bank1.main(Bank1.java:13)
你取得金额大于你银行卡里的钱!

try...catch异常

public class File10 {
    public static void main(String[] args){
       //catch中写得是错误的类型,你可以用|分开错误类型,父类必须在最后
        try {
            System.out.println(23 / 0);
        } catch (Exception e) {
            //在输出语句中有也可以写e.getMessage()或e.toString()或e.printStackTrace()
            System.out.println("哦,catch了...............");
            return ;
        }finally {
          //这个语句会在return(结束)语句之前执行,因为无论有没有错误抛出finally语句都会执行
            System.out.println("哦,被执行了..............");
        }
    }
}
//Throwable的几个常见方法
//getMessage() 获取异常信息,返回字符串
//toString() 获取异常类名和异常信息,返回字符串
//printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void

结果 

哦,catch了...............
哦,被执行了..............

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值