异常处理

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);

  1. 调用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处理,不能再丢了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值