异常:

异常:

定义:

简而言之代码中的不正常就是异常。

继承关系:

在这里插入图片描述

jvm处理:

jvm会处理程序中未处理的异常:

  • a:暂停程序

  • b:报错(异常内容【什么异常 原因描述】 异常行数 )

    最好不要让jvm去处理异常

异常处理:

(1)** 通过大量的if判定来确保程序没有异常; **但是用户是万恶之源,永远无法知晓他到底会做什么。编写的判定逻辑不可能将所有情况都囊括进去,缺点: 代码臃肿、不利于阅读以及维护

(2)try-cathch-finally

(3)throw

(4)throws

(5)自定义异常

try-catch:

1.语法结构:

try{

//有可能出现异常的代码块

}catch(声明异常){

异常解决办法

}

2.执行顺序:

​ 1:执行try块中的内容

​ 2:如果try块中内容出现异常,执行catch块

​ 3:匹配catch中声明的异常信息 ,如果匹配上,则执行catch中的代码

​ 4:继续执行后续代码

​ 5:如果catch中的异常信息没有匹配到 那么此时交由jvm处理该异常

3.catch:

​ 1:中的类型一定要注意 要能够捕获到try快中实际出现的异常信息 如果忘记了具体的异常信息可以通过使用

​ 2:Exception去捕获异常信息

4.注意:

​ 1:不要在catch块中做业务逻辑判定

代码1分析:
package com.mage.exception;

/**
 * 
 * @author 大萌
 *try-catch:
 */
public class test01 {

	public static void main(String[] args) {
		try{
			System.out.println(1/0);
		}catch(ArithmeticException e){
			System.out.println("除数不为零");
			
		}
        System.out.println("我是try-catch外的代码");
	}

}

运行结果:

在这里插入图片描述

try-catch-catch…:

1.语法结构:

try{

//可能出现异常的代码段

}catch(异常1){

//异常 的解决办法

}catch(异常2){

//异常 的解决办法

}…{

}

2.try多层catch执行顺序:

1:执行try块 如果出现异常 new出当前异常对象

2:逐一匹配catch中的异常内容

3:如果匹配上 执行对应的catch中的代码 整个try-catch执行结束

4:如果匹配上 jvm去解决当前异常信息

3.注意事项:

1:在多重catch中一般情况下会在最后一个catch语句中编写exception 用来捕获可能未被识别的异常信息

2:不要再第一个catch中编写父类异常 屏蔽所有子类异常

4.异常对象的常见方法:

1:toString: 当前异常类型以及原因描述

2:printStackTrace: 打印堆栈信息 异常类型以及原因描述 异常位置

3:getMessage:异常原因

代码2分析:
package com.mage.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

public class test02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
      Scanner input =new Scanner(System.in);
      try{
      System.out.println("请输入第一个数:");
      int num1=input.nextInt();
      System.out.println("请输入第二个数:");
      int num2=input.nextInt();
      int result=num1/num2;
      System.out.println("result="+result);
      }catch(InputMismatchException e){
    	  System.out.println("输入数据不合理");
      }catch(ArithmeticException e){
    	  System.out.println("除数不为零");
      }catch(Exception e){
    	  System.out.println("网络错误");
      }
      System.out.println("后面的代码");
	}

}

执行结果:
1.没有发生异常:

在这里插入图片描述

2.发生异常:

在这里插入图片描述

try-catch-finally:

1.语法结构:

try{

//可能出现异常的代码

}catch(异常1){

//处理办法

}…{

}finally{

//代码块

关闭资源的代码

}

代码3分析:
package com.mage.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * try-catch-finally:
 * @author 大萌
 *
 */
public class test03 {

