欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

异常处理机制

程序员文章站 2024-03-24 23:27:10
...

Exception

》什么是异常?
	不正常就是异常
 	*常见的异常:java.util.InputMismatchException	输入类型不匹配异常	程序运行时报异常错误	
	1、jvm会处理程序中未处理的异常;
		a:暂停程序
		b:报错(异常内容【异常类型	原因描述】	出异常的代码行数)
	2、不要让jvm去处理异常

》之前我们处理异常的方法:
		通过大量的if判断来确保程序没有异常,但用户是万恶之源,程序员永远不知道用户会做什么所以编写的逻辑
	判断不可能将所有的情况都囊括进去,程序在执行的过程中如果出现问题,出现异常此时没有异常处理机制,导致会
	将异常交给jvm处理,而jvm处理的方式是	暂停程序报错——>不能忍受
		并且通过if判定完成异常校验:代码臃肿,不利于阅读以及维护

	*java提供了完整的异常处理方案,可以帮助我们在编写代码的过程中,处理程序中出现的异常
	 五个关键字:try	catch	finally   throw   throws

try-catch

》try-catch:
	java中的异常机制
	*语法结构:
		try{
			//可能出现的异常的代码块
		}catch(声明异常){
 			//异常解决方法
		}
	*执行顺序:
		1:执行try块中的内容
		2:如果try块中的内容出现异常,执行catch块
		3:匹配catch声明的异常,如果匹配上,则执行catch块中的异常解决方法
		4:继续后续代码
		5:如果不匹配catch声明的异常,那么此时将异常交给jvm处理——>程序停止,报错
	*catch:
		catch中的类型一定要注意,要能够捕获到try块中实际出现的异常,如忘记具体的异常名可以用Exception
		去捕获异常信息

	*tips:不要在catch块中做业务逻辑判断
public class Test01 {
	public static void main(String[] args) {
		try {
			System.out.println(10/0);//new AirthmeticException();		出异常AirthmeticException
		}catch(Exception e) {//Exception e = new AirthmeticException();
			System.out.println("输入数据有错。。。。");
		}
		
		System.out.println("后续代码。。。。");
	}
}

try-catch-catch…

》try-catch-catch...:
 	*语法结构:
 		try{
 			//可能出现异常的代码
 		}catch(异常1){
 			//异常1解决方法
 		}catch(异常2){
			//异常2的解决方法
		}catch(异常3){
			//异常3的解决方法
 		}......{
			//异常n的解决方法
		}
 
	*try多层catch执行顺序:
 		1:执行try块,如果出现异常,new出当前异常
		2:逐一匹配catch中的异常内容
		3:如果匹配上,执行相应的catch中的代码,整个try-catch语句执行完毕
 		4:如果匹配不上,jvm解决当前异常信息
	*注意事项:
		1:在多重catch中一般情况下会在最后一个catch语句中编写Exception用来捕获可能出现的异常
		2:不要再第一个catch中编写父类异常,不然会屏蔽所有子类异常

	》异常对象的常见方法:
		*toString():输出异常类型以及原因描述
		*printStackTrace():打印堆栈信息、异常类型、原因描述以及异常位置
		*getMessage:异常原因
public class Test02 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入被除数》》》》》");
		
		try {
			int num1 = input.nextInt();
			System.out.println("请输入除数》》》》》");
			int num2 = input.nextInt();
			int result = num1/num2;
			System.out.println("计算结果:num1"+num1+"/"+num2+"num2="+result);
		}catch(InputMismatchException e) {
			System.out.println("输入有误");
		}catch(ArithmeticException e) {
			System.out.println("除数不能为0");
		}catch(Exception e) {
			System.out.println("网络加载问题......");
		}
		input.close();
		System.out.println("后续代码");
	}

}

try-catch-finally

》try-catch-finally
 	*语法结构:
		try{
 			//可能出现的代码
		}catch(异常1){
			//异常1处理办法
		}......{
			
		}catch(异常n){
			//异常n处理办法
		}finally{
			//代码块(关闭资源的代码)
		}

	*测试如何让finally代码块不执行:
		return语句不能让finally代码块不执行:finally代码块先于return语句执行
		代码中存在System.exit()可以让finally代码块不执行,但一般不建议这样做

	*执行顺序:
		1:执行try块,如果出现异常,new出当前出现的异常
		2:逐一匹配catch中的异常内容;
		3:如果匹配上,则执行相应的catch块
		4:如果匹配不上,则交给jvm去处理异常信息
		5:不管匹配是否成功,都会执行finally代码块(finally中一般编写关闭资源操作的代码)

	*扩展:jdk1.7之后对于try-catch-finally的改变:
		可以通过对于流网络连接对象的创建声明在try后面的(),后续无需使用finally代码块显示的关闭资源操作
			try(资源1;资源2;.....){
 				//可能出现异常的代码
			}catch(异常1){
				//异常1处理办法
			}......{
				//异常n处理办法
			}
public class Test03 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入被除数》》》》》");
		try {
			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("除数不能为0");
		}catch(Exception e) {
			System.out.println("网络加载问题");
		}finally {
			input.close();
			System.out.println("Finally");
		}
		
		System.out.println("后续代码");
	}
}

throw和throws

》异常机制:
 	throw	throws
	>throw:
		1、throw声明当前代码块中可能存在的异常信息;
			对于调用者而言有两种处理方案:
				*通过try-catch捕获异常
				*不管当前异常,交给jvm处理
		2、throw会导致当前程序中断,后续代码不执行
		
	>throws:
		*throws在方法外对外抛出某个异常,调用者解决当前异常,main方法中对外抛出异常将交于jvm处理
		*throws抛出异常,是异常解决的一种方法,定义在方法的外部,形式参数之后,可以抛出多个异常通过
		“,” 分隔
 		*throw定义在方法内部,声明当前方法可能出现的异常信息,可以导致程序中断。
		*一般会将throw和throws放在一起使用,throw声明的异常是检查时异常需要和throws一起使用
		*但throws也可以单独使用
public class Test04 {
	public static void main(String[] args) throws FileNotFoundException{
		//创建student对象
		Student  stu = new Student();
		stu.setName("万子");
		System.out.println(stu);
		info();
	}
	
	public static void info() throws FileNotFoundException,ArithmeticException{
		new FileInputStream(new File(""));
	}
	
}
class Student{
	private String name;
	private int age;
		
	public Student() {
			
	}
		
	public String getName() {
		return name;
	}
		
	public void setName(String name) {
		this.name = name;
	}
		
	public void setAge(int age)throws FileNotFoundException{
		if(age<0||age>150) {
			throw new FileNotFoundException();
		}
		this.age = age;
	}
		
	public String toString() {
		return "Student[name="+name+",age="+age+"]";
	}
		
}

上一篇: LSTM

下一篇: pytorch nn.LSTM()参数详解