1.什么是异常
exception:在程序运行中发生了一些问题,而导致程序中断
a.用户输入的数据不准确
b.工程师的处理业务逻辑考虑不全面
1.2错误Error
a.编译错误:有红叉
b.逻辑错误:测试来发现,自己做单元测试
c.系统错误:访问的文件,资源(我们不管)
2.异常处理的关键字
a.try{}
监视可能会出现异常的代码,被监视的代码出了异常就可以被处理
同一时刻只会出一个异常
被监视的代码效率会低一点
不能单独存在:try+catch try+finally try+catch+finally
b.catch{}
语法:catch(异常类型 异常对象){}
当try中出现了异常,而异常的类型和catch匹配时,那么对应的catch块的代码就会自动执行
c.finally{}:不能单独存在
最终块:无论是否出异常,这里的代码都会执行
解决:资源的关闭(io流的关系,数据库链接的中断)
public static void showFinally(){
try{
int []nums = new int[4];
nums[4] = 10;//写程序的小哥哥的锅
}catch(ArrayIndexOutOfBoundsException exception){
System.out.println("超出范围的数组操作");
}finally{
*//无论异常是否发生,finally都会执行*
System.out.println("finally....");
}
public static void showEnd2(){
try{
int []nums = new int[4];
//nums[4] = 10;//写程序的小哥哥的锅
nums = null;
System.out.println(nums.length);//空指针异常
}catch(ArrayIndexOutOfBoundsException exception){
System.out.println("超出范围的数组操作");
}
*//如果没有异常,或者异常被处理掉,当前代码能正确执行
//否则,不行*
System.out.println("end....");
}
}
public static void showFinally2(){
try{
int []nums = new int[4];
//nums[4] = 10;//写程序的小哥哥的锅
nums = null;
System.out.println(nums.length);//空指针异常
}catch(ArrayIndexOutOfBoundsException exception){
System.out.println("超出范围的数组操作");
}finally{
*//无论异常是否发生,catch块是否成功的捕获 ,finally都会执行*
System.out.println("finally....");
}
}
d.throw:抛出异常
语句:throw 异常对象;
抛给调用方
/**
* 获取从2到num的所有偶数
* @param num
*/
public static int[] getEvens(int num){
if(num < 2){
*//抛出uncheck异常(运行时),程序不会继续向下执行*
throw new IllegalArgumentException("您输入的数据必须大于等于2...");
}
int []nums = new int[num/2];
int count =0;
for(int i=0,j=2;i<nums.length&j<=num;i++,j+=2){
nums[i] = j;
count ++;
}
return Arrays.copyOf(nums, count);
}
e.throws:放在方法声明上面。告诉调用方用这个方法可能会出xx异常
public void clone() throws CloneNotSoupportException{}
调用方在调用代码的时候必须要处理
/**
* 获取从2到num的所有偶数
* @param num
* @throws Exception 依然留个调用处理
*/
public static int[] getEvensWithThrows(int num) throws Exception{
if(num < 2){
*//抛出checked异常(编译异常),程序不会继续向下执行,要求当前的程序必须要做处理*
throw new Exception("您输入的数据必须大于等于2...");
}
int []nums = new int[num/2];
int count =0;
for(int i=0,j=2;i<nums.length&j<=num;i++,j+=2){
nums[i] = j;
count ++;
}
return Arrays.copyOf(nums, count);
}
}
处理方式:1.最基本的处理
a.将可能会出现异常的代码封装在try{}
b.使用catch块做异常处理
2.预防
public static void type4(){
Scanner input = new Scanner(System.in);
//1.当用户输入的数据是字符串时,不可能异常
System.out.println("请输入被除数:");
String str = input.next();
System.out.println("请输入除数:");
String str2 = input.next();
//2.判断用户输入是否是整数
//2.1 利用正则表达式 \\d{1,} \d:数字(0-9) {1,}:前面的数字最少出现一次,最多不限
boolean isDigit = str.matches("\\d{1,}");
boolean isDigit2 = str2.matches("\\d{1,}");
//2.2 做判断:不过
if(isDigit==false || isDigit2==false){
System.out.println("输入的数据不满足要求");
return;
}
//2.3 如果是数字:Integer.parseInt:将字符串转为整数
int num = Integer.parseInt(str);
int num2 = Integer.parseInt(str2);
//通过判断我们可以避免一些异常的发生
if(num2==0){
System.out.println("除数不能为零");
return;
}
int result = num/num2;
System.out.println(num+" / "+num2+"= "+result);
//这句话执行了,就说明程序是正常的结束
System.out.println("end...");
}
异常
InputMismatchException:用户输入的数据格式不正确
AirthmeticException:工程师的问题
NullPointerException:空指针异常
ex.getMessage():异常对象的getMessage():获取异常信息,但不一定都有信息
ex.printStackTrace():打印异常的堆栈信息
3.异常体系
Throwable:Throwable类是Java语言中所以错误或异常的超类
|-Error
|-Exception:编译异常
|-…
|-RuntimeException:运行时异常
编译异常:checked
特点:
1.在编译时就会约束代码必须处理(在方法中)
a.要么抛出:throws
什么情况丢:用户的数据不满足时,是调用方的问题,丢给调用方
b.要么处理:try-catch
什么情况处理:到main就是最后的机会,必须把握处理的机会
很多情况是用户(计算机的环境)的问题,和程序员小哥哥没有关系(怎么办)
FileNotFoundException
IOException
SQLException
运行时异常 RuntimeException :unchecked异常
特点:
1.不会要求用户一定要处理的
2.异常不发生时,用户根本不知道,而发生时同样中断用户的程序
ArrayIndexOutofBoundsException
NullPointerException
ClassCastException
这个锅一般是程序员小哥哥的问题
4.自定义异常
4.1 定义一个类 extends Exception{}
定义一个类 extends RuntimeException{
}继承自Exception
4.2 构造方法
super(msg):通过构造方法传递信息
4.3 调用
throw new 自定义异常();
throw new 自定义异常(msg);
- 调用Log4j
调用java提供的jar包
从今天开始,我们需要调用第三方包(非jdk自带的包)
5.1 创建一个放包的文件夹lib
java:jar 包
5.2 导包
5.3 使用
a.调用日志
1.利用当前的类对象构建一个日志对象
static Logger logger = Logger.getLogger(TestLog4j.class);
2.需要什么等级信息时,那就用什么方法
logger.info(“这个log4j打印的一个普通信息”);
logger.debug(“这个log4j的一个调试信息”);
logger.warn(“这个警告”);
logger.error(“这个发生异常的信息”);
logger.fatal(“这是灾难”);
小笔记
\d{1,} \d:数字(0-9) {1,}:前面的数字最少出现一次,最多不限
如果是数字:Integer.parseInt:将字符串转为整数
throws:当调用的代码中出现了checked时,main一定要做try-catch处理,不能再丢了