IO流的概念
IO流用来处理设备之间的数据传输
上传文件和下载文件
IO流的前奏
说起IO流我们就要首先学习File类,因为File是表示IO流将来要操作的文件,而常见的操作文件无非就是上传文件和下载文件,在这个过程中可能会出现问题,我们就需要对他进行处理,所以再刚开始我们先学异常
异常的概述和分类
异常就是Java程序在运行过程中出现的错误
异常的继承体系:
异常的基类:Throwable
严重问题:Error 一般都是很严重的问题,不予处理。
非严重问题:Exception
编译时异常:非RuntimeExcption
运行时异常:RuntimeExcption
JVM默认是如何处理异常的
main函数收到这个问题,有两种处理方式:
第一种就是,将该问题处理,继续运行
第二种就是,自己没有对应的处理办法,只有把他交给main和jvm处理
jvm有个异常处理机制,就将该异常处理进行。
并将该异常的名称,异常的信息,异常出现的位置打印在控制台上,同事将程序停止运行,也就是报错
异常处理,try…catch
异常处理的两种方式
第一种是try…catch…finall
第二种是throw
基本格式
try{
可能出现问题的代码;
}catch(异常名,变量名){
针对问题的处理;}
finally{
释放资源;}
注意 : try中的代码越少越好
catch中必须要做处理,不能隐藏异常信息
public static void main(String[] args) {
final Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个整数");
final int num1 = sc.nextInt();
System.out.println("请输入第二个整数");
final int num2 = sc.nextInt();
try {
int num3 = num1/num2;
System.out.println(num3);
}catch (ArithmeticException e){//ArithmeticException是除数为0异常
e.printStackTrace();//打印异常的堆栈信息
System.out.println("除数为0了,计算错误");
}finally { //必须要执行清空内存,释放资源
if(scanner!=null){
scanner.close();}
}
}
在这个代码中,你输入的除数入过是个0的话,不会报错,输出的是除数为0,计算错误。
在JVM没有停止的时候,Finally中的内容一定会执行
finally用来释放资源,在IO流操作和数据库操作中会见到
try…catch的方式处理异常(2)
try{
可能出现的问题代码;
}catch(异常名1 变量名1){
对异常的处理方式;
}catch(异常名2 变量名2){
对异常的处理方式;
}....
注意事项:
1:能明确的尽量明确,不要用大的来处理。
2:平级关系的异常谁前谁后无所谓,如果出现了子父关系,父必须在后面
JDK1.7针对多个异常的处理
try {
可能出现问题的代码 ;
}catch(异常名1 | 异常名2 | .... 变量名){
对异常的处理方案 ;
}
优点:简化代码
缺点:对多个异常处理方法一致,
注意:
多个异常之间只能是平级关系,不能出现子父类的继承关系
编译期异常和运行期异常的区别
所有的RuntimeException类以及其子类的实例被成为运行时异常,其他的异常就是编译时异常
编译时异常:Java程序必须显示结果,否则就会发生错误,无法通过编译
运行时异常:无需显示处理,也可以和编译时异常一起处理
Throwable的几个常见的方法
getMessage(): 获取异常信息,返回字符串。
toString():获取异常类名和异常信息,返回字符串
printStackTrace() 获取异常类名和异常信息,以及异常出现在程序的位置,返回值void
throws方式处理异常
定义功能方法时,需要把出现的问题暴漏出来让调用者去处理。
那么就通过throws在方法上标识
throw和throws的区别
throw的概述:在功能方法内部出现某种请款,程序不能继续运行,需要进行跳转时,就用throw把对象抛出
区别:
throws
用在方法声明后,跟的是异常对象名
可以跟多个异常类名,用逗号隔开
表示抛出异常,用该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
这个异常对象可以是编译期异常对象,可以是运行期异常对象
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
在这里的时候出现了异常,我们做的就是把他抛出去,因为这个异常不一定存在,所以我们就用throws
这样就OK了。
这个是在方法内部进行的抛出一个对象
接下来我们自定义一个异常,因为在有些时候。我们的需要用一些Java中没有给定的异常来约定一些范围,所以我们就可以自定义一个异常来达到我们想要达到的目的
异常的注意事项:
子类重写了父类方法的时候,子类的方法必须抛出相同的异常或父类异常的子类,
或者子类不抛出异常。
如果父类抛出多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,
子类不能抛出父类没有的异常,或者子类不抛出异常
如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常那么子类只能try不能用throws
如何使用异常处理
原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,就是用throws
区别:
后续程序需要继续运行就try
后续程序不需要继续运行就throws
如果没有JDK对应的异常,则自定义异常