一、异常
1.捕捉异常
2.异常捕捉机制
try{ //可能产生异常的代码 }catch(Type idl) { //处理Type异常的代码 }
3.捕捉到的异常
二、异常机制
1.异常
2.抛出异常
如果你的函数可能抛出异常,就必须在函数头部加以声明
void f() throws TooBig,TooSmall,DivZero {//... void f() {...
你的声明并不会真的抛出异常
什么能扔:任何继承了Throwable类的对象
Exception类继承了Throwable, throw new Exception(); throw new Exception("HELP");
3.异常捕捉时的匹配
catch怎么匹配异常的:Is-A的关系,就是说,抛出子类异常会被捕捉父类异常的catch给捉到
捕捉任何异常:
catch(Exception e){ System.err.println("Caught an exception"); }
运行时刻异常:像ArrayIndexOutOfBoundsException这样的异常是不需要声明的,但如果没有适当的机制来捕捉,就会最终导致程序终止
4.异常遇到继承
如果你调用一个声明会抛出异常的函数,那么你必须:把函数的调用放在try中,并设置catch来捕捉所有可能抛出的异常,或声明自己会抛出无法处理的异常
当覆盖一个函数时,子类不能声明抛出比父类版本更多的异常。在子类的构造函数中,必须声明父类可能抛出的全部异常
三、流
1.流
流是输入输出的方式,流是一维单向的
流的基础类:InputStream, OutputStream
2.文件流
FileInputStream, FileOutputStream , 对文件作读写操作。实际工程中已经较少使用,更常用的是以在内存数据和通信数据上建立的流,如数据库的二进制数据读写或网络端口通信,具体的文件读写往往有更专业的类,比如配置文件和日志文件
3.流过滤器
以一个介质流对象为基础层层构建过滤器流,最终形成的流对象能在数据的输入输出过程中,逐层使用过滤器流的方法来读写数据
DataInputStream , DataOutputStream , 用以读写二进制的方式表达基本数据类型的数据
四、文本的输入输出
1.文本流
二进制数据采用 InputStream/OutputStream
文本数据采用Reader/Writer
在流上建立文本处理:
PrintWriter pw = new PrintWriter( new BefferedWriter( new OutputStreamWriter( new FileOutputStream("abc.txt")));
最常用的是BufferedReader , readLine()
可得到行号,之后用 getLineNumeber()
2.汉字编码
3.格式化输入输出
五、流的应用
1.流的应用
read()函数是阻塞的,在读到所需内容之前会停下来等,使用read()这样的更“高级”的函数,如nextInt()、readLine()都是这样的,所以常用单独的线程来做socket读的等待,或使用nio的channel选择机制
对于socket,可以设置SO时间,setSoTimeout(int timeOut)
2.对象串行化