异常
程序运行时,出现不正常的现象,就是异常
异常也是对象:都是由异常类产生的
Java语言的异常的继承体系
java.lang.Theowable
所有异常和错误的父类java.lang.Error
所有错误的父类java.lang.Exception
所有异常的父类java.lang.RuntaimeException
运行时异常
- Error错误和Exception异常的区别
- Error错误:理解人病了,非典艾滋癌症,等死
- 程序一旦发生错误,根本运行不了,修改源码
- Exception异常:阑尾炎,感冒,划伤,治好了以后和以前一样
- 程序一旦发生异常,处理完继续执行
- Error错误:理解人病了,非典艾滋癌症,等死
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;
}