异常处理

错误:
    1.语法错误:
        有语法问题无法编译       
 
    2.运行时错误:
        可以编译,但执行过程中出错.级别低的就是异常
 
    3.逻辑错误:
        运行的顺序,条件或者计算方法出错.能编译能运行,不报错,但结果出错.
 
Exception异常类型,是错误的子类(Error)
五个关键字处理异常,两种方法(处理和向上抛)
try catch finally throw throws
 
用法1:作为代码块的一个部份,处理异常
    try{
 
    }catch(异常类型 变量){
 
    }finally{       
 
    }
用法2:定义方法时定义异常,并抛出异常
 
    public void fun() throws 异常类型{
 
        if(条件)
            throw new 异常();
 
    }
 
 
=============================================
1.处理异常(捕获异常)
    try,catch,finally用法
 
    try{
        //可以会发生错误的代码
    }catch(异常类型  变量){
        //错误的处理代码       
    }finally{
        //始终要执行的代码
        //一般情况用于释放资源
    }
 
 
 
 
    注意:
        1.try必须跟至少一个catch或finally块,try不能单独存在。
        2.catch块可以有多个,但是异常类型必须不同(先子类后父类)。
        3.所有非RuntimeException类型(及子类)的异常必须处理
 
    异常处理:
    1.强置受检
    2.可以不受检,RuntimeException及子类可以不处理
 
 
    try代码是用于监控代码块,可能会发生异常的代码
    catch代码块处理异常,如果发生异常就执行匹配类型catch块
    finally代码块是无论有没有错误都去执行代码块
 
======================================
1.处理异常(抛出异常)   
    throw和throws的用法
 
    Exception ex = new Exception();//创建一个异常对象
    throw ex;//抛出异常对象
 
    或
 
    throw new Exception();//抛出一个匿名异常对象
 
    使用throw关键字在代码块中抛出异常
    一般用法:
        if(条件)
            throw ...
 
    注意:
        如果抛出异常,可以马上捕获或者向上抛出
 
    示例:声明一个设置年龄的方法,并向上抛出异常
    public void setAge(int age) throws RuntimeException{
        //参数不为负数
        if(age<0)
            throw new RuntimeException("年龄不能为负数");
 
        this.age = age;
    }
    或者
    //如果抛出异常,可以马上捕获,不建议使用
    public void setAge(int age){
        //参数不为负数
        try{
            if(age<0)
                throw new RuntimeException("年龄不能为负数");
        }catch(RuntimeException e){
            //处理异常的代码;
        }
        this.age = age;
    }
 
 
 
 
 
 
 
============自定义异常===================
//自定义异常,必须继承Exception类(子类),名称为区别于普通类,一般定义为Exception结尾
class XxxxException extends Exception{
    public XxxxException(){}
    public XxxxException(String message){super(message)};
}
 
 
 
 
示例:设置不能为负数的年龄异常
class AgeException extends Exception{
    public AgeException(){
        super("年龄不能为负数!");
    }
    public AgeException(String message){
        super(message);
    }
}
使用异常
class Student{
    private String name;
    private int age;
 
    public void setName(String name){
        this.name = name;
    }
    public String getName(String name){
        return name;
    }
    //定义设置年龄,可能出现异常
    public void setAge(int age)
        throws AgeException{
        if(age<0)
            throw new AgeException();//throw抛出一个错误对象
        this.age = age;
    }
    public int getAge(){
        return age;
    }
 
    public String toString(){
        return "姓名:"+name+"年龄:"+age;
    }
}
 
public class Test{
    public static void main(String args[]){
        Student s1 = new Student();
        s1.setName("张三");
        try{
        s1.setAge(18);//可能发生错误
        }catch(AgeException e){
            System.out.println("年龄出错:"+e.getMessage());
        }
 
        System.out.println(s1);
    }
}
 
    Throwable:Throwable 类是 Java 语言中所有错误或异常的超类。
    Error:
        Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。
    Exception:
        Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
            有很多的子类,常见子类
            RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。
 
            IOException 输入输出异常
 
 
 

1.异常类型
    Exception异常根类
        常见子类
            受检类型(Checked)
                IOException:输入输出异常
                SQLException:sql异常
                ClassNotFoundException:找不类
                ...
            不受检类型(unchecked)
                RuntimeException
                    NullPointerException:引用的对象是null
                    IndexOutOfBoundsException:下标越界
                        ArrayIndexOutOfBoundsException
                        StringIndexOutOfBoundsException
                    ClassCastException:类型转换出错
                    ...
 
2.捕获异常
    try{
        //代码块
    }catch(异常类型  ex){
        异常处理
    }
 
    //JDK1.7+,可以同时匹配多个异常类型
    try{
        //代码块
    }catch(异常类型1|异常类型2|...  ex){
        异常处理
    }
 
    try{
        //代码块
    }catch(异常类型1 ex){
        异常处理
    }catch(异常类型2 ex){
        异常处理
    }catch...
 
 
    try{
        //代码块
    }finally{
        始终要执行的代码块(释放资源)
    }
 
    //JDK1.7+,可以自动释放资源
    try(资源){
        //代码块
    }catch(异常类型  ex){
        异常处理
    }
 
 
    try{
        //代码块
    }catch(异常类型  ex){
        异常处理
    }finally{
        始终要执行的代码块
    }
 
 
3.抛出异常
    在声明方法时,声明异常同时在代码块中抛出异常
    public void fun() throws 异常类型1,异常类型2,...{
        if(条件)
            throw new XxxException1();
 
        try{
            ...
        }catch(XxxException2 ex){
            throw ex;
        }
    }   
 
 
4.自定义异常类型
    1.必须继承Exception或Exception的子类
    2.名称建议以Exception结尾,标注是一个异常类型
 
    public X1Exception extends Exception{
        public X1Exception(){super("默认的错误提示信息!");}
        public X1Exception(String msg){super(msg);}
    }   
 
    public X2Exception extends RuntimeException{
        public X1Exception(){super("默认的错误提示信息!");}
        public X1Exception(String msg){super(msg);}
    }
 
void fun1(){   
    1....
    try{
        2...
        3...
        4...
    }catch(IOException e){
        5...
    }catch(RuntimeException e){
        6...
    }finally{
        7...
    }
    8...
}
如果没有执行时没有异常,执行顺序:
    123478   
 
如果执行时2行发现IO异常,执行顺序:
    12578
 
如果执行时3行发现NullPointer异常    ,执行顺序:
    123678
 
如果执行时4行发现ClassNotFound异常,执行顺序:(题有问题,ClassNotFoundException必须处理)
    12347
 
 
 
 

 
 
1    ...
2    try{
3        ...
4        ...
5        ...
6        ...
7    }catch(异常类型1  变量){
8        错误的处理代码       
9    }catch(异常类型2  变量){
10        错误的处理代码       
11    }finally{
12        始终要执行的代码
13    }
14    ...
 
如果代码没有任何异常,执行顺序
    1->3->4->5->6->12->14
如果代码4发生"异常类型1"异常,执行顺序
    1->3->8->12->14
如果代码6发生"异常类型2"异常,执行顺序
    1->3->4->5->10->12->14
如果代码5发生异常与“异常类型1和类型2”都不匹配,执行顺序
    1->3->4->12
 
 
 
 
throw
 
 
 
 

 
 
原文地址:https://www.cnblogs.com/zachary7/p/8191512.html