回顾:文件流
File(String path)
流:
RandomAccessFile(file, rw)
read()
write()
文件复制:
BufferedInputStream(FileInputStream)
BufferedOutputStream(FileOutputStream)
int read() -> 读单个字节
int read(byte[] bs) -> 读bs.length个字节
int read(byte[], off, len)
write(int) -> 写单个字节
write(byte[]) -> 写入数组字节
write(byte[], off, len)
文件内容读写:
BufferedReader(InputStreamReader(字节流))
String readLine() -> 读取一整行,返回null末尾
PrintWriter(OutputStreamWriter(字节流))
指定文件是否追加写入、指定字符集、指定是否自动刷新
print()
println()
对象读写:
ObjectInputStream(字节流)
readObject()
ObjectOutputStream(字节流)
writeObject(obj)
对象 -> 字节:序列化
对象必须是可序列化的Serializable
Error:严重错误
StackOverError
异常:Exception - 可以解决的
运行时异常/未检查异常:RuntimeException -> Exception
ClassCastException -> 类型转换异常
NullPointerException -> 空指针异常
ArrayIndexOutOfBoundsException -> 数组越界异常
xxxIndexOutOfBoundsException
ConcurrentModificationException -> 集合迭代删除
NumberFormatException -> 数值转换异常
Integer.valueOf(“aa”);
ArithmeticException: / by zero
造成原因:程序员自身马虎,必须要解决的
已检查异常:Exception
FileNotFoundException
IOException
ParseException
SQLException
UnsupportedEncodingException
ClassNotFoundException
造成原因:不是程序员自身问题,没办法完全避免的异常
可能是外部客观原因,不能彻底解决,只能避免
处理异常:只有已检查异常必须使用代码处理
未检查异常必须修改代码、纠正程序
1.方法上声明抛出 throws 已检查异常
2.自己处理 try/catch 代码块
注意:
try只能有一个,catch可以有多个,至少有一个
一个catch中可以捕获多个异常,用 | 连接
同一个异常,不能多次捕获
捕获异常,可以使用父类异常捕获
如果同时捕获子类和父类,必须先捕获子类异常,再捕获父类异常
try不能独立使用
try-catch可以嵌套,但是不推荐
e.printStackTrace(); 打印代码执行栈路径
通常开发调试时会保留,上线时删除
finally —> 无论如何都会执行的
通常用来释放资源
前期代码,很少使用异常处理,JavaEE框架阶段,自定义异常处理
throw 手动抛出异常对象
异常处理原则:能自己解决的尽量自己解决,不能解决了再向外抛
异常属性:message - 异常提示信息, 很重要
所有异常都有一个使用message初始化的构造器
所有异常都有getMessage()
自定义异常:
目的:为了区分不同的异常类型
定义方法:只需要添加构造器即可
其它全部靠继承
------——————————————————————————————————————————————————————
package java_10;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.junit.Test;
public class ExceptionDemo {-------------------------------------------------------文件捕获异常
@Test
public void test01() {
try {
String str = null;
str.charAt(0);
System.out.println(“异常之前”);
new FileInputStream(“b.txt”);//读文件
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println(“捕获到文件未找到异常”);
e.printStackTrace();
} catch(NullPointerException e) {
System.out.println(“捕获到空指针异常”);
}
// catch (FileNotFoundException|NullPointerException e){ 放在一起
// System.out.println(“捕获到 文件未找到/空指针异常”);
// }
}
@Test
public void test02() {------------------------------------------------------------------------------捕获编码方式异常
try {
new String (“黑”.getBytes(),“uft-8”);//将utf-8写成 uft-8
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void test03() throws IOException {// ---------------------------------------------------------手动制造异常
//手动制造异常,并抛出,等同于给方法调用者一个结果,结果是异常
throw new IOException();// – 等同于下面两句
/*
* new FileInputStream(“a.txt”);
* return “报表”;
*/
}
——————————————————————————————————————————————————————————————
@Test
public void test04() {-------------- 新建 CEO 对象 来获取报表
CEO ceo = new CEO();
String str = ceo.get财务报表();
System.out.println(str);
}
package java_10;
public class CEO {-————————————————————————————CEO
CFO cfo = new CFO();
public String get财务报表() {
String str = cfo.get财务报表();
return str;
}
}
package java_10;
public class CFO {————————————————————————————CFO
财务经理 cwjl = new 财务经理();
public String get财务报表() {
String str = cwjl.get报表();
return str;
}
}
package java_10;
import java.io.IOException;
public class 财务经理 {-——————————————————————————财务经理
private 会计 kj = new 会计();
public String get报表() {
String str = null;
try {
str = kj.get表();
} catch (IOException e) {
e.printStackTrace();
String message = e.getMessage();-----用来输出异常信息(下面exp行)
System.out.println(message);
str = “财务经理的报表”;
}
return str;
}
}
package java_10;
import java.io.IOException;
public class 会计 {-——————————————————————————————会计
public String get表() throws IOException {-------将异常抛给上级
throw new IOException(“经理,财务报表给过你了”);-------(exp)
}
}
——————————————————————————————————————————————————————————————
@Test
public void test05() { -----------测试finally的顺序 finally在return 之前执行
int i = Login.login();
System.out.println(i);
}
}
package java_10;
public class Login {
public static int login() {----------------------------打印结果为。 finally:11
10(这个10 为return)
int a =10;
try {
return a;
}catch(Exception e) {
return 1;
}finally {
a++;
System.out.println("finally:" + a);
}
}
}
————————————————————————————————————————————————————————