异常概述
异常的顶级父类Throwable
Error (错误):非常严重的问题,通常靠代码无法解决
1.StackOverFlowError 栈溢出错误,只会在递归的时候出现
2.OutOfMerroryError 堆溢出错误
Exception(异常):程序中出现了一般性问题处理后程序可以继续运行
1.ArrayOutOfBoundsException:数组越界异常
2.登陆异常
异常分类
1.编译时异常:在编译期间报错,必须处理
2.运行时异常:在编译时不会报错,运行时会报错。所有RuntimeException和它的子类都是运行时异常
RuntimeException没有要求必须写throws,因为它属于非检测异常,运行时异常会随时发生所以就不受编译器检查的限制
throw和throws的区别
throw是在代码块内的。是在捕获方法内的异常并抛出时用的。可以自己定义。在一个方法内只有throw没有在方法上声名throws是没有意义的。因为这里的throw只是让你自己看见
throws是针对方法的,将方法的异常抛出去。调用带throws的方法必须要处理异常,有两种方法
当我们调用一个含有throws声名异常抛出的方法时,编译器要求我们必须处理该异常
处理方式分为两种:
1.使用try-catch主动捕获并处理该异常
2.在这句代码所在的方法上继续使用throws对外声名抛出给上层调用者
永远不要在main方法上声名throws ,因为main方法作为最后的方法再抛异常就相当于抛给虚拟机,虚拟机不会处理这个异常就杀死了这个程序,将异常抛给用户
异常对方法的重写和重载的影响
异常不影响重载
重载是1.方法名相同,作用域相同2.括号内参数的数量、类型、顺序不同。重载发生在一个类中
运行时异常对于重写没有影响,重写是在父子类中,重写的方法名、参数列表、返回值类型都相同
子类重写的方法抛出的编译时异常的作用域不能超过父类对应方法的编译时异常
finally
finally可以跟在try语句块之后或者跟在最后一个catch块之后。所以finall后边不能再跟catch块
finally修饰{},只要执行try模块无论是否报错这个{}中的代码无论如何都会执行
int i = 5;
try{
return i++;
}finally{
i++;
System.out.println("i = " + i);
}
先输出i = 7,后输出 5
原因:进行到try中的return时已经确定输出为5,相当于先将return 5 挂起来。但是不能立刻输出因为还有finally没有执行,
注意有些时候返回的是对象的地址,对象的地址会随finally中的改变而改变。
try{}catch(){} : try中的代码被认为不一定执行
try{}finally{}:try中的代码被认为会执行
try(try后面也可以加小括号,可以简化代码)//注意小括号内的内容 可以声明对象的类必须实现了AutoCloseable接口
只有在finally中最后会调用close方法关闭的对象才在小括号内初始化
这样写完之后并不需要关流,系统自动关
一些笔试的问题
1.final ,finally,finalize 的区别
final可以类,方法,以及变量,final修饰的方法一旦被创建不能被子类重写
finally用于在trycatch中执行try后必定会执行finally中的代码
finalize 是Object定义的一个方法,是一个对象生命周期的最后一个方法。java中所有的类都有这个方法。
当GC发现一个对象没有引用时就会释放该对象,释放前会调用该对象的finalize方法
该方法被调用后,对象被销毁
空字符 String str = “”:字符串结束标志‘\0’,为被动添加,ascii码十进制:0
空字符不能调用str.charAt(0) 异常下标越界
return关键字有两个作用 第一个作用是将return的值赋值给一个变量,注意如果还有其它return值则这个变量的值还会变。
第二个作用是结束方法
对象 instanceof 类 :返回一个布尔值,true代表该对象是右边的类或者子类创建的。类的实例包含所有直接或间接的实例
try catch
语法:try{可能出现异常的代码片段}catch(XXXException e){当try中代码出现了XXXException后的解决办法}
这样程序在运行时遇到异常就知道应该如何做,而不是在控制台上抛出错误返回给main方法的调用者,直接结束程序。
为什么需要手写trycatch处理异常而不能在代码中改?有些异常提前知道会发生但是没有办法改,凡是可以通过改代码的方式处理都不应该用trycatch
throw
抛出异常,
子类重写带有异常处理的父类的四种方法
printStackTrace
try{
}catch(Exception e){
e.printStackTrace();//可以输出错误的信息,就是没有用异常前编译器出现的红字
String message = e.getMessage();
sout(message);//获取错误信息,比较短
}
自定义异常 Exception
1.类名要见名知意
2.继承Exception (直接或间接都行)
3.提供超类异常提供的所有构造器 alt+insert 选择constructor