本文共 3420 字,大约阅读时间需要 11 分钟。
/** * 笔记: * 异常处理 * 一、当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,Java就会用异常对象来描述。 * 二、Java用两种方法处理异常 * 1.在发生异常的地方直接处理。 * 2.将异常抛给调用者,让调用者处理。 * 三、异常分类 * 1.检查性异常(编译异常):java.lang.Exception * 在没有运行的时候就知道有异常,必须要处理。程序正确,但因为外在的环境条件不满足引发。这不是程序本身的逻辑错误, * 而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发人员必须考虑并处理这个问题, * java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。 * 例如:用户错误及I/O问题——程序试图打开一个并不存在的远程Socket端口,或打开不存在文件。 * * 2.运行期异常:java.lang.RuntimeException * 编译的时候,编译器不能发现,只有运行的时候才能发现。这意味着程序存在bug,如数组越界,0被除,入参不满足规范... * 这类异常需要更改程序来避免,Java编译器强制要求处理这类异常。 * 3.错误:java.lang.Error * 最严重,很难通过程序来解决,可能源于源程序的bug,但一般更可能源于环境问题,如内存耗尽。但是一般很少见。 * 错误在程序中无需处理,由运行环境处理。 * 注:顶层是java.lang.Throwable类,检查性异常,运行期异常,错误都是这个类的子孙类。 * java.lang.Exception和java.lang.Error继承自java.lang.Throwable, * java.lang.RuntimeException继承自java.lang.Exception。 * 四、异常处理 * 1.try ... catch * 程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。 * 2.finally * 如果把finally块置于try ... catch 语句后,finally块一般都会得到执行。 他相当于一个万能保险,即使前面的try块发生异常, * 而又没有对应异常的catch块,finally块将马上执行。 * 注:以下情形,finally块将不会被执行。 * (1)finally块中发生了异常。 * (2)程序所在线程死亡 * (3)在前面代码有System.exit(); * (4)关闭CPU * 3.将异常抛给调用者,让调用者处理异常throws。 * 五、多个异常处理的规则 * 定义多个catch可以精确定位异常。如果为子类的异常定义了特殊的catch块,而父类的异常则放在另一个catch块中。此时必须满足以下规则: * 子类异常的处理块必须在父类异常处理块的前面,否则会发生编译错误。所以越特殊的异常越在前面处理,越普遍的异常越在后面处理。 * 这类似于制订防火墙的规则次序:较特殊的规则在前,较普遍的规则在后。*/
package com.shuiyixin1;import java.io.*;import java.net.*;public class learnJ_007yichang { /** * @作者:shuiyixin * @日期:2018.02.15 * @内容:异常 * */ public static void main(String[] args) { // TODO Auto-generated method stub //检查异常1.打开文件 //错误提示:Unhandled exception type FileNotFoundException //FileReader fr = new FileReader("D:\\aa.text"); //处理方式 使用try ... catch FileReader fr = null; try { fr = new FileReader("D:\\aa.txt"); //在出现异常的地方会终止执行代码,会直接进入到catch,如果有多个catch语句,则进入匹配异常的那个。 //System.out.println("hello try"); } catch (Exception e) { //捕获异常可以直接在最大情况下捕获,也可以捕获最小异常。即catch(FileNotFoundException e) //输出异常信息,利于排错,排除bug //System.out.println("hello catch"); e.printStackTrace(); } finally{ //不管有没有异常,一定会执行。一般用于把需要关闭的资源[文件,连接,内存...] //注意 如果没有catch,直接是try ,finally也是可以的。 System.out.println("调用Finally"); if (fr!=null) { try { fr.close(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } //检查异常2.连接一个端口:192.168.12.12 ip 的端口号是 4567 //在运行,cmd黑窗口中ping www.baidu.com //提示错误:Unhandled exception type UnknownHostException //Socket a = new Socket("192.168.1.23",78); //运行异常1.零被除 //提示错误:java.lang.ArithmeticException: / by zero //int a = 4/0; //运行错误2.数组越界 //提示错误:java.lang.ArrayIndexOutOfBoundsException: 3 //int arr[] = {1,2,3}; //System.out.println(arr[3]); //如果上面捕获异常,下面语句还会执行,例如: System.out.println("hello world"); //异常抛出 Father f1 = new Father(); f1.test1();// at com.shuiyixin1.Son.test2(learnJ_007yichang.java:96) 错误第一次出现// at com.shuiyixin1.Father.test1(learnJ_007yichang.java:83) 调用Son类时调用错误// at com.shuiyixin1.learnJ_007yichang.main(learnJ_007yichang.java:63) 在主函数中调用错误函数。 }}class Father { private Son son = null; public Father(){ son = new Son(); } public void test1(){ //父类可以继续抛出,最后会交给虚拟机去做。 System.out.println("father test1"); try { son.test2(); } catch (Exception e) { // TODO: handle exception System.out.println("Father test1 catch"); e.printStackTrace(); } }}class Son{ public void test2()throws Exception{ //错误我不负责,谁调用我谁解决。 FileReader fr = null; fr = new FileReader("d:\\dd.txt"); }}
转载地址:http://jyyni.baihongyu.com/