异常
A:异常处理的两种方法
a:try catch finally
try catch
try catch finally
try finally
B:try catch处理异常的基本格式
try catch finally
C:案例演示
try catch 的方式处理1个异常
try:用来检测异常的
catch:用来捕获异常的
finally:释放资源
世界上最真情的相依就是你在try我在catch,无论你发什么脾气,我的静静接受,默默处理
当通过trycatch将问题处理了,程序会继续执行
A:案例演示
try catch的方式处理多个异常
JDK7以后处理多个异常的方式及注意事项
安卓,客户端开发,如何处理异常?try{}catch(Exception){}
ee,服务端开发,一般底层开发,从底层向上抛
try后面如果放多个catch,那么小的异常放前面,大的放后面,根据多态的原理,
如果大的放前面,就会将所有的子类对象接收后面的catch就没有意义了
A:编译期异常和运行期异常的区别
Java中的异常分为两大类:编译时异常和运行时异常
所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常
编译时异常
java程序必须显示处理,否则程序就会发生错误,就无法通过编程
运行时异常
无需显示错误,也可以和编译时异常一样处理
编译时异常也叫做未雨绸缪异常
在某些事的时候要做某些准备
编译时异常:在编译某个程序的时候,可能会有这样那样的事情发生,比如文件找不到,必须在编译的时候处理
如果不处理编译不通过
运行时异常:就是程序员所犯的错误,需要回来修改代码
Throwable的几个常见方法
a:getMessage()
获取异常信息,返回字符串
b:toString()
获取异常类名和异常信息,返回字符串
c:printStackTrace()
获取异常类名和异常信息,以及异常出现在程序中的位置,返回void
A:throw的方式处理异常
定义功能方法时,需要把出现的问题暴露出来让调用者去处理
那么就通过throws在方法上标识
B:案例演示
单例分别演示编译时异常和运行时异常的抛出
编译时异常的抛出必须对其进行处理
运行时异常的抛出可以处理也可以不处理
Throws用在方法后面,跟的是异常类名
可以跟多个类名,有“,”隔开
表示抛出异常,由该方法体的调用者来处理
Throw 用在方法体内,更的是异常对象名
只能抛出一个异常对象名
表示 抛出异常,由方法体内的语句处理
A:finally的特点
被finally控制的语句体一定会执行
特殊情况:在执行到finally之前jvm退出了(比如system.exit(0))
B:finally的利用
用于释放资源,在IO流操作和数据库操作中会见到
C:案例演示
finally关键字的特点及作用
return语句相当于是方法的最后一口气,难么在他将死之前会看看有没有finally帮其完成遗愿,如果有就将
finally执行后彻底返回
System.exit(0);//退出jvm虚拟机
题1.
final,finally和finalize的区别
final可以修饰类,不能被继承
修饰方法,不能重写
修饰变量,只能赋值一次
finally是try语句中的一个语句体,不能单独使用,用来释放资源
finalize是一个方法,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
题2
如果catch里面有return语句,请问finally代码还会执行吗?如果会,请问在return前还是return后。
会
为什么需要自定义异常
通过名字区分到底是什么异常,有针对的解决方法
举例:人的年龄
自定义异常概述
继承Exception
继承RuntimeException
案例演示
自定义异常的基本使用
A:异堂注意事项
a:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了儿子不能比父亲更坏)
b:如果父类抛出了多个异常子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出,类没有的
c:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
B:如何使用异常处理
原则:如果该功能内部可以将问题处理用try,如果处理不了,交由调用者处理,这是用throws
区别:
后续程序需要继续运行就try
后续程席不需要继续运行就throws
如果JDK没有提供对应的异常,需要自定义异常
类 File
File 更应该叫一个路径
文件路径或者文件夹路径
构造方法摘要 |
---|
File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 |
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 |
File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 |
boolean | createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。 |
---|---|
boolean | mkdir() 创建此抽象路径名指定的目录。 |
boolean | mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 |
boolean | renameTo(File dest) 重新命名此抽象路径名表示的文件。 |
boolean | delete() 删除此抽象路径名表示的文件或目录。 |
重命名·注意事项
如果路径相同,就改名
如果路径不同,就改名并剪切
删除
如果删除有个文件夹,那个文件夹必须是空的
boolean | isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 |
---|---|
boolean | isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。 |
boolean | exists() 测试此抽象路径名表示的文件或目录是否存在。 |
boolean | canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 |
boolean | canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 |
boolean | isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。 |
获取
String | getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。 |
---|---|
String | getPath() 将此抽象路径名转换为一个路径名字符串。 |
String | getName() 返回由此抽象路径名表示的文件或目录的名称 |
long | length() 返回由此抽象路径名表示的 。 |
long | lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。 |
String[] | list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 |
File[] | listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 |
getAbsolutePath() //获取绝对路径
getPath()); //获取构造方法中传入路径
getName()); //获取文件或文件夹的名字
lastModified()); //文件最后的修改时间
list(); //仅获取文件名
listFiles(); //获取文件对象
IO流
1概令
I0流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的类都在I0包中
流按流向分为两种·输入流,输出流
流按操作类型分为两种:
字节流 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
字符流 字符流只能操作纯字符数据,比较方便
.I0流常用父类
字节流的抽象父类:
I nputStream
OutputStream
字符流的抽象父类:
Reader
Writer
*3.I0程序书写
使用前,导入I0包中的类
使用时,进行I0异常处理
使用后,释放资源
read()方法读取的是一个字节,为什么返回是int,而不是byte
因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到1111111那么1这111111是byte类型的- 1,我们的程序是遇到- 1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果111111会在其前面补上24个0凑足4个字节,那么byte类型的1就变成int类型的255了这样可以保证整个数据读完,而结束标记的1就是int类型
FileOutputStream在创建对象的时候是如果没有这个文件会帮我创建出来如果有这个文件就先将文件
清空
字节数拷贝——availabie()方法
A:案例演示
int read(byte[] b):一次读取数姐
- write(byte[] b):一次写出一个字数组
- available():获取的文件所有的字节个数
*弊端:有可能会内存溢出
Io流的小数组的标准格式
byte[] arr=new byte[1024*8];
一般是1024的整数倍
##20.11 I0流(BufferedInputStream和Buffer0utputStream拷贝
A:缓冲思想
字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多
这是加入了数组这样的缓冲区效果,java本身在设计的时候
也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流
B.BufferedInputStream
BufferedInputStream内置了一个缓冲区(数组)
从BufferedInputStream中读取一个字节时
BufferedInoutStream会一次性从文件中读取8192个,存在缓冲区中,返回给程序一个
程序再次读取时,就不用找文件了,直接从缓冲区中获取
直到缓冲区中所有的都被使用过,才重新从文件中读取8192个
C.BufferedOutputstream
BufferedoutputStream也内置了一个缓冲区(数组)
程序向流中写出字节时,不会直接写到文件,先写到缓冲区中
直到缓冲区写满,BufferedOutputstream才会把缓冲区中的数据一次性写到文件里
小数组的读取和带Bufferd的那个快
Close方法和flush方法的区别
close方法
具备刷新的功能,在关闭流之前,就会刷新一次缓冲区,缓冲区的字节全部都刷新到文件上,再关闭,clois方法刷新完之后就不能写了
flush方法
具备刷新的功能,刷新完之后可以继续写
字节流读取中文的问题
字节流在读中文的时候有可能会读到半个中文,造成乱码
字节流写出中文的问题
字节流直接操作的字节,所以写出中文必须将字符串转换成字节数组
写出回车换行write ("\r\n" .getBytes());
Try(){} 1.7版本的
在try()中创建流对象必须实现AutoCloseable这个接口,如果实现了,在try后面的{}(读写代码)执行后后自动调用,流对象的close方法将流关掉
图片加密
将写出的字节异或上一个数,就是这个数的秘钥,解密的时候再次异或就可以了
代码
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("copy.jpg"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("copy2.jpg"));
int b;
while ((b=bis.read()) !=-1){
bos.write(b ^ 123); //b^123^123=b
}
bis.close();
bos.close();