	public static void main(String[] args) {
	      Scanner input =new Scanner(System.in);
	      try{
	      System.out.println("请输入第一个数:");
	      int num1=input.nextInt();
	      System.out.println("请输入第二个数:");
	      int num2=input.nextInt();
	      int result=num1/num2;
	      System.out.println("result="+result);
	      }catch(InputMismatchException e){
	    	  System.out.println("输入数据不合理");
	      }catch(ArithmeticException e){
	    	  System.out.println("除数不为零");
	      }catch(Exception e){
	    	  System.out.println("网络错误");
	      }finally{
	    	  System.out.println("finally的代码");
			
	      }
执行结果:

1.没有发生异常:
在这里插入图片描述

2.发生异常:
在这里插入图片描述

小结:

1.无论代码是否发生异常,finally{}中的语句都会执行;

finally:

1.测试如何让finally不执行:

​ (1)retrun 语句不会让finally不执行

​ (2)finally先于return语句执行

​ (3)代码中存在System.exit() 可以让finally不执行 但是一般不这么干

2.执行顺序:

​ (1)执行try块 如果出现异常 new出当前异常对象

​ (2)逐一匹配catch中的异常内容

​ (3)如果匹配上 执行对应的catch中的代码

​ (4)如果未匹配上 jvm去解决当前异常信息

​ (5)不论是否匹配成功 都会执行finally中内容

3.注意:

​ (1)finally中一般情况下编写关闭资源的操作

4.try-catch-finally的改变:

1.jdk1.7之后,可以通过对于流、网络连接对象的创建声明在try的()中,后续无序通过使用finally显式的关闭资源

try(资源1;资源2.。。。){

//可能出现的异常信息

}catch(异常1){

//解决办法

}。。。。。{

}

代码4分析:
package com.mage.exception;

import java.util.InputMismatchException;
import java.util.Scanner;
/**
 * 
 * @author 大萌
 *
 */
public class test04 {

	public static int main(String[] args) {
		// TODO Auto-generated method stub
      Scanner input =new Scanner(System.in);
      try{
      System.out.println("请输入第一个数:");
      int num1=input.nextInt();
      System.out.println("请输入第二个数:");
      int num2=input.nextInt();
      int result=num1/num2;
      System.out.println(num1+"/"+num2+"="+result);
      //System.exit(0);关闭程序,finally不会执行
      return 1;
      }catch(InputMismatchException e){
    	  System.out.println("输入数据不合理");
      }catch(ArithmeticException e){
    	  System.out.println("除数不为零");
      }catch(Exception e){
    	  System.out.println("网络错误");
      }finally{
    	  System.out.println("finally的代码");
    	  input.close();
      }
      return 2;
    
	}
}

运行结果:在这里插入图片描述
代码5分析:
  1. jdk1.7之后,可以通过对于流、网络连接对象的创建声明在try的()中,后续无序通过使用finally显式的关闭资源
package com.mage.exception;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.InputMismatchException;
import java.util.Scanner;

public class test05 {
	public static void main(String[] args) {
		
     
      try(Scanner input = new Scanner(System.in);
				InputStream is = new FileInputStream(new File(""))){
      System.out.println("请输入第一个数:");
      int num1=input.nextInt();
      System.out.println("请输入第二个数:");
      int num2=input.nextInt();
      int result=num1/num2;
      System.out.println(num1+"/"+num2+"="+result);
     
      }catch(InputMismatchException e){
    	  System.out.println("输入数据不合理");
      }catch(ArithmeticException e){
    	  System.out.println("除数不为零");
      }catch(Exception e){
    	  System.out.println("网络错误");
      }
    
	}
	
}

运行结果:

在这里插入图片描述

throw和throws:

1.throw:

​ (1)throw 声明当前代码块中可能存在的异常信息 并且将当前异常信息抛出给调用者。

​ (2)对于调用者而言 通过try-catch捕获异常

​ (3)不管当前异常交由jvm解决

​ (4)throw 定义在方法内部,声明当前方法可能出现的异常信息 可以导致当前程序中断 后续代码不执行

2.throws:

​ (1)throws 在方法外对外抛出某个异常,调用者解决当前异常。main方法中对外抛出的异常全部都交由jvm做。

​ (2)throws抛出异常 是异常解决的一种办法定义在方法的外部 形式参数后 可以抛出多个异常通过","分割

3.注意:

​ (1)一般会将throws和throw在一起使用,throw 声明的异常是检查时异常需要和throws一起使用

​ (2)但是throws可以单独使用

代码6分析:
package com.mage.exception;

import java.io.FileNotFoundException;

public class test06 {
	public static void main(String[] args) throws FileNotFoundException {
	People p=new People();
//	 try{
//	p.setAge(11);
//	 }catch(FileNotFoundException e){
//		 System.out.println(e.getMessage());
//	 }
//	}
    p.setAge(11);
	}
}
class People{
	private int age;

	public int getAge() {
		return age;
	}

	public void setAge(int age) throws FileNotFoundException {
		if(age<0||age>100) {
			throw new FileNotFoundException();//异常中断
		}
		this.age = age;
	}

	@Override
	public String toString() {
		return "People [age=" + age + "]";
	}
	
}

自定义异常:

1.如何自定义异常:

​ (1)声明一个自定义异常类

​ (2)继承Exception

​ (3)编写两个构造器 一个空 一个带字符串的构造器

代码7分析:
1.自定义异常类:
package com.mage.exception;
/**
 * 
 * @author 大萌
 *
 */
public class AgeException extends Exception {
	public AgeException() {
	}
	
	// 当前异常的原因描述
	public AgeException(String msg) {
		super(msg);
	}
}
2.test类:
package com.mage.exception;
import java.io.FileNotFoundException;

public class test07 {
	public static void main(String[] args) throws AgeException {
		People p=new People();
//		try {
//			p.setAge(-1);
//			
//		}catch(AgeException e) {
//			//System.out.println("年龄有误。。。");
//			System.out.println(e.getMessage());
//		}
//		System.out.println(p);
//	   
	}
	}
	class People{
		private int age;

		public int getAge() {
			return age;
		}

		public void setAge(int age) throws AgeException {
			if(age<0||age>100) {
				throw new AgeException();//异常中断
			}
			this.age = age;
		}

		@Override
		public String toString() {
			return "People [age=" + age + "]";
		}
		
	}



处理顺序图:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值