一、异常的分类
所有异常都是发生在运行时,因为只有运行阶段才可以new对象,因为异常的发生就是new异常对象。
运行时异常通常:如被 0 除、数组下标越界、空指针等是由编程错误导致的,所以在编写程序时,并不要求必须使用异常处理机制来处理这类异常,经常需要通过增加“逻辑处理来避免这些异常”。
编译时异常处理方式:1.使用“try/catch”捕获异常、2.使用“throws”声明异常,否则无法通过编译。
throws try.....catch...
一般不建议在main方法上使用throws,因为异常真的发生了,就会抛给Jvm,Jvm只有终止
一般在mian方法内就会使用try.....catch...进行捕捉
异常的两个方法
String msg = exception.getMessage();// 获取异常的简单描述
exception.printStackTrace(); //打印异常追踪的堆栈信息
try不能单独使用
try和finally可以联合使用
面试题
代码一定时自上而下执行的
return语句一旦执行,整个方法必须结束
public static int m(){
int i = 100;
try{
return i; //输出结果i=100
}finally{
i++;
}
}
//反编译后的结果
public static int m(){
int i = 100;
int j = i;
i++;
return j;
}
面试题
final finally finalize 的区别
-
《重点》、final修饰的变量? final修饰的局部变量,一旦赋值不能重新赋值。引用也是一个变量
-
《重点》、final修饰的方法? final修饰的方法无法被覆盖,被重写。
-
《重点》、final修饰的类? final修饰的类无法继承。
-
final 是一个关键字,表示最终的 不变的
-
finally也是一个关键字,和try联合使用,使用在异常处理机制中,finally语句块中的代码一定会执行
-
finalize() 是Object类中的一个方法,作为方法名出现。所以finalize是标识符
怎么自定义异常类?
第一步:编写一个类继承Exception 或者RuntimeException
第二步:提供两个构造方法,一个无参的,一个带有String参数的
public class MyException extends Exception{
public Exception(){
};
public Exception(String s){
super(s);
}
}
//别的类出现异常 则new异常对象,方法内再进行throw 方法上进行throws
public void push(Object obj) throws MyException {
if(index >= elements.length-1){
// MyException e = new MyException("出现异常啦");
//throw e ;
throw new MyException("出现异常啦");
}
}
常见的异常
NullPointerException异常 :空指针
当程序访问一个空对象的成员变量或方法,或者访问一个空数组的成员时会发生空指针异常
String str = null;
if(str != null){}
数组下标越界异常
当程序访问一个数组的某个元素时,如果这个元素的索引超出了0~数组长度-1这个范围
public class TestException5 {
public static void main(String[] args) {
int[] arr = new int[5];
System.out.println(arr[5]);
}
}
if(a<arr.length){}
类型转换异常
在引用数据类型转换时,有可能发生类型转换异常
Animal a = new Dog();
Cat c = (Cat) a ;
if(a instanceof Cat){
Cat c = (Cat) a
}