1. 异常处理
1.1 概述
异常是Java中提供的一种识别及响应错误情况的一致性机制。有效地异常处理能使程序更加健壮、易于调试。
异常 其实就是错误的一种说法,在java中 有一个专门模拟所有异常和错误的类 Throwable,是所有异常类的父类
try...catch..: 处理异常,一般用于客户端
throws : 抛出异常,一般用于服务端
throw : 异常源点
finally: 必须执行的语句
1.2 继承体系
1.3 Error
系统内部错误,这类错误由系统进行处理,程序本身无需捕获处理。
比如:OOM(内存溢出错误)、VirtualMachineError(虚拟机错误)、StackOverflowError(堆栈溢出错误)等,一般发生这种情况,JVM会选择终止程序。
1.4 Exception
1.4.1 概述
Exception是所有异常类的父类。分为非RuntimeException和RuntimeException。
非RuntimeException
指程序编译时需要捕获或处理的异常,如IOException、自定义异常等。属于checked异常。
RuntimeException
指程序编译时不需要捕获或处理的异常,如: Nul1PointerException等。属于unchecked异常。一般是由程序员粗心导致的。如空指针异常、数组越界、类型转换异常等。
1.4.2 常用方法
2. try...catch...
2.1 常用方法
import java.io.FileInputStream;
/**
* try{
* 高风险代码
* 只要出错,就会执行catch,try中剩余代码不再执行
* 如果没出错,try就会顺利执行,不会执行catch
* }catch(异常类型 变量) {
* 处理方案;
* }
* @author 13495
*
*/
public class Excepion_01 {
public static void main(String[] args) {
try {
// 加载对应的文件
FileInputStream fis = new FileInputStream("123.txt");
// 找不到路径不会打印
System.out.println("+++++++");
} catch (Exception e) {
// 打印错误栈帧和信息,一般用于给程序员排错
e.printStackTrace();
// 获取错误信息,一般用于反馈给客户端
String msg = e.getMessage();
System.out.println(msg);
}
System.out.println("不会终止生命周期");
}
}
2.2 同时捕获多个异常
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* try{
* 高风险代码
* }catch(异常类型 变量){
* 处理措施;
* }catch(异常类型 变量){
* 处理措施;
* }catch(异常类型 变量){
* 处理措施;
* }...
* @author 13495
*
*/
public class Excepion_02 {
public static void main(String[] args) {
// 当try下面 可能会出现多个异常的时候,并且每个异常对应的解决方案不同的时候
// 需要写多个catch进行不同的处理
// 如果解决方案一致,则只写一个 Exception 即可
try {
new FileInputStream("123");
String str = null;
System.out.println(str.equalsIgnoreCase(""));
} catch (FileNotFoundException e) {
System.out.println("文件找不到");
}catch (NullPointerException e) {
System.out.println("不能是空");
}catch (Exception e) {
System.out.println("其它异常");
}
}
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* try {
*
* }catch(异常类型1 | 异常类型2 | 异常类型3....){
* 处理措施;
* }
*
* @author 13495
*
*/
public class Excepion_03 {
public static void main(String[] args) {
try {
new FileInputStream("123");
String str = null;
System.out.println(str.equalsIgnoreCase(""));
} catch (FileNotFoundException | NullPointerException e) {
System.out.println("文件找不到");
}
}
}
2.3 finally
import java.io.FileInputStream;
/**
* finally: 必须执行的语句块,不能单独使用,必须和try 或者try..catch..一起使用
*
* finally 只有一种不执行的情况,那就是 System.exit(0);
*
* @author 13495
*
*/
public class Excepion_04 {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("111");
System.out.println(fis);
} catch (Exception e) {
e.printStackTrace();
}finally{
System.out.println("必须执行");
}
}
}
2.4 1.7新特性 自动关闭流
import java.io.FileInputStream;
/**
*
* try(开启资源语句;开启资源语句;...) {
* 高风险代码;
* }catch(异常类型 变量) {
* 处理方案;
* }
* @author 13495
*
*/
public class Excepion_05 {
public static void main(String[] args) {
try(FileInputStream fis = new FileInputStream("")) {
//操作
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. throws
3.1 概述
throws : 抛出异常,只是一种提醒机制,并不会解决问题,该报错还是报错,该终止生命周期还是会终止
如果你的下家提醒了你,要么你提醒你的上家,要么你处理掉
如果我们调用的方法中抛出了异常,那么要么我们也抛出,要么我们try掉
如果 你知道这个问题怎么解决,就是要try 解决掉, 如果不知道, 就throws 抛出去
一般在服务端,使用throws 在客户端 使用 try catch
服务端 就是被调用的 客户端 就是调用处
3.2 使用方法
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Throws_01 {
public static void main(String[] args) {
try {
m1();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void m1() throws FileNotFoundException{
m2();
}
public static void m2() throws FileNotFoundException{
m3();
}
public static void m3() throws FileNotFoundException{
new FileInputStream("");
}
}
3.3 不能有更宽泛的异常
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* 方法覆写,不能比原方法有更宽泛的异常
*
* 子类方法抛出的异常,不能大于父类异常,也就是 小于等于 父类异常均可
*
* 要么和父类抛出的异常一致,要么是父类抛出异常类的子类,或者 直接不抛出异常
* @author 13495
*
*/
public class Throws_02 {
public static void main(String[] args) {
}
class A {
public void m1() throws FileNotFoundException {
}
}
class B extends A{
// 子类抛出的异常不能大于父类抛出的异常
// public void m1() throws Exception {
public void m1() throws FileNotFoundException {
FileInputStream fis = new FileInputStream("");
}
}
}
4. 自定义异常
public class UserExcepion extends Exception{
public UserExcepion(){
}
public UserExcepion(String msg){
super(msg);
}
}