异常【exception】
常见异常举例:
ArrayIndexOutOfBoundsException // 数组越界异常
ClassCastException // 类型转换异常
ClassNotFoundException // 类找不到异常
NullPointerException // 空指针异常 NPE
.....
在面试的时候也会有碰到这样的题,
一、了解异常的概念
.hasNexInt()
// 用来判断输入的是否是整数
**异常是指:**在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。
二、理解java异常处理机制
java异常处理的5个关键字:
捕获异常:
**try(尝试)、**执行可能产生异常的代码
**catch(抓、捉、捕获)、**捕获异常
**finally(最终的)、**无论是否发生异常,代码总能执行
抛出异常:
**throw(抛、扔)、**手动抛出异常
声明异常:
**throws(抛、扔 / 计算机释义:生明)、**声明方法可能要抛出各种异常
三、会捕捉异常
语法:
try{
// 可能会出现异常的代码
}catch(能够捕获的异常类型){
// 处理捕获到的异常
}
1、正常运行 和没加try - catch一样
2、出现【对应】的异常:
如果出现异常,try中的代码不再往下执行,JVM会立刻创建对应的异常对象,然后将此对象传递给catch块中的异常类型参数,进入catch块对异常进行处理。处理完继续执行后续内容。
3、出现【不对应】的异常
在执行try中的代码时,如果出现异常,try中的代码不再往下执行,JVM会立刻创建对应的异常对象,然后将此对象传递给catch块中的异常类型参数,【但如果catch的形参不匹配,则无法传入,也就无法进行异常处理,程序中断(和未添加异常处理一样的效果)】
常见的异常类型
finally:
finally{
// 里面的内容,无论是否出现异常或者异常能否解决,都会执行
}
注意:
①、finally和catch不能单独使用,必须配合try使用。
②、finally 唯一不执行的情况:System.exit(1);退出了JVM
③、如果出现return那么会先执行finally里面的,再执行return
1、try - catch
- finally;
try{
// 可能会出现异常的代码
}catch(异常类型){
// 处理捕获到的异常
}finally{
// 里面的内容,无论是否出现异常或者异常能否解决,都会执行
}
// 注意:finally和catch不能单独使用,必须配合try使用
2、try - finally;
try{
// 可能会出现异常的代码
}finally{
// 里面的内容,无论是否出现异常或者异常能否解决,都会执行
}
多重catch块使用:
快捷键:选中可能出现异常的代码,然后Alt+Shift+z
它的应用场景:需要对不同的异常进行不同的处理操作时,需要多重catch,但在很多场景下,为了省事,会直接捕获一个Exception父类
try{
// 可能会出现异常的代码
}catch(异常类型1){
// 对应处理代码
}catch(异常类型2){
// 对应处理代码
}
类似于多重if,只要有一个异常类型满足,剩下的异常类型捕获不会执行!
示例:
public class Demo1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try {
System.out.print("请输入被除数:");
int num1 = input.nextInt();
System.out.print("请输入除数:");
int num2 = input.nextInt();
// 计算结果
int result = num1 / num2;
System.out.println(num1+"/"+num2+" 的结果为:"+result);
} catch (InputMismatchException e) {
System.out.println("输入格式不正确!必须是整数!");
e.printStackTrace();
} catch (ArithmeticException e) {
System.out.println("除数不能为0!");
e.printStackTrace();
}catch (Exception e) { // 异常体系中最大的类型 多态
System.out.println("出现了未知错误!");
}
System.out.println("感谢您的使用!程序结束!");
}
}
多重catch块: 只要有一个匹配不成功,后续的不在执行(catch块的顺序要注意好)
四、会抛出异常
**throw **接异常对象,抛出自定义的或者更全面的异常信息对。
**throws **接异常类型,标注在方法声明上的,从来声明此方法可能出现的异常类型
自定义异常:
public class 自定义异常类型 extends Exception{
// 编写带参构造
// 编写无参构造
}
五、了解java异常体系结构
Throwable、可抛的
Error:(程序无法修复,必须人工修改)
Exception:(可通过代码/程序进行动态修复的)
Checked受检异常(checkedException):在编写的时候,就必须提前解决此问题
Runtime运行时异常(RuntimeException):当你编写代码的时候,不会直接提示你进行解决,同时这些异常也是在程序运行是可能出现的(InputMismatchException ArthimaticException ArrayIndexOutOfBoundsException …都属于运行时异常))
异常处理原则:
1、异常处理与性能
2、异常只能用于非正常情况
3、不要将过于庞大的代码块放在try中
4、在catch中指定具体的异常类型
5、需要对捕获的异常做处理
六、使用log4j(log for java)记录日志
程序中的日志:记录程序运行过程中的状态信息(一般会记录重要信息),也是解决问题的一种手段(推荐在大型项目中使用日志进行debug而不是工具debug)。
xxx.log
-
导包 将jar包变成"小奶瓶"
-
配置log4j (配置输出日志的格式和位置等) 通过log4j.properties 放在src目录下
-
使用API 进行日志记录
Logger logger = Logger.getLogger(字节码对象:类名.class);
logger.info();
logger.error();
logger.debug();