您的位置:首页 > 编程语言 > Java开发

Java基础之异常、io流

2015-07-25 16:36 471 查看

1.异常

必要性:把各种不同类型的异常情况进行分类,用异常类来表示异常处理情况,异常流程的代码和正常代码分离,可以灵活处理异常。

处理异常的两种方法:

1.在当前方法中通过try···catch语句捕获并处理异常

2.在方法的声明处通过throws语句声明抛出异常

Java异常处理机制:

finally语句:任何情况下都必须执行的代码,确保占用的资源被释放。

语法规则:

1.try代码块不能脱离catch代码块或finally代码块二单独存在。finally代码块必须在catch代码块后面。

2.在try代码块中定义的变量作用域为try代码块,在catch和finally中不能访问该变量。

3.当try代码块后面有多个catch代码块时,会把异常对象和catch代码块声明的类型匹配。

异常流程的运行过程:

1.finally语句不被执行的惟一情况是先执行了用于终止程序的System.exit()方法。零表示正常终止,非零数字表示异常终止。

2.return方法用于退出本方法,在执行try或catch代码块中的return语句时,如果有finally代码块,会先执行finally代码块。

3.最好不要在finally代码块中用return语句。

1.1 Java异常类

Throwable类常用方法:

getMassage():返回String类型的异常信息

printStackTrace():打印跟踪方法调用栈而获得的详细异常信息。

两个直接子类:

Error类:仅靠程序本无法恢复的严重错误

Exception类:表示程序本身可以处理的异常

常见的异常:

java.lang.NullPointerException(空指针异常)

java.lang.ClassNotFoundException( 指定的类不存在)

java.lang.NumberFormatException(字符串转换为数字异常)

java.lang.IndexOutOfBoundsException(数组下标越界异常)

java.lang.EOFException(文件已结束异常)

java.lang.ArrayStoreException(数组存储异常)

java.lang.ClassCastException(数据类型转换异常)

java.lang.ArithmeticException(数学运算异常)

java.lang.IllegalAccessException(没有访问权限)

java.lang.NoSuchMethodException(方法不存在异常)

java.lang.NoSuchFiledException(文件不存在异常)

java.lang.InstantiationException(实例化异常)

java.lang.NoClassDefFoundException(未找到类定义错误)

java.lang.CloneNotSupportedException(不支持克隆异常)

java.lang.InterruptedException(被中止异常)

java.lang.IllegalArgumentException(方法的参数错误)

java.lang.InstantiationException(实例化异常)

java.lang.OutOfMemoryException(内存不足错误)

java.lang.FileNotFoundException(文件未找到异常)

SecturityException:违背安全原则异常

SQLException:操作数据库异常

IOException:输入输出异常

SocketException:通信异常

1.2区分运行时异常和受检查异常

受检查异常表示程序可以处理的异常,这些异常是可以修复的。

运行时异常表示无法让程序回复运行的异常。

1.3异常处理原则

异常只能用于非正常情况

为一场提供说明文档

尽可能地避免异常,尤其是运行时异常

保持异常的原子性

避免过于庞大的try代码块

在catch语句中指定具体的异常类型

不要在catch代码块中忽略被捕获的异常

2.io流

2.1分类:

按数据流的方向的不同可以分为输入流和输出流

按处理数据单位不同可以分为字节流和字符流

按功能不同可以分为节点流和处理流

2.2所有流类型都分别继承四种抽象流类型

类型字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

2.3节点流和处理流

节点流:可以从一个特定的数据源读取数据

处理流:连接在已存在的流(节点流或处理流)之上,处理数据

2.4 基本方法:

InputStream:

int read()读取一个字节并以整数形式返回,末尾返回-1

int read(byte[] buffer)读取一些列字节存储到一个数组buffer,返回读取的字节数,末尾返回-1

int read(byte[] buffer ,int offset, int length)从offset的位置开始读取length个字节,返回读取的字节数,末尾返回-1

void close()关闭流释放资源

OutputStream:

int write()

int write(byte[] buffer)

int write(byte[] buffer ,int off,int len)

void close()

void flush()将输出流中缓冲的数据全部写出到目的地。先于close()方法执行

Writer:

void write(String string)实际上是调用某个函数toCharArray()转换成字符数组

其他的准换成字符数组,其余类似

Reader和Writer类似

2.5代码实例

①FileInputSream

import java.io.*;
public class TestFileInputStream {
public static void main(String[] args){
int b = 0;
FileInputStream in = null;
try {
//路径:/或者两个\\
in = new FileInputStream("E:\\文学\\demo1\\src\\TestFileInputStream.java");
} catch (FileNotFoundException e) {
System.out.println("找不到指定文件");
System.exit(-1);
}
long num = 0;
try {
while((b=in.read())!=-1){//相当于文件还没有读到结尾
System.out.print((char)b);
num++;//读了多少个字节
}
in.close();
System.out.println();
System.out.println("共读取了"+num+"个字节");
} catch (IOException e) {
System.out.println("文件读取错误");
System.exit(-1);
}
}
}


②缓冲流(处理流)

bufferedReader里面很好用的方法:readLine()一行一行的读取数据

import java.io.*;
public class TestFileInputStream {
public static void main(String[] args){
try {
BufferedWriter bw = new BufferedWriter(new FileWriter("E:/文学/demo1/src/data.txt"));
BufferedReader br = new BufferedReader(new FileReader("E:/文学/demo1/src/data.txt"));
String s = null;
for(int i=1;i<=100;i++){
s = String.valueOf(Math.random());
bw.write(s);
bw.newLine();//换行
}
bw.flush();//写出,小桶清空(也就是刚写入的东西又重新全部写出,清空缓存)
while((s=br.readLine())!=null){
System.out.println(s);
}
bw.close();
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


③print流

有自动的flush功能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: