标签:
当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用……)时,java就会用异常对象来描述。
Java中用2种方法处理异常:
1、在发生异常的地方直接处理;
2、将异常抛给调用者,让调用者处理。
1、检查性异常:java.lang.Exception
2、运行期异常:java.lang.RuntimeException
3、错误: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,但一般更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而由运行环境处理。
演示代码如下:
1 /**日期:2016-03-08 2 * 功能:异常的演示 3 */ 4 package test; 5 import java.io.*; //涉及到I/O操作,需要引入这个包 6 import java.net.Socket; 7 public class Demo1 { 8 9 public static void main(String[] args){ 10 // TODO Auto-generated method stub 11 12 //1、检查异常 13 //例子1:打开不存在的文件,会自动报错 14 FileReader fr=new FileReader("D:\\sth.text"); 15 //例子2:连接到一个无法连接的IP地址时,会自动报错 16 Socket sk=new Socket("192.168.12.12",78); 17 18 //2、运行异常 19 //例子1:除0,编译时不会自动报错,但是运行时会报错 20 int a=4/0; 21 //例子2:越界,编译时不会自动报错,但是运行时会报错 22 int arr[]={1,3,5}; 23 System.out.println(arr[10]); 24 } 25 }
程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。
如果把finally块置try...catch...语句后,finally块一般都会得到执行,它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行。
但是注意,以下情形,finally块将不会被执行:
1、finally块中发生了异常;
2、程序所在线程死亡;
3、在前面的代码中用了System.exit();
4、关闭GPU。
将异常抛给调用者,让调用者处理异常,一般不要用。
演示代码如下:
1 /**日期:2016-03-08 2 * 功能:异常处理的演示 3 */ 4 package test; 5 6 import java.io.*; 7 import java.net.Socket; 8 9 public class Demo2 { 10 11 public static void main(String[] args) { 12 // TODO Auto-generated method stub 13 14 try 15 { 16 //在程序出现异常的地方,就终止执行代码 17 //然后进入catch 18 //如果有多个catch语句,则进入与错误匹配的catch语句中 19 FileReader fr=new FileReader("D:\\something.text"); 20 //位置1:未执行 21 System.out.println("程序运行到:位置1"); 22 Socket sk=new Socket("192.168.12.12",78); 23 }catch(Exception e) 24 //此处也可以用多个catch语句,每个catch语句对应一个具体的异常 25 //如FileNotFoundException、UnknowHostException 26 { 27 //将异常信息输出,方便排除bug 28 //位置2 29 System.out.println("程序运行到:位置2"); 30 e.printStackTrace(); 31 }finally 32 { 33 //位置3 34 System.out.println("程序运行到:位置3"); 35 //这个语句块,不管有没有异常,都会被执行 36 //一般来说,把需要关闭的资源(如前面已经打开的文件、链接、内存等)放到这个语句块 37 //否则:打开的文件内容会因为没有关闭而没有保存;计算机会一直试图连接连不上的网络 38 //内存会不停的被占用等 39 /* if(fr!=null) 40 * { 41 * try{ 42 * fr.close(); 43 * }catch{ 44 * e.printStackTrace(); 45 * } 46 * } 47 */ 48 } 49 //位置4 50 System.out.println("程序运行到:位置4"); 51 } 52 }
运行结果如下:
1 程序运行到:位置2 2 java.io.FileNotFoundException: D:\something.text (系统找不到指定的文件。) 3 at java.io.FileInputStream.open(Native Method) 4 at java.io.FileInputStream.<init>(Unknown Source) 5 at java.io.FileInputStream.<init>(Unknown Source) 6 at java.io.FileReader.<init>(Unknown Source) 7 at test.Demo2.main(Demo2.java:19) 8 程序运行到:位置3 9 程序运行到:位置4
韩顺平循序渐进学java 第26讲 异常 =====基础部分END=====
标签:
原文地址:http://www.cnblogs.com/PistonType/p/5255296.html