韩顺平循序渐进学java 第26讲 异常 =====基础部分END=====

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了韩顺平循序渐进学java 第26讲 异常 =====基础部分END=====相关的知识,希望对你有一定的参考价值。

26.1 概念

当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用……)时,java就会用异常对象来描述。

Java中用2种方法处理异常:

1、在发生异常的地方直接处理;

2、将异常抛给调用者,让调用者处理。

26.2 异常分类

1、检查性异常:java.lang.Exception

2、运行期异常:java.lang.RuntimeException

3、错误:java.lang.Error

顶层是java.lang.Throwable类,检查性异常、运行期异常、错误都是其的子孙类。

java.lang.Exceptionjava.lang.Error继承自java.lang.Throwable.

java.lang.RuntimeException继承自java.lang.Exception

26.2.1 检查性异常

在编写程序时就可以自动被检查出来。

程序正确,但因为外在的环境条件不满引发。

例如:用户错误及I/O问题——程序试图打开一个并不存在的远程Socket端口,或者是打开不存在的文件时。

这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发者必须考虑并处理这个问题。Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。

26.2.2 运行期异常

在编写程序时不能被自动检查出来。

这意味着程序存在bug,如数组越界、0被除、入参不满足规范等。

这类异常需要更改程序来避免,java编译器强制要求处理这类异常。

26.2.3 错误

一般很少见,也很难通过程序解决。它可能源于程序的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 }

 

26.3 异常处理

26.3.1 Try catch

程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。

26.3.2 Finally

如果把finally块置try...catch...语句后,finally块一般都会得到执行,它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行。

但是注意,以下情形,finally块将不会被执行:

1、finally块中发生了异常;

2、程序所在线程死亡;

3、在前面的代码中用了System.exit()

4、关闭GPU

 

26.3.3 throws

将异常抛给调用者,让调用者处理异常,一般不要用。

演示代码如下:

 

 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=====的主要内容,如果未能解决你的问题,请参考以下文章

韩顺平循序渐进学java 第04讲 流程控制

韩顺平循序渐进学java 第03讲 运算符

韩顺平循序渐进学java 第01讲 内容介绍.项目演示.原理剖析

韩顺平循序渐进学java 第05.06.07讲 类.对象

韩顺平循序渐进学java 第13讲 抽象类.接口

韩顺平循序渐进学java 第21讲 集合(未完待续)