一、异常处理的基本概念
当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用…)时,java就会用异常对象来描述。
Java中用2种方法处理异常:
- 在发生异常的地方直接处理;
- 将异常抛给调用者,让调用者处理。
异常分类
①检查性异常:java.lang.Exception
②运行期异常:java.lang.RuntimeException
③错误: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,但一般更可能源于环境问题,如内存耗尽。错误在程序中无需处理而由运行环境处理。
三、异常处理 - try…catch
程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。 - finally
如果把finally块置try…catch…语句后,finally块一般都会得到执行,它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行。
以下情况,finally块将不会被执行:
①finally块中发生了异常;
②程序所在线程死亡;
③在前面的代码中用了System.exit();
④关闭CPU。
3.将异常抛给调用者,让调用者处理异常 throws
代码如下:
/**
*
*/
package com.xx.day8;
import java.io.*;
import java.net.*;
/**
* @author 程序员小新儿
*2020年4月12日
*/
public class AbnormalTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//检查性异常
//1.打开文件
// try {
// FileReader fr = new FileReader("c:\\cc.txt");
// } catch (Exception e) { //最大捕获异常
// // TODO: handle exception
// //把异常的信息输出,利于排除bug
// e.printStackTrace();
// }
// try {
// FileReader fr = new FileReader("c:\\cc.txt");
// //再出现异常的地方就终止执行代码
// //然后进入catch
// //如果有多个catch语句,则进入匹配异常那个catch语句
// } catch (FileNotFoundException e) { //有什么异常就捕获什么异常
// // TODO: handle exception
// //把异常的信息输出,利于排除bug
// e.printStackTrace();
// }
//2.连接一个192.168.12.12 ip的端口号4567
//Socket socket = new Socket("192.168.12.23" , 56);
//运行异常
//int a = 5 / 0;
//int b = 7 / 0;
//int arr[] = {1 , 2 , 3};
//System.out.println(arr[1234]);
FileReader fr = null;
try {
fr = new FileReader("d:\\cc.txt");//d盘下有这个文件
Socket socket = new Socket("192.168.123.234" , 456);
} catch (Exception e) { //最大捕获异常
// TODO: handle exception
//把异常的信息输出,利于排除bug
e.printStackTrace();
}finally {
//这个语句块,不管有没有异常,都会执行
//一般说,把需要关闭的资源:(文件、连接、内存...)
if (fr != null) {
try {
fr.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
}
点我进入原文公众号链接
微信扫描下方二维码或微信公众号搜索【程序员小新儿】欢迎关注哦~