一,Try catch语句处理异常
格式:
Try{带异常的语句}
catch(异常类型)
{输出}
案例1:
说明捕获到异常后,try异常后面的程序不会再输出,直接转catch语句,再运行完整个程序
2,打印异常堆栈轨迹和出错的行号
3,父类异常和子类异常的位置关系
二,Try—catch—finally语句
格式:他们三个的关系就像是丈夫(try),妻子(catch)和小三(finally)。丈夫和妻子可以出现在一起,丈夫和小三可以出现在一起,但是小三和妻子是不能在一起的
###finally具有强权性,无论语句如何,它都是要输出的
Try{错误语句
}catch(错误类型){输出}
finally{输出}
案例:
异常覆盖:
三,手动引发异常:(本来没有异常,却给他抛出个异常)
案例:
作用:当用户输入非法数据时,停止程序运行,并提示用户数据非法
案例:
public class Test1 {
public static void f1(int age){
if(age>0&&age<=140){
System.out.println("我今年"+age+"岁");
}else{
throw new RuntimeException("年龄不合法");
}
}
public static void main(String[] args) {
f1(20);
}
}
运行结果:
年龄合法
年龄不合法:
异常的转移:
每一个方法都默认具有抛出运行时异常(runtimeException)和错误(Error)的潜能
当多个方法调用时,内层方法出现异常,会逐级向外层调用这个方法的方法转移,直到转到main函数,把错误抛给虚拟机,由虚拟机抛出异常
四,检查性异常和运行时异常的区别:
常见的检查性异常
FileNotFoundException:文件找不到异常
ClassNotFoundException:类找不到异常
IOException:数据流异常
运行时异常:一般当你参数传错的时候就用运行时异常,编译可以通过
检查性异常:比如QQ断网的时候,它会先检查自身程序,然后告诉你,程序没错,是你网络的问题。编译不能通过
如果抛出检查性异常:检查性异常需要就地处理,捕获后流程继续,错误的数据继续运行,如果将异常抛出,一直抛到main函数,再到虚拟机,虚拟机容易出错。
五,自定义异常:
系统已经帮我们内置好了很多很多的异常,但是有些异常系统没有定义,如果用系统内置的异常类型,则异常过于笼统,所以我们需要自定义异常
方法:
1,写一个自定义异常类
2,继承runtimeException(运行异常),Error(错误),Exception(异常)中的一个