异常(Exception)
使用jdk自带类完成我们的开发. 创建类的对象 有什么方法, 干什么用
异常: 编程通过, 程序运行的时候, 由于一些外部环境变化,或者程序逻辑问题,造成的运行时错误
关键字: 编译通过, 运行时可能出现的错误,
语法错误: 编译不通过,编译错误 最低级的错误
异常类: 本质还是一个类, 给这一类型的类取一个统一名称
1. JDK的异常体系结构图
2. 对异常处理 优雅的异常处理
IOT --> 智慧型城市
java之父: 詹姆斯·高斯林 优雅
Think in java(java 编程思想): 埃克尔 (Bruce Eckel) 繁琐
spring 之父: 罗宾·约翰逊
异常处理:
1) try -catch - finally 捕获异常并处理
try{ //试一下 可能出现异常的代码 }catch(异常类型 变量名){ //捕获异常 //对捕获到这种异常的处理代码 }
public static void main(String[] args) { Scanner input = new Scanner(System.in); //两个数相除 System.out.println("请输入被除数:"); int num1 = input.nextInt(); System.out.println("请输入除数:"); int num2 = input.nextInt(); System.out.println(num1+"/"+num2+"="+(num1/num2)); }
public static void main(String[] args) { Scanner input = new Scanner(System.in); try { //两个数相除 System.out.println("请输入被除数:"); int num1 = input.nextInt(); System.out.println("请输入除数:"); int num2 = input.nextInt(); System.out.println(num1 + "/" + num2 + "=" + (num1 / num2)); System.out.println("程序结束了...."); }catch(ArithmeticException ex){ //捕获ArithmeticException异常 System.out.println("哥们,你数学不好! 除数不能为0 "); //调用异常相关方法 } }
try大括号中的代码: 是 业务代码
catch大括号中的代码: 处理异常的代码
try后面可以接多个catch, 进行多种异常的捕获
1) 多个catch, 如果这些异常类型没有父子关系, 顺便任意
2) 多个catch, 如果这些异常类型有父子关系, 先子后父
3) 在jdk1.7之前每个catch代码段只声明一种其能处理的特定类型的异常,并提供处理的方法。 Jdk1.7之后,一个catch代码可以可以声明多个能处理的特定异常的类型,多个类型之间用”|”隔开
前提要求: 这些异常没有父子关系, try中可以产生异常
finally 代码块: 该代码块,不管是否产生异常, 都会执行的
try{ }catch(异常类型 e){ }catch(异常类型 e){ } ... }catch(异常类型 e){ }finally{ }
1) try-catch-finally 这个三个一定全部存在?
try-catch
try-finally
但是try,catch,finally不能单独存在, catch,finally必须跟着try
2) return 写法:
a. try 中写, try-catch-finally 之外写 return;
b. try 中写, 每个catch中写 return
c. finaly 写; 只写一个return, 不推荐
d. 在try-catch-finally 之外写, 只写一个
方法有return 又有finally, finally中的代码是在return之前执行.
2) throw / throws 抛出异常
throw 异常对象; 具体抛出一个异常对象, 写在方法体内部
throw 作用: 1) 返回异常结果 2) 结束方法
throws 异常类1,异常类2,... 写在方法签名上, 声明该方法可能会抛出什么类型的异常
异常常用的方法:
public String getMessage() 获取异常的信息 public void printStackTrace() 打印异常的栈跟踪信息
throws 在方法签名上, 表示这个方法可能会抛出什么类型的异常
throw 抛出的异常类型是RuntimeException类型或者子类, 这个方法可以使用throws 声明,也可以省略
throw 抛出的异常类型是编译异常, 这个方法一定使用throws 声明
编译时异常, 代码必须处理的异常,不处理,编译都不通过,
RuntimeException异常, 可以处理,也可以不处理, 编译不会出错
自定义异常
在实际开发中, 根据项目的业务需求, 把某些情况定义为异常:
删除学生: 通过学号删除, 学号不存在作为一种异常来看, 但是jdk没有这个类型的异常
jdk允许我们程序员根据业务需求, 自定义一些异常类:
步骤:
1) 创建一个类(异常类取名: XxxException)
2) 让这个类继承Exception类(推荐),或者Exception子类
3) 根据Exception的构造方法生成自定义异常类的构造方法
package com.fs; /** * 学号不存在的异常 * */ public class StuNoNotExistsException extends Exception{ public StuNoNotExistsException() { } public StuNoNotExistsException(String message) { super(message); } public StuNoNotExistsException(String message, Throwable cause) { super(message, cause); } public StuNoNotExistsException(Throwable cause) { super(cause); } public StuNoNotExistsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } }