Java异常处理机制笔记

什么是异常

非正常的情况
在程序运行过程中,发生的异常情况,导致程序意外终止的情况。

如何处理异常

在Java中,把异常信息封装程朗一个类,当出现了问题,就会创建异常类对象并抛出异常相关信息(如异常出现的位置、原因等)

1. 遇到异常,检查代码,修改代码,解决异常
2. 通过if判断,来解决代码中可能出现的异常。代码结构臃肿,不利于阅读和维护

3. Throwable类(Java语言中所有错误和异常的超类)
**error:**发生了错误,只能修改代码,不能使用异常处理机制来解决
exception: checked异常/编译异常:在java程序的编写过程中,发生的异常。代码会有红色波浪线
非checked异常/runtimeException:运行期异常,在java程序运行过程中,发生的异常
总结:runtimeException和它的子类都是运行异常,其他都是编译异常

常见异常处理机制有哪些

  • jvm默认有一套异常处理
    JVM的处理方式只能打印出异常信息,不能个性化操作
    JVM如何处理异常的
    在这里插入图片描述
    总结:当JVM处理异常的时候,异常之后的代码不会执行

  • 使用try-catch:异常捕获(快捷键 alt+shift+R+z组合键)

try{
//可能会发生异常的代码
}catch(异常的类型 变量名){//Exception e
//处理异常的代码
//e.getMessage();打印异常信息
//e.printStackTrace();打印异常的堆栈信息:什么异常,异常常量
}

在这里插入图片描述

  • 多重catch
try{
//可能发生异常的代码
}catch(异常类型1 变量名1){
//处理异常
}catch(异常类型2 变量名2){
//处理异常
}catch(异常类型3 变量名3){
//处理异常
}

特点:1、catch时有顺序的,先执行子类的匹配,再执行父类的匹配
2、catch一次只能执行一个
3、多重catch的变量名同名不影响

  • try-catch-finally
    finally:不管try-catch是否发生异常,都会输出finally中的内容
    应用场景:IO流 :打开/关闭;连接数据的操作:打开连接/关闭连接
try{
//可能发生异常的代码
}catch(异常类型1 变量名1){
//处理异常
}catch(异常类型2 变量名2){
//处理异常
}catch(异常类型3 变量名3){
//处理异常
}finally{
//不管有没有异常都会执行
}


1、如果try中的代码发生了return,如果程序正常执行,先执行return之前的,然后再执行finally中的
2、如果try中的代码发生了异常,先执行catch中的代码,然后执行finally中的代码,然后结束程序,发生异常的位置后面的代码不执行。
3、finally 在遇到程序强制结束退出(System.exit(0);)时,是不会发生的。
return一定是最后执行,fianlly不执行的唯一情况:system.exit(0);

  • 声明异常throws
    定义:告诉方法的调用者,该方法可能会发生异常,只是声明了异常,并没有处理。提醒调用者需要去处理异常。
//声明异常一定是写在方法()后
访问修饰符 返回值类型 方法名(形参列表)throws 异常类型{};

声明异常后,2种方式处理:
1、使用try-catch捕获异常
2、再继续throws,交给jvm处理
声明异常的方式:
1、throws+编译时异常:必须处理异常,否则程序报错
2、throws+运行时异常:调用者可以处理,也可以不处理

  • Exception的所有的异常分类如何划分
    运行时常见的异常
    在这里插入图片描述
    常见的编译的异常
    在这里插入图片描述
    **注:**如果调用方法的时候,方法出现红色波浪线,而且参数传递和方法名都没有问题,那么一定是编译异常
  • 抛出异常throw
    写在方法中,表示一定发生了异常,把该异常抛出,让调用者去处理该异常。
    语法:throw new 异常类型(异常提示信息);
  • throw和throws有何区别
    1、定义不同:throw 异常对象/throws 异常类型
    2、定义位置不同:throw 方法体中/throws 在方法列表后面
    3、作用不同:throw 抛出异常/throws 声明异常,可能有也可能没有
    在这里插入图片描述
package com.m.demo;

public class Person {
	private String name;
	private int age;
	private char sex;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) throws Exception {
		if(age>=16&&age<=32) {
			this.age = age;
		}else {
			throw new Exception("内容超出范围");
		}
		
	}
	public char getSex() {
		return sex;
	}
	public void setSex(char sex) throws Exception {
		if(sex=='男'||sex=='女') {
			this.sex = sex;
		}else {
			throw new Exception("输入不对");
		}
		
	}
	
}

class demo{
	public static void main(String[] args)  {
		Person p=new Person();
		try {
			p.setAge(70);
			
		} catch (Exception e) {
			
			e.printStackTrace();
		}
		
	}
}

程序强制退出和return的区别

强制退出不会执行finally中的代码,return会执行

异常方法重写

1、如果父类定义了异常,那么子类可以定义,也可以定义部分,也可以不定义
2、如果父类不抛异常,那么子类也不可抛异常
3、子类抛异常范围不能比父类抛异常范围广

自定义异常

public class 自定义异常类名 extends Exception/  ...{
public 自定义异常类名(){
super();
}
public 自定义异常类名(String s){
super(String s);
}
}

Log4j日志的使用

  1. 导入Log4j的jar包
  2. 创建log4j的 配置文件:log4j.properties
  3. 创建log4j的对象(apache)
Logger logger=Logger.getLogger(Test.class);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值