异常
try...catch...catch...
说明:在try中的代码可能会出现不同的异常,就需要不同的异常类型进行匹配
格式:
try{
又可能出现异常的代码;
}catch(异常类型1 异常名称){
对第一种异常做出的处理;
}catch(异常类型2 异常名称){
对第二种异常做出的处理;
}。。。
执行流程:
1、首先执行try中代码;
2、如果try种代码出现错误去匹配相应的异常
3、匹配到了异常的类型就执行对应catch中的处理
4、如果try中没有异常就正常执行
5、处理完毕异常之后就相当于异常没有发生,正常执行其他代码
注意事项:1、表示范围大的异常应该放在下面;2、如果两个或者多个异常有相同的处理方法,就可以使用逻辑运算符
try...catch...finally
格式:
try{
有可能出现异常的代码;
}catch(异常的类型 异常的名称){
对异常的处理;
}finally{
一定会执行的代码;
}
finally:最终的,最后的
finally一定会执行的情况:
1、try中没有异常,finally会执行
2、try中有异常并且被匹配的,finally会执行
3、try中有异常没有匹配到,finally会执行
finally后的代码一定会被执行
原因就是有些比较重要的代码、处理珍惜资源(关闭资源,归还等等), 需要我们一定要执行,就需要写在其中
try...finally
格式:
try{
可能出现异常的代码;
}finally{
一定会执行的代码;
}
格式说明:
1、格式中没有对异常处理的代码;2、当try中没有发生异常就执行完毕在去执行finally中的代码;3、当try种出现了异常,异常抛出也会去执行finally中的代码
运行时异常和编译时异常的关系:
相同点:
1、都是系统中意外发生的情况,都是异常
2、在体系上都属于Exception;
3、两种形式的异常都只会在运行时阶段发生,才会能获取到异常对象
4、编译阶段只有编译通过和不通过
不同点:
运行时异常:就是在编译阶段不需要做出处理的异常。异常也不会再编译阶段发生,或者说编译器就看不到运行时异常。面对运行时异常:通常可以采取一些规避的措施(判断)可以使用异常的处理机制,要么对这个可能出现运行时代码做出捕获。可以做出自己的处理,要么可以对异常进行声明。总结:不管处理还是不处理运行时异常都可以
编译时异常:就是在编译阶段需要处理的异常。面对编译时异常可以对异常进行捕获处理,也可以对异常进行声明,但是必须要对编译时异常做出反应。就是将问题的处理者转移。
体系上的差别:
运行时异常在体系上属于RuntimeException 以及它的子类
编译时异常在体系上属于Exception 以及它的子类,除了RuntimeException
异常体系的常用功能:
说明:异常体系中的功能在throwable中,常用的方法他都有
异常的子类中基本上没有特有的方法
提出问题:既然子类中没有特有的功能那么为什么要有这么复杂的异常体系
构造方法:
throwable() 创建一个空参的异常对象
throwable(String message)创建一个带有信息的异常对象
Throwable(throwable cause)创建一个带有子类异常的对象
throwable(String message throwable casuse) 创建一个带有消息和子类异常的对象
常用方法:
getMessage() 返回异常的详细信息
printStackTrace()返回异常错误的调用轨迹,Stack:栈,Trace:轨迹
方法的好处:将复杂的异常调用轨迹给封装到一条线上,清晰的看到异常的调用过程和轨迹
getCause()返回异常的子类
toString()返回一个简短的异常信息
throw:
抛出:抛出异常,异常已经发生
说明:异常是一种情况,出现了异常情况就可以对这种情况进行抛出的处理,那我们抛出的就是异常对象。
作用:实现程序的跳转和结束。
注意事项:1、抛出的异常给了调用者;2、如果抛出的异常是一个编译时异常,那么调用者就一定要处理异常的手段来对异常做出反应;3、如果抛出的异常是运行时异常,就没有必要在编译阶段做出处理,编译器也会通过
throws
抛出
说明:
1、就是用于异常的抛出;2、当throws再去使用的时候并不表示异常就一定会发生;3、throws表示的是异常的声明,编译时异常在抛出给调用者时,就需要调用者做出处理。这时候我们不希望或者不想在调用者作出处理我们就可以去将异常声明
格式:
修饰符 返回值类型 方法名 (参数列表)throws 异常类型1、异常类型2{
方法体;
}
意义:1、就是在方法中进行异常的声明,通知调用者方法中可能出现异常;2、我们在处理编译时异常,可以直接对异常进行声明,不需要
注意事项:
1、可以声明一个或者多个异常;2、异常的声明的范围不要太大;3、异常声明的数量也不要太多
throw和throws的关系
相关点:
1、都是用于抛出异常;
不同点:
1、throw在使用时异常已经发生、throws在使用时只是声明异常,异常有可能发生也可能不发生;
2、throw抛出的是具体异常的对象,throws声明的是异常的类型
3、书写的位置也不同,throw写在方法中,throws在方法的声明上
自定义异常
两个问题的解释:
1、异常的父类已经把常用的功能给涵盖了,子类中几乎没有特有的功能,为什么要定义那么多子类?
异常可能出现的情况非常的多,异常的名称不同也就代表发生的情况的不同。一个类型就表示一种异常。用类型区分异常之后可以进行不同异常的捕获,就可以针对不同的异常做出不同的处理
2、为什么要有自定义异常?异常类
在现实生活中往往出现的情况都是jdk考虑不到的,比如:年龄小于5岁,大于60岁就属于异常情况。这是就需要针对每种情况来自己定义异常
如何定义异常:
1、类名 结尾都使用Exception 例如:XXXException
2、自定义异常需要去继承父类
如果时编译时异常就继承 Exception
运行时异常就继承RuntimeException
file
java中的文件
1、文件指的是文件系统;
2、文件系统中包含了文件夹和文件
3、通过文件的路径来获取到文件对象,操作这个文件对象
4、API中的file的名称 抽象的文件路径
路径:就是表示文件在磁盘上的位置
路径的分类:
1、绝对路径:在操作系统中表示加上根目录的路径。
windows上的根目录就是盘符
Linux/
2、相对路径:
dos:相对于当前进入的路径
java:表示当前工程的根目录
前端:根据当前页面所在的位置
file的构造方法
file(String path)创建一个文件对象指定文件或者文件夹名称
file(String parent String child)指定一个字符串类型的父级路径和一个子路径来创建一个文件对象
file(File f String child)指定一个文件对象的路径,和一个子路径来创建
创建文件功能
方法:
1、createNewFile() 创建一个新的文件,注意:针对的是一个文件
2、mkdir() 创建一个文件夹,如果父目录不存在就无法创建
3、mkdirs() 创建一个文件夹,如果父目录不存在,就把父目录一起创建
删除功能
delete()删除文件或者文件夹
1、删除文件,可以直接删除
2、在删除文件夹时要一层一层删除如果时空目录可直接删除,如果有子目录不可删除非空目录
策略:
1、递归调用
2、数据结构 一直将我们的目录压栈,删除栈头的目录就可以清除
3、工具类(常用)
判断功能
1、isAbsolute() 判断是否是绝对路径
2、isDirectory() 判断是否是一个文件夹
3、isFile() 判断是否是一个文件
4、isHidden() 判断是否是一个隐藏文件
5、exists() 测试文件或者文件夹是否存在
重命名和剪切
renameTo(File f)
注意调用者是file对象参数也是file对象
重命名:不改变目录的情况下,是对文件的重命名
改变目录,是对文件的剪切
获取功能
getAbsolute()返回当前文件或文件夹的绝对路径
getName()返回当前路径的简短名称
getParent() 返回当前路径的父级路径
getPath() 以字符串形式返回当前构造方法中的路径
getFreeSpace() 返回磁盘的可用空间
getTotalSpace() 返回当前磁盘的大小
getUsableSpace() 返回jvm可用的大小
Length() 返回当前文件大小
LastModified() 返回最后一次修改文件的时间 毫秒值
list() 返回文件对象的名称,封装在字符串数组中
ListFiles() 返回一组文件对象,装在文件数组中