异常类学习笔记

异常类概念

*异常:程序运行过程中 遇到不正常的情况(程序无法正常运行)
*异常体系:由一堆异常类组成
*异常体系的顶层父类:Throwable
*java处理异常原理:把异常情况封装成对象  把对象交给虚拟机/程序进行处理
*
*Throwable:按异常严重情况分类
*Error: 非常严重的异常: 不能通过代码逻辑进行处理的异常情况  一般是内存/虚拟机/语法出现的错误
*       eg: int a::java.lang.Error: Unresolved compilation problem: 
*          test();//java.lang.StackOverflowError
*          new long[1024][1024][1001];//java.lang.OutOfMemoryError: Java heap space 
*      Exception:通过代码逻辑可以处理的异常情况
*            Exception按是否继承RuntimeException分类
*            继承了RuntimeException的异常---运行时异常(UnChecked Exception)
*            没有继承RuntimeException的异常---编译时异常(Checked Exception)
*       eg://
Class cla=Class.forName("Student");//ClassNotFoundException: Student
new SimpleDateFormat("yyyy-MM-dd").parse("111");//ParseException: Unparseable date: "111"
System.out.println(1/0);//ArithmeticException: / by zero
System.out.println(new String(new byte[] {1,2},"gbk1"));//UnsupportedEncodingException: gbk1
String s=null;System.out.println(s.length());//NullPointerException
int[] arr= {};System.out.println(arr[1]);//ArrayIndexOutOfBoundsException
System.out.println((String)(new Object()));//ClassCastException
int n=Integer.parseInt("aa");//NumberFormatException
int n=new Scanner(System.in).nextInt();//InputMismatchException			   System.out.println("11".charAt(3));//StringIndexOutOfBoundsException
System.out.println(new ArrayList<>().get(0));//IndexOutOfBoundsException
* 
*异常体系的特点:
*   特点1Throwable的所有子类都没有特有方法  所有方法都继承于Throwable   
*        异常体系中类之间的区别只在于类名和异常原因
*   特点2:异常体系中子类的名字都是以ErrorException结尾

Error 和 Exception

error和exception的区别 并列出5种以上常见的异常类型(中文+英文)
Error:错误  程序运行出现严重错误  无法通过代码逻辑进行处理
      一般是内存或者虚拟机出现问题
Exception:异常  程序无法正常运行  可以通过代码逻辑进行处理的异常情况
常见的异常:
     StringIndexOutofBoundsException:字符串下标越界异常
     ClassNotFoundException:类找不到异常
     FileNotFoundException:文件找不到异常
     NullPointerException:空指针异常
     NumberFormatException:数字格式异常
     ArithmeticException: 数学运算
     ParseException:字符串解析异常
     EOFException:到达文件末尾异常
     IOException:io流异常
     SQLException:sql语句异常
     RuntimeException:运行时异常

Throwable类

     *   1 构造方法:
     *        Throwable()   :不指定错误原因
     *        Throwable(String message) :参数是错误原因
         2  String toString() : 获取异常类型:异常原因
              java.lang.ArithmeticException: / by zero
         3  String getMessage() :获取异常原因
         4  void printStackTrace()  :调用标准错误输出流
              java.lang.Throwable: 出错了!
	          at com.zhiyou100..Demo03Throwable.main(Demo03Throwable.java:60)      

throw 和 throws的区别

throwthrows的区别
     throw:用于在方法体中 表示程序出现异常情况
	 throws:用于在方法声明上 声明当前方法可能产生那些异常
  不同之处:位置不同:throw用在方法体中  throws用在方法声明上
            后面的内容不同: throw后面跟一个异常对象   throws后面跟多个异常类型
			作用不同:throw:用于在方法体中 表示程序出现异常情况
			          throws:用于在方法声明上 声明当前方法可能产生那些异常,一旦产生此类异常 异常被抛给方法的调用者 

异常处理:抛出机制

     * 异常处理方式之抛出机制:把可能产生的异常封装为对象 抛给方法的调用者
     * 格式:在方法声明上添加一个throws 异常类型1,异常类型2...
     * 
     * 注意1:如果程序一直选择通过抛出机制来处理异常:异常最终抛给虚拟机
     *      虚拟机统一处理方式:打印异常输出流 然后终止程序
     * 注意2:如果方法的某段代码出现异常 而选择抛出机制来处理异常 那么当前方法的其他代码不再执行     
     * 注意3:子类重写父类的方法:子类方法不能抛出比父类方法多的大的异常
     * 
     * 方法声明加throws xxxException的作用:
     *      1 声明当前方法可能产生那些异常
     *      2 如果产生指定的异常 当前方法不处理 而是把异常对象抛给方法的对应者
     * 
     *  编译时异常和运行时运行
     *  编译时异常:没有继承RuntimeException的异常
     *  运行时异常:继承RuntimeException的异常
     *  区别:1 如果代码可能产生编译时异常  编译器会报错 要求必须对编译时异常进行处理
     *        如果代码可能产生运行时异常  编译器不检查  方法默认抛出可能产生的运行时异常
     *      2 编译时异常只有在指定情况下才会产生 出现的频率低
     *        运行时异常出现的频率比较高
     *      3 编译时异常没有继承RuntimeException   
     *        运行时异常继承了RuntimeException

