/**
* 笔记:
* 异常处理
* 一、当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,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块中。此时必须满足以下规则:
* 子类异常的处理块必须在父类异常处理块的前面,否则会发生编译错误。所以越特殊的异常越在前面处理,越普遍的异常越在后面处理。
* 这类似于制订防火墙的规则次序:较特殊的规则在前,较普遍的规则在后。
* 笔记:
* 异常处理
* 一、当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,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");
}
}