异常产生的原因以及处理异常的方法

异常

程序运行时,出现不正常的现象,就是异常

异常也是对象:都是由异常类产生的

Java语言的异常的继承体系

  • java.lang.Theowable所有异常和错误的父类
    • java.lang.Error所有错误的父类
    • java.lang.Exception所有异常的父类
      • java.lang.RuntaimeException运行时异常
  • Error错误和Exception异常的区别
    • Error错误:理解人病了,非典艾滋癌症,等死
      • 程序一旦发生错误,根本运行不了,修改源码
    • Exception异常:阑尾炎,感冒,划伤,治好了以后和以前一样
      • 程序一旦发生异常,处理完继续执行

Throwable类的方法

所有异常和错误都是子类,Throwable类的方法,都会被继承使用

  • String toString()返回异常信息的简短描述
  • String getMessage()返回异常信息的详细描述
  • void printStackTract()将你的异常信息追踪到标准错误流,(目前方法可以将异常信息输出到控制台)
	public static void main(String[] args) {
		//异常信息的用法
		try {
			get();
		} catch (ArrayIndexOutOfBoundsException e) {
			//方法toString()异常信息的简单描述
			//System.out.println(e);
			//方法getMessage()异常消息的详细描述
			String meString=e.getMessage();
			System.out.println(meString);
			//printStackTrace()
			e.printStackTrace();
		}
	}
	public static void get() {
		
			int []arr= {1,2,3};
			System.out.println(arr[4]);
		
	}

异常引发过程和jvm默认处理机制

异常信息输出停止运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P92QP30M-1595508902878)(C:\Users\15272\Desktop\笔记\笔记照片\异常处理和jvm处理方式.png)]

异常处理方式try catch

try{}catch(){}异常处理

语法格式

try{
//被监测的代码,或者是可能出现异常的代码
}catch(异常类的名字  变量){
//异常处理
//变量,循环,new对象,调用方法
}
public static void main(String[] args) {
		// TODO Auto-generated method stub
int[] arr= {1,2,3};
try {
int i=getArray(arr);
System.out.println(i);}catch (Exception e) {
	System.out.println("异常被处理了");
}
System.out.println("程序结束");
	}
	
	public static int getArray(int[] arr) {
		return arr[5];
	}

try{}catch(){}异常处理,多catch并行处理

语法格式

try{
//被监测的代码,或者是可能出现异常的代码
}catch(异常类的名字  变量){
//异常处理
//变量,循环,new对象,调用方法
}catch(异常类的名字  变量){
//异常处理方式

}

	public static void main(String[] args) {
		//多catch并行处理
		try {
			get(10);
		} catch (NullPointerException ex) {
			System.out.println("空指针异常");
		}catch (ArrayIndexOutOfBoundsException ar) {
			System.out.println("数组越界异常");
		}
	}
	/*
	 * 定义方法传递参数i
	 * 蚕食变量i是0方法出现控制住异常
	 * 参数i的值是非0,方法出现数组异常
	 */
	
	public static void get(int i) {
		if (i==0) {
			int[]arr=null;
			System.out.println(arr[0]);
		}if (i!=0) {
			int []arr= {1,2,3};
			System.out.println(arr[4]);
		}
	}

}

  • tryf catch()0异常的处理,多catch合并为一个catch

    try {
    			get(10);
    		} catch (NullPointerException |ArrayIndexOutOfBoundsException e) {
    			System.out.println("异常被处理");
    		}
    	}
    

finally代码块

跟随try catch出现的,凡是写在finally代码块里的程序,必须抛异常

作用 释放资源

	public static void main(String[] args) {
		//异常信息的用法
		try {
			get();
		} catch (ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();
		}finally {
			System.out.println("无论如何都运行");
		}
	}
	public static void get() {
		
			int []arr= {1,2,3};
			System.out.println(arr[4]);
		
	}

}

throw和throws

  • throw抛出的意思,只能作用在方法里,表示方法中会出现异常
  • throws抛出的意思,只能作用在方法定义上
	/*
	 * 方法演示
	 * 方法定义,传递参数(钱),方法的作用是买饭
	 * 方法的参数有问题,功能不能实现
	 * 将方法内部异常表现出来,告诉调用者
	 * 关键字throws,后面写的是异常类名
	 */
	
	public static void get(int money) throws Exception{
		if (money<=0) {
			//抛出异常throw关键字,抛出的是异常对象
			throw new Exception();
		}
	

}

异常分类

  • 编译异常
    • 当我们调用一个抛出异常方法时,调用者必须处理,要是不处理就会编译失败
    • 处理方式try catch 也可以使用throws
  • 运行异常
    • 方式RuntimeException类,和其他的所有子类,全都是运行异常
    • 方法中如果抛出的异常是运行异常,方法声明上不需要使用throws关键字
    • 方法调用者,看不到方法中的异常
    • 调用者调用方法,不需要处理这个异常
    • 运行时期的异常,不能处理,一旦发生,程序人员必须修改源码
    • RuntimeExcrption子类:
      • 数组越界
      • 空指针异常
      • 类型转换异常(ClsaaCastException)
      • 无效参数异常IllegalArgumentException

子类父类异常处理

  • 父类方法抛出异常
    • 子类继承父类,子类可以不抛出异常
    • 子类继承父类,重写方法后,如果要抛异常,抛出的异常不能大于父类
  • 父类不抛异常
    • 子类继承父类,从写方法后不能抛异常
    • 如果子类调用一个需要抛出异常的方法,子类只能是try catch

自定义异常

jdk中不可能将开发中所有的异常现象,完全定义完毕,如果遇到jdk中没有定义的异常类,需要我们自己去定义异常

例子∶计算三个科目的平均分,数序,语文,英语.调用者调用方法,错误传递参数成绩平均分无法计算的.JDK
中不可能提供成绩异常

自定义异常,创建类,继承父类,(Exception或者RuntimeExcrption),选择继承那种异常,判断程序中出现了自定义异常,是否让程序继续执行,还是直接挂掉修改原码

//自定义异常
public class ScoreException  extends RuntimeException{
public  ScoreException(String s) {
	super(s);
}
}
_____________________________________________________________________________________
	public static void main(String[] args) {
      int i=avg(-10, 10,20);
	}
	public static int  avg(int math,int c,int e) {
		if (math>100||math<0) {
			throw new ScoreException("数学成绩错误"+math);
		}
		if (c>100|c<0) {
			throw new ScoreException("语文成绩错误"+c);
		}
		if (e>100||e<0) {
			throw new ScoreException("英语成绩错误"+e);
		}
		return (math+c+e)/3;
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值