肖sir__Java异常处理__16

1.1 异常介绍
什么是异常?
例如,
现实生活中的异常: 你计划周末郊游,计划从家里出发→到达目的→游泳→烧烤→回、家。但天有不测风云,当你准备烧烤时候突然天降大雨,只能终止郊游提前回家。那么“天降大雨”就是一种异常情况。计算机程序得异常:比如你计划周末约暗恋已久的对象出来看电影,对方已经答应了,你打开手机某应用去购买了电影票显示已经支付成功,但是由于网络通信故障在某应用的后台出票失败了。那么“出票失败”就是一种异常。
由于现实生活中或者计算机程序中总会有一些异常的情况发生,那么在现实计划中还是在程序的设计中对于异常情况的处理就显得格外的重要了。
 
1.2 异常介绍
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误
java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出jva.lang.ArithmeticException 的异常。
异常发生的原因分类:非法数据,文件不存在,网络连接中断,JVM内存溢出等等。这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。
 
1.3 异常介绍
异常的三种类型:
检查性异常:检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
在Java中定义了两种类型的异常和错误。
JVM(Java虚拟机) 异常:由 JVM 抛出的异常或错误。例如:NullPointerException
类,ArrayIndexOutOfBoundsException 类,ClassCastException 类。
程序级异常:由程序或者API程序抛出的异常。例如 IllegalArgumentException 类,
IllegalStateException 类
1.4 异常介绍
所有的异常类是从 java.lang.Exception 类继承的子类。
Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。
Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。
Error 用来指示运行时环境发生的错误。
例如,JVM 内存溢出。一般地,程序不会从错误中恢复。
异常类有两个主要的子类:IOException 类和 RuntimeException 类。
2.1 Java 内置异常类
Java 语言定义了一些异常类在 java.lang 标准包中。
标准运行时异常类的子类是最常见的异常类。
由于 java.lang 包是默认加载到所有的 Java 程序的,所以大部分从运行时异常类继承而来的异常都可以直接使用。

 

 2.2  Java中常见的 Error 和 Exception:

1)运行时异常(RuntimeException):
NullPropagation:空指针异常;
ClassCastException:类型强制转换异常
IllegalArgumentException:传递非法参数异常
IndexOutOfBoundsException:下标越界异常
NumberFormatException:数字格式异常
2)非运行时异常:
ClassNotFoundException:找不到指定 class 的异常
IOException:IO 操作异常
3)错误(Error):
NoClassDefFoundError:找不到 class 定义异常
StackOverflowError:深递归导致栈被耗尽而抛出的异常
OutOfMemoryError:内存溢出异常
 
2.3 Java 内置异常类
 

 

 

3.1 捕获异常
Java使用try和catch关键字捕获异常。
try/catch 语法:
try
{
// 程序代码
}catch(ExceptionName e1)
{
//Catch 块
}
说明:try/catch语句包含要捕获异常类型的声明。
当程序代码中发生异常时,try后面的catch块就会被执行。
 
3.2 捕获异常
一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。
多重捕获块的语法如下所示:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
 
说明:该代码段包含了 3 个 catch块。可以在 try 语句后面添加任意数量的 catch 块。
如果程序代码中发生异常,异常被抛给第一个 catch块。如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。如果不匹配,它会被传递给第二个 catch 块。如此,直到异常被捕获或者通过所有的 catch 块
 
4.1 抛出异常
throws/throw 关键字:
如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。也可以使用 throw 关键字抛出一个异常。
例如:方法的声明抛出一个 RemoteException异常:
public class className{
public void deposit(double amount) throws RemoteException{
// 抛出异常
throw new RemoteException();
}
}
 
4.2 抛出异常
一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。
例如,下面的方法声明抛出 RemoteException 和 InsufficientFundsException:
public class className{
public void withdraw(double amount) throws RemoteException,
InsufficientFundsException{
}
}
 
5.1 自定义异常
声明自定义异常
在Java中自定义异常时需要注意下面几点:
所有异常都必须是Throwable 的子类。
如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
自定义的异常类语法:
class MyException extends Exception{
}
只继承Exception 类来创建的异常类是检查性异常类
5.2 自定义异常
自定义异常实例:
写一个程序模拟一个银行账户,可以通过银行卡的号码完成识别,可以进行存钱和取
钱的操作。如果取款时余额不足则抛出异常。
//自定义异常类,继承Exception类
public class InsufficientFundsException extends Exception{
//此处的amount用来储存当出现异常(取出钱多于余额时)所缺乏的钱
private double amount;
public InsufficientFundsException(double amount){
this.amount = amount;
}
public double getAmount(){
return amount;
}
}
 
5.3 自定义异常
自定义异常练习题:
1,比如你计划周末约暗恋已久的对象出来看电影,对方已经答应了,你打开手机某应用去购买了电影票显示已经支付成功,但是由于网络通信故障在某应用的后台出票失败了。那么“出票失败”就是一种异常。请写程序来模拟以上场景,并编写自定义异常来捕获“出票失败”,如果捕获到该异常,则进行通知提示。
 
