异常(Exception)
1) 行为(方法, 过程)的意外结果
2) 一个方法如果抛出了异常,这个方法就必须声明异常的抛出.
异常的声明:在方法上声明方法的意外结果,如:
User reg( String pwd, String email) throws UserExistException;
User login(String email, String pwd) throws NameOrPwdException;
3 异常类一般继承于Exception
4 调用抛出异常的方法,必须处理异常
4.1 使用try catch finally 捕获
4.2 直接再抛出异常
处理方式,依赖于具体业务逻辑,很灵活。
5 如果代码有异常发生,异常以后的代码将不再执行。
6 try catch finally
try 是尝试运程代码块,如果有异常会被随后的catch捕获,异常发生以后代码不执行
catch代码块是异常处理代码。需要提供合理的处理,异常的处理,是与具体业务逻辑有关。可以写多个catch处理一系列异常,但是要注意:异常的大小关系,大类型的放到后面处理。有的时候 catch(Exception) 粗粒度处理异常,代码简洁语义含糊. 根据业务逻辑适当选用。
finally 代码块,不管是否出现异常,总会执行的代码块。经常用来处理现场的清理,比如:可靠的数据库连接关闭。
7 异常有一个基本原则:能够底层处理的尽量处理,但是如果不能处理,必须抛出到调用者(方法)。不应该简单的抛弃。
8 异常捕获再抛出, 是一种把底层异常进行封装,转换为另外一种异常类型。
9 *建议在捕获到异常时候使用e.printStackTrace(),打印到控制台,输出内容是:出现异常时候的方法调用堆栈.一般情况下,凡是捕获异常代码都输出:e.printStackTrace()
10 异常的分类
Throwable
|--Error 是系统不可恢复的错误,由JVM发生
| |--OutOfMemoryError 堆内存溢出
| |--StackOverflowError 栈内存溢出
|--Exception 程序可以检查处理的异常,常见的异常继承根
|--java.text.ParseException format解析对象时候发生
| 如:Date d = dateformat.parse("2010-5-5");
|--RuntimeException 非检查异常,Javac忽略对这类异常的语法检查,如:异常抛出,异常处理等。
|--IllegalArgumentException
|--NullPointerException *
|--ArrayIndexOutOfBoundsException *
|--ClassCastException *
|--NumberFormatException * Integer.parseInt(S)
11 软件中会大量使用自定义异常,一般从Exception继承。
异常类命名要有实际意义, 一般都手工继承父类的构造器。
3 Java java.io.File (pwd ls mkdir rm )
1) File类的用途: 用于表示文件(目录);只用于表示文件(目录)的信息(名称,大小等)不能对文件的内容进行访问
File 代表文件系统中对文件/目录的管理操作(增删改查, CRUD)
2) java.io.File基本API
任务: A 检查当前文件夹中是否包含目录 demo
B 如果没有demo, 就创建文件夹demo
C 在demo 中 创建文件 test.txt
D 显示demo 文件夹的内容.
E 显示test.txt 的绝对路径名
F 显示test.txt 的文件长度和创建时间
File(String)
long length()
long lastModified()
String getName()
String getPath()
boolean exists()
boolean dir.isFile()
boolean dir.isDirectory()
boolean mkdir()
boolean mkdirs()
boolean delete();
boolean createNewFile() throw IOException
File[] listFile()
3) 回调模式和FileFilter (ls|grep patten)
File[] listFile(FileFilter)
A 任务: 列出 src/corejava/day07 中的.java文件
4 RandomAccessFile 操作文件内容, 访问文件任意位置
1)Java 文件模型, 文件是byte by byte 是数据集合
data : 41 42 00 00 00 ff d6 d0 ...
index : 0 1 2 3 4 5 6 7 8
pointer: ^
2) 打开文件, 有两种模式 "rw", "r"
RandomAccessFile raf = new RandomAccessFile(file, "rw");
打开文件时候默认文件指针在开头 pointer=0
写入方法: raf.write(int) 将整数的"低八位"写入到文件中, 指针自动移动到下一个位置, 准备再次写入
* 文件名的扩展名要明确指定, 没有默认扩展名现象!
任务: A 在demo文件夹中创建raf.dat
B 打开这个文件
C 写入 'A' 和 'B'
D 写入整数 255 占用4个byte
E 写入GBK 编码的 '中', d6d0