JAVA学习笔记11---------异常

异常: 运行时期发生的不正常情况
java中用类的形式对不正常情况进行了描述和封装对象
用异常类对其进行描述
不同的问题也难怪不同的类进行具体的描述 比如角标越界 空指针等
异常体系--问题有多少 异常就有多少
将这些类的共性向上抽取 形成了异常体系 分成两大类
最终问题(不正常情况)分成了两大类
Throwable 父类: 无论是错误还是异常发生就应该抛出 让调用者知道并处理
    1 一般不可处理的,class Error
    2 可处理的 class Exception

该体系特点就在于Throwable及其所有的子类都具备可抛的性质
如何可抛出 throws throw 凡是可以被这两个关键字所操作的类和对象都具有可抛性

Error是不可处理的 特点是由jvm抛出的严重性问题 这种问题一般直接修改程序 java.lang.OutOfMemoryError:Java heap space
Exception
当遇到问题的时候两步

第一步封装问题成异常对象


第二步 就是将异常抛出到控制台可以让程序员看到

当出现java中没有定义的异常时候
可以考虑自定义问题并封装成自定义异常

如果让一个类称为异常类 必须要继承异常体系 只有继承了异常体系才可以被关键字修饰throws throw
对函数声明 throws 异常  针对异常要么捕捉要么声明抛出
如 if(index<0){
    throw new ArrayIndexOutOfBoundsException("越界啦兄弟" + index);
}

异常分类
1 编译时被检测异常 包括exception和其子类都是 除了特殊子类 RuntimeException
        这种问题一旦出现 希望在编译时就进行检测让这种问题有对应的处理方式


2 编译时不检测异常(运行时异常)
    这种问题的发生 无法让功能继续 运算无法进行 更多是调用者的原因导致的或者
    引发了内部状态的改变导致的,那么这种问题一般不处理 直接编译通过 在运行时 让调用者调用时的程序 强制停止
 runtimeException是那些可能在java虚拟机正常运行期间抛出的异常的超类
 可能在执行方法期间抛出但未被捕获的RunTimeException的任何子类都无需在throws自居中进行声明

 int num = d.method(null,-30);调用的时候 数组都不传 角标还是负 此种情况根本不需要声明 运行是必出错程序直接down掉
 如果你要使用这种异常一定要先预处理 

throw 和throws
1 throws 使用在函数上
    throw使用在函数内
2 throws抛出的是异常类 可以抛出多个 用都好隔开
  throw抛出的是异常对象

一层一层抛出 总需要有人处理
异常处理的捕捉形式:
这是可以对异常进行针对性处理的方式
try:
{
    //需要被检测异常的代码
}
catch(异常类 变量)
{
    //处理异常的代码
}
finally
{
    //一定会执行的代码
}

package cn.exceptionTest;

class FuShuIndexException extends Exception{

    private static final long serialVersionUID = 1L;

    public FuShuIndexException(String x)
    {
        System.out.println(x);
    }
}
class Demo{
    public int method(int[] arr,int index) throws FuShuIndexException
    {
        if(index<0) throw new FuShuIndexException("角标为负数!不可");
        return arr[index];
    }
}
public class ExceptionTest1 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr = new int[3];
        Demo d = new Demo();
        try {
            int num = d.method(arr, -1);
            System.out.println("num:=" + num);
        } catch (FuShuIndexException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("message" + e.getMessage());
            System.out.println("String:"+ e.toString());
            //返回异常的位置 和虚拟机的默认处理机制一直
            //JVM的默认处理机制就是调用异常对象的这个方法
        }
        System.out.println("over");
    }

}

cn.exceptionTest.FuShuIndexException
    at cn.exceptionTest.Demo.method(ExceptionTest1.java:17)
    at cn.exceptionTest.ExceptionTest1.main(ExceptionTest1.java:28)


角标为负数!不可
messagenull
String:cn.exceptionTest.FuShuIndexException
over

当抛出多个异常的时候 可以多个catch
有一个小细节当你为了保险 
catch(Exception e)
{
    

catch(NullPointerException e){
    
}
一个一个顺序去匹配catch所以针对多catch中有子父类异常的话
父类的尽量放在最后
异常处理原则
1 函数内容如果需要抛出需要检测的异常 那么函数上必须要声明
 否则必须在函数内用try catch捕捉 否则编译失败
2 如果调用到了 声明异常的函数 要么trycatch 要么throws 否则编译失败
 
3 何时用catch 何时用throws
    功能内容可以解决用catch
    解决不了 用throws告诉调用者 由调用者解决
4 一个功能如果抛出了多个异常 那么调用时 必须有对应多个catch进行针对性的处理
    那日不有几个需要检测的异常 就抛出几个异常 抛出几个 catch几个

finally百分之99都会执行到
但是catch里面System.exit(0);//退出虚拟机的话则不行

finally作用
如链接数据库的时候
查询的时候Exception 
finally必须执行关闭连接 
try catch finally组合特点
1 trycatch(多个) 当没有必要资源需要释放时 可以不用定义finally
2 try finally 异常无法直接catch处理 但是资源需要关闭 
try开启资源 finally关闭资源

异常注意事项
1 子类在继承父类方法时 父类的方法如果抛出了异常 那么子类的方法只能抛出父类
的异常或者该异常的子类
2 如果父类抛出多个异常 那么子类只能抛出父类异常的子集

简单说 子类覆盖父类只能抛出父类的异常或者子类或者子集
 如果父类的方法没有抛出异常 那么子类覆盖时绝对不能抛 只能trycatch

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值