6.1 finally关键字
finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行。
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
finally 代码块出现在 catch 代码块最后,语法如下:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
 
7.1 Debug断点调试的使用
idea的debug调试快捷键
F9
resume programe 恢复程序
Alt+F10
show execution point 显示执行断点
F8
Step Over 跳到下一步
F7
Step Into 进入到代码
Alt+shift+F7 Force Step Into 这个是强制进入代码
Shift+F8
Step Out 跳到下一个断点
Atl+F9
Run To Cursor 运行到光标处
ctrl+shift+F9 debug运行java类
ctrl+shift+F10 正常运行java类
alt+F8 debug时选中查看值
 
8.1 Logging记录日志
场景回顾:通常我们在有问题的代码中使用System.out.println方法在控制台打印消息,来帮助观察程序运行的操作过程。如果使用System.out.println方法,一旦发现问题的根源,就要将这些语句从代码中删去。如果接下来又出现了问题,就需要再插入几个调用System.out.println方法的语句,如此反复,增加了工作量。如果不删除System.out.println,随之增加,从而会对整个系统的运行带巨大的性能以及安全隐患。
为解决上述问题,Java中建议使用日志用来记录程序的运行轨迹,Java 自带的日志工
具类 java.util.logging
 
8.2 Logging记录日志
jDK Logging 把日志分为如下表 7 个级别,等级依次降低:
Logger 的默认级别是 INFO,比 INFO 级别低的日志将不显示。Logger 的默认级别
定义在 jre 安装目录的 lib 下面:
java.util.logging.ConsoleHandler.level = INFO
 
8.3 Logging记录日志
JDK Logging日志使用实例:
public class Test {
private static Logger log = Logger.getLogger(Test.class.toString());
public static void main(String[] args) {
// 级别依次升高,后面的日志级别会屏蔽之前的级别
log.finest("finest");
log.finer("finer");
log.fine("fine");
log.config("config");
log.info("info");
log.warning("warning");
log.severe("server");
}
}
 
8.4 Logging记录日志
Java中常用日志框架:
无具体实现的抽象门面框架,如:Commons Logging、SLF4J
具体实现的框架,如:Log4j,Log4j2,Logback,Jul
在日志框架中日志的级别划分:从小到大
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
 
9.1 断言
断言介绍:
它主要使用在代码开发和测试时期,用于对某些关键数据的判断,如果这个关键数据
不是你程序所预期的数据,程序就提出警告或退出。Java中断言关键字assert。
断言语法:
1:assert expression;
expression代表一个布尔类型的表达式,如果为真,就继续正常运行,如果为假,程
序退出
2:assert expression1 : expression2;
expression1是一个布尔表达式,expression2是一个基本类型或者Object类型,如果expression1为真,则程序忽略expression2继续运行;如果expression1为假,则
运行expression2,然后退出程序。
9.2 断言
断言实例:
public static void main(String[] args) {
String dcs = "";
assert !"".equals(dcs): "字符串为空";
dcs = "duoceshi";
System.out.println(dcs);
}
说明:IDEA中断言默认是关闭的,如果要开启则需要在程序运行时加上:-ea 参数

 

 ================================================

 

(1)异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。

(2)异常现象:

√所需文件找不到
√网络连接不通或中断

√算术运算错(被零除...)

√数组下标越界
√装载一个不存在的类或者对null对象操作√类型转换异常
(3)Java提供异常处理机制。它将异常处理代码和和业务代码分离,使程序更优雅,更好的容错性,高键壮性。
(4)Java的异常处理是通过5个关键字来实现的:

try、

catch、

finally、

throw、

throws

--------------------------------------------------------------------------

(2) try详解:

try-catch执行情况
情况1: try块中代码没有出现异常
不执行catch块代码,执行catch块后边的代码
情况2: try块中代码出现异常,catch中异常类型匹配(相同或者父类)
Java会生成相应的异常对象,Java系统寻找匹配的catch块,执行catch块代码,执catch块后边的代码。try块中尚未执行的语句不会执行。
情况3: try块中代码出现异常,catch中异常类型不匹配
衣执行catch块代码,不执行catch块后边的代码,程序会中断运行
catch块中如何处理异常
其中一种方式:自定义内容输出

 

(2)throw和throws的区别:(1)位置不同:
throw:方法内部
throws:方法的签名处,方法的声明处(2)内蓉不同:
throw+异常对象throws+异常的类型(3)作用不同:
throw: 制造异常出现的源头,制造异常。
throws:在方法的声明处,告诉方法的调用者,这个方法中可能会出现我声明的过常。然后调用者对这个异常进行处理:要么自己处理要么再继续向外抛出异常。

 
 ======================================================
实例:

 

 

posted @ 2022-10-01 10:47  xiaolehua  阅读(33)  评论(0编辑  收藏  举报