代码

public static void main(String[] args)throws UnsupportedEncodingException, ParseException {
		System.out.println("main方法开始");
		test1();//调用者必须对 所调用方法抛出的异常进行处理
		System.out.println("main方法结束");
	}
public static void test1() throws UnsupportedEncodingException, ParseException {
		System.out.println("test1方法开始");
		String s=new String(new byte[] {46, 48,49},"gbk1");
		//Unhandled exception type UnsupportedEncodingException
		Date date=new SimpleDateFormat("yyyy-MM-dd").parse("1234-11-12");
		//ParseException
		System.out.println("test1方法结束");
}

异常处理:捕获机制

     * 异常处理方式之捕获机制: 通过代码逻辑对产生的异常进行处理
     * 格式:
     *     try{
     *        可能产生异常的代码块
     *     }catch(定义引用接受产生的异常对象){
     *        异常处理的代码
     *     }finally{
     *        不管是否出现异常 都要执行的代码
     *     }
     * 
     * 捕获机制注意事项:
     *    1try代码块中出现异常  try代码块不再执行 而是执行对应的catch代码块
     *    2 无论是否出现异常 无论catch任何处理异常 都要执行finally代码块(除了System.exit(0))
			一般情况下:finaly代码块 用于关闭流释放资源
		  3 捕获父类异常的catch 必须写在捕获子类成员的catch后面
		  
	         开发过程中遇到异常:尽量捕获 避免抛出  	

代码

public static void main(String[] args){
    test1();//调用者无需对方法中的异常进行处理 因为方法本身已经对可能产生的异常处理掉了
    System.out.println(11);
}
public static void test1() {
    System.out.println("test1方法开始");
    try {
        System.out.println("try代码块开始");
        String s=new String(new byte[] {46, 48,49},"gbk1");
        System.out.println(1);
        Date date=new SimpleDateFormat("yyyy-MM-dd").parse("1234-11-12");
        System.out.println("try代码块结束");
        Class cla=Class.forName("xxx");
    }catch(UnsupportedEncodingException e) {
        System.out.println("catch__1");
        System.out.println("对异常UnsupportedEncodingException进行处理的代码!");
        //System.exit(0);
        //long[][][][] arr=new long[1024][1024][1024][1024];
        return;
    }catch(ParseException e) {
        System.out.println("catch__2");
        System.out.println("对异常ParseException进行处理的代码!");
    }catch(Exception e) {//抛出父类异常的catch必须放在抛出子类异常catch的后面
        System.out.println("catch__3");
        System.out.println("对异常Exception进行处理的代码!");
    }finally {
        //无论是否出现异常 无论catch任何处理异常 都要执行finally代码块(除了System.exit(0))
        //一般情况下:finaly代码块 用于关闭流释放资源
        System.out.println("finally代码块!");
    }
    System.out.println("test1方法结束");
}

自定义异常

public class Demo06MySelfException {
    /*
     *自定义异常:定义一些jre中不存在的异常
     *步骤:
     *   1 继承异常体系中的类 才能称为异常类 
     *   2 提供一个有参数的构造方法  并通过调用super(message)来传递异常原因
     *   3 在方法中通过throw来产生一个自定义异常情况
     *   4 对异常情况进行处理
     * */
	public static void main(String[] args){
		char sex='妖';
		//创建了一个异常对象:不是出现异常情况
		SexNotSupportedException e=new SexNotSupportedException("性别不存在!");
		
		//throw 异常对象;表示程序出现异常情况
		if(sex!='男'&&sex!='女') {
			//4 对产生的异常进行处理
			try {
				throw e;//3 通过throw产生一个自定义类型的异常情况
			} catch (SexNotSupportedException e1) {
				System.out.println("性别:"+sex+"不合理!");
				sex='男';
			}
		}
		System.out.println("sex="+sex);
	}
	//final、finally、finalize
	//throw和throws的区别
	//位置不同:throw用在方法体中  throws用在方法声明上
	//后面跟的内容不同:throw后面跟一个异常对象  
	//              throws后面跟多个异常类型
	//作用不同:throw  用在方法体中表示当前方法运行时产生了一个异常情况
	//        throws 用在方法声明上 表示当前方法可能产生那些异常  如果产生这些异常就抛给方法的调用者去处理 
}
//1 继承异常体系中的类 才能称为异常类 
class SexNotSupportedException extends Throwable {
	//2 通过构造方法的参数列表指定异常原因
	public SexNotSupportedException(String message) {
		//通过调用父类有参数的构造方法来传递异常原因
		super(message);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值