异常的分类
捕获异常
抛出异常
自定义异常
概述:
Java中的异常(Exception)又称为例外,是在一个程序执行期间发生的时间,他中断正在执行程序的正常指令流
1-1 异常的分类
Throwable
Error类负责错误,他指程序运行的时候遇到的硬件或操作系统的错误,比如:内存溢出,堆栈溢出,动态链接错误,虚拟机jvm错误,这些错误都是致命的是依靠程序自身无法解决的
Excetion是运行时错误,他是可以被捕获的。
常见的异常:
2-1 捕获异常
Java异常处理通过5个关键字控制:try,catch,throw,throws和finally;
捕获异常使用:try ..catch语句,把可能发生异常的代码放在try{..}中,然后使用catch捕获对应的Excetion及其子类;
import java.util.InputMismatchException; import java.util.Scanner; /* * try...catch...catch * 多个异常体现 * */ public class ExcetionTest01 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); try { System.out.println("请输入你的被除数:"); int num1 = sc.nextInt(); System.out.println("请输入你的除数:"); int num2 = sc.nextInt(); int sum = num1 / num2; System.out.println("商等于:" + sum); }catch (InputMismatchException e) { System.out.println("输入非法"); //e.printStackTrace();//打印错误信息 }catch(ArithmeticException e) { System.out.println("除数不能为0"); }finally { if(sc != null) { sc.close(); } } } } System.out.println("-----------------------") import java.util.InputMismatchException; import java.util.Scanner; /* * try...catch...catch * 多个异常体现 * */ public class ExcetionTest02 { public static void main(String[] args) { Scanner sc = null; try { try { while(true) { sc = new Scanner(System.in); System.out.println("请输入你的被除数:"); int num1 = sc.nextInt(); System.out.println("请输入你的除数:"); int num2 = sc.nextInt(); int sum = num1 / num2; System.out.println("商等于:" + sum); } }catch (InputMismatchException e) { System.out.println("输入非法"); //e.printStackTrace();//打印错误信息 } }catch(ArithmeticException e) { System.out.println("除数不能为0"); }finally { if(sc != null) { sc.close(); } } } }
捕获异常关键字:
finally
有些时候,try块内引用了一些物理资源,例如数据库连接,网络连接或磁盘文件等。那么一旦try块内出现了异常,这些资源将无法保证可以释放。这个时候必须有一种可以明确保证资源一定得到解放的操作,不管是否存在异常,这就是finally存在的原因(不如如何,fainlly一定会执行!)
3-1 抛出异常
在Java系统中,我们不仅可以使用try...catch来捕捉异常,还可以使用throw语句来显示的引发异常,执行的代码一旦遇到throw语句,就会立即停止,不会继续执行
import java.io.IOException; public class ThrowTest { public static void main(String[] args) { //这是比较负责任的行为 try { method1(); } catch (IOException e) { e.printStackTrace(); } } public static void method1() throws IOException { method2();//抛出异常 } public static void method2() throws IOException{ System.out.println("这是正常执行的代码"); //人为的抛出一个异常 throw new IOException("这是我新建的一个IO异常"); } }
throw和throws的区别:
throw:引发异常,显示的抛出一个异常,一般在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出特定类型的异常
throws:是方法可能抛出异常的声明,用在声明方法时,表示该方法可能抛出异常,然后交给上层调用他的方法处理
区别:
throw出现在方法体,throws出现在方法头
throws是抛出了异常,执行throw则表示一定是抛出了某种类型的异常,throws是表示出现异常的一种可能性,并不一定会抛出这些异常。
4-1 自定义异常
一个常见的做法是自定义一个BaseExcetion作为根异常,然后派生出各种业务类型的异常
BaseExcetion需要从一个适合的Excetion派生,通常建议从RuntimeExcetion派生:
格式:
public class BaseExcetion extends RuntimeExcetion{
}
public class Test { public static void main(String[] args) { System.out.println("这是测试我们自定义异常的:"); method1(); } public static void method1() { System.out.println("这是测试我们自定义异常的:"); throw new UserNotFountExcetionTest("这是我们找不到用户的异常"); } } ----------------- public class UserNotFountExcetionTest extends BaseExcetionTest { public UserNotFountExcetionTest(){ super(); } public UserNotFountExcetionTest(String message) { super(message); } public UserNotFountExcetionTest(Throwable able) { super(able); } public UserNotFountExcetionTest (String message,Throwable able) { super(message,able); } } ------------------------ /** * 这是我们新建的一个项目的根异常 * @author Lenovo * */ public class BaseExcetionTest extends RuntimeException { //构造器 public BaseExcetionTest(){ super(); } public BaseExcetionTest(String message) { super(message); } public BaseExcetionTest(Throwable able) { super(able); } public BaseExcetionTest (String message,Throwable able) { super(message,able); } }