异常 异常就是程序出现了不正常的情况 Java中的异常体系: Throwable Java中所有的异常和错误的父类 / \ Exception Error / \ RuntimeException Exception Throwable Java中所有的异常和错误的父类 |- Exception Java中所有异常的父类,也就是异常类,他表示程序本身可以处理的问题 |-RuntimeException 运行时异常,程序代码不会报错,但是运行后会报错。 |-除了RuntimeException类及其子类以外的其他异常,就是程序代码会直接报错,我们必须处理这些异常。 |-Error Java中所有错误的父类,也就是错误类,他表示不是程序的问题,而是系统的问题。 如果Java中出现Error错误,那么大部分时间都不是代码的问题,而是系统或内存的问题。 Java中的异常分为两大类: 编译期异常:都是Exception类的子类,必须要我们进行处理,否则程序会发生错误,无法通过编译。 运行时异常:都是RuntimeException类的子类,不需要我们处理,也可以和编译期异常一样进行处理。 Java文件----编译期--》运行期 Java程序想要执行,需要几步? 1、Java源代码文件--->编译(javac.exe)--->Java字节码文件 Java字节码文件--->解释(java.exe)--->机器码(二进制数据)并且执行 我们之前遇到了异常,不做任何处理,都是交给Java虚拟机(JVM)进行处理。 默认的处理:把异常名称,错误原因,异常出现的位置等信息输出到控制台。并且停止程序继续运行。 我们要进行的异常处理方案: 两种方案: |-1、我们也不处理了,只是把异常告诉虚拟机,这段代码可能出现异常了(声明异常) throws |-2、我们进行处理,就比较麻烦了: 1、我需要先检测可能出现异常的代码块。 try 2、判断可能出现什么异常并且给出解决方案 catch 3、无论怎么解决,有些代码必须要执行。 finally 无论是否处理都会用到的,抛出异常对象 throw 我们可能会自定义一些符合我们业务的异常。 建一个类,名称后面为Exception,为了区分该类为异常类。 让该类继承Exception类或RuntimeException类。 万事万物皆为对象 throws 用在方法的后面,throws 后面的跟着的是异常类名。表示该方法里面的代码可能会引发某个异常: public void method() throws AgeException{ //这个方法里面的代码可能引发AgeException异常。 } 如果哪个方法调用了这个方法,那么就需要进行处理AgeException异常,否则也要使用throws继续声明。 throw 用在方法体里面,后面跟着的是异常的对象名。表示手动抛出异常对象,需要方法体内部进行处理或者throws声明。 我们自己处理异常: 格式: try{ //是可能出现异常的代码 }catch(异常类型 变量名){ //处理方案 }finally{ //一定会被执行的代码 } 案例: 商品类里面包含3个属性:商品名称、商品价格、商品库存 模拟实现用户购买商品的功能,使用ArrayList模拟商品列表, 当购买的商品不存在或者商品库存为0时,抛出自定义异常。 用户购买某一个商品时,对异常进行处理,并对库存进行改变。 步骤: 1、创建商品类 2、创建自定义的异常类: NotProductException 没有这个商品异常 InventoryException 商品库存不足异常 3、创建Main类 创建一个购买的方法 public void shopping(Product p){ }