java中2种方法处理异常:
1、在发?异常的地方直接处理;
2、将异常抛给调用者,让调?者处理。
异常分类
1、检查性异常: java.lang.Exception
2、运?期异常: java.lang.RuntimeException
3、错误: java.lang.Error
顶层是java.lang.Throwable类,检查性异常、运?期异常、错误都是这个类的?孙类,
ja va . la n g. Exce pt i on和ja va . la n g. Error继承?ja va . la n g. Th rowa ble,?
java.lang.RuntimeException继承?java.lang.Exception
1、检查性异常:
程序正确,但因为外在的环境条件不满?引发。例如:用户错误及I/O问题--程序试图打
开?个并不存在的远程Socket端?,或者是打开不存在的文件时。这不是程序本身的逻辑
错误,?很可能是远程机器名字错误(?户拼写错误),对商?软件系统,程序开发者必须
考虑并处理这个问题。 java编译器强制要求处理这类异常,如果不捕获这类异常,程序将
不能被编译。
2、运行期异常:
这意味着程序存在bug,如数组越界、 0被除、入参不满足规范...这类异常需要更改程序
来避免, java编译器强制要求处理这类异常。
3、错误:
一般很少见,也很难通过程序解决,它可能源于程序的bug,但?般更可能源于环境问
题,如内存耗尽。错误在程序中?需处理,由运行环境处理。
/*
栗子 异常 try...catch
*/
import java.util.Random;
public class test_fanxing {
public static void main(String[] args){
int x = new Random().nextInt(5);
int y = new Random().nextInt(10);
int[] z = new int[5];
try{
System.out.println("x=" + x + "y=" + y + "y/x=" + (y/x));
System.out.println("y=" + y + "z[y]=" + z[y]);
}
catch(ArithmeticException exc1){
//分步捕获算术运算异常信息
System.out.println("算术运算异常:" + exc1.getMessage());
}
catch(ArrayIndexOutOfBoundsException exc2){
System.out.println("数组越界异常:" + exc2.getMessage());
}
}
}
2、 finally
如果把finally块置try...catch...语句后, finally块?般都会得到执?,它相当于?个
万能的保险,即使前?的try块发?异常,??没有对应异常的catch块, finally块将?上
执?。
以下情形, finally块将不会被执?:
1、 finally块中发?了异常;
2、程序所在的线程死亡;
3、在前?的代码中?了System.exit();
4、关闭CPU
/*
栗子 finally
*/
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.Socket;
public class test_fanxing {
public static void main(String[] args) {
FileReader fr = null;
//检查异常
//1. 打开不存在的文件
try{
//fr = new FileReader("D:\\aa.txt");
//System.exit(-1);//使用System.exit()后finally语句块不再执行
Socket s = new Socket("192.168.956.1",21);
}
/* catch (FileNotFoundException e){
System.out.println("文件不存在:" + e.getMessage());//getMessage()不如printStackTrace()
//e.printStackTrace();//输出bug 信息
}*/
catch(IOException e2){
e2.printStackTrace();
}
finally {
//try.catch...语句块中不管出没出现异常,一般都会执行finally语句块
//一般说,把需要关闭的资源。如【文件】、【链接】、【内存】....
System.out.println("测试进入finally语句块");
if(fr!=null){
try{
fr.close();
}
catch (Exception e){
e.printStackTrace();
}
}
}
System.out.println("OK1");
}
}
/*
【结果】
文件不存在:D:\aa.txt (系统找不到指定的文件。)
测试进入finally语句块
OK1
2.如果把第一个catch注释掉
【结果】
java.net.UnknownHostException: 192.168.956.1
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at test_fanxing.main(test_fanxing.java:23)
测试进入finally语句块
OK1
*/