异常处理
基本概念:
当出现程序无法控制的外部环境问题(用户提供的文件不存在、文件内容损坏、网络不可用。。。)时,java就会用异常对象来描述。
Java中用两种方法来处理异常:
- 在发生异常的地方直接处理。
- 将异常抛给调用者,让调用者处理。
异常分类
- 检查性异常:java.lang.Exception
- 运行时异常:java.lang.RuntimeException
- 错误:java.lang.Error
顶层是java.lang.Throwable类,检查性异常、运行时异常、错误都是这个类的子类。java.lang.Exception和java.lang.Error继承自java.lang.Throwable。而java.lang.RuntimeException继承java.lang.Exception
检查性异常:程序正确,但是因为外在的环境条件不满足引发。例如:用户错误及I/O问题——程序视图打开一个并不存在的远程socket端口,或者打开不存在的文件时,这并不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误),对商用软件系统,程序开发者必须考虑并处理这个问题,java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能编译。
运行期异常:这意味着程序存在bug,如数组越界,0被除,入参不满足规范。。。这类异常需要更改程序来避免,java编译器强制要求处理这些异常。
错误:一般很少见,也很难通过程序解决,它可能源于程序的bug,但是一般更可能源于环境问题,如内存耗尽。错误在程序中无需处理,而由运行环境处理。
示例代码:
package jihelist;
import java.io.*;
import java.net.*;
public class exception1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//检查异常1.打开一个不存在的文件
//FileReader fr = new FileReader("d:\\aa.txt");
//异常处理:
//在出现异常的地方就会终止执行代码
//然后进入到catch语句
//如果有多个catch 。则进入到匹配的异常那个
try {
FileReader fr = new FileReader("d:\\aa.txt");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
System.out.println(e);
//处理
} finally {
// 这个语句块,不管有没有异常都会被执行
//一般说,把需要关闭的文件、连接 内存等。。。。
}
System.out.println("ok___");
//连接一个端口
//Socket sc = new Socket("www.baidu.com", 80);
//运行异常:
//java.lang.ArithmeticException: / by zero
//int a = 4/0;
//数组越界
//java.lang.ArrayIndexOutOfBoundsException: 4
//int[] arrey = {1,2,3};
//System.out.println(arrey[4]);
}
}