java基础--异常

异常

定义:	不正常就是异常
java.util.InputMismatchException	输入类型不匹配异常
1:	jvm会处理程序中未处理的异常
	a:暂停程序
	b:报错(异常内容【什么异常  原因描述】异常行数 )
2: 不要让jvm去处理异常
3:解决异常的办法:
		处理异常:
			通过大量的if判定来确保程序没有异常,但是用户是万恶之源,永远不知道他到底会做什么。编写的判定逻辑不可能将所有情况囊括进去,程序在执行中如果出现问题,此时由于没有异常处理方案,导致交由jvm处理,jvm处理方法只是暂停程序。
	通过if判定完成的异常校验:代码会显得臃肿,不利于阅读以及维护
	java提供了完整的异常处理方案,可以帮助我们在编写代码过程中,处理程序中的异常信息
	try catch finally trows trow
try-catch
语法结构:
	try{
		有可能出现的异常代码块
	}catch(声明异常){
		异常解决办法
	}
执行顺序:
	a: 执行try块中内容
	b: 如果try块中内容出现异常,执行catch块
	c: 匹配catch中声明的异常信息,如果匹配上则执行catch中的代码块
	d: 继续执行后续代码
	e: 如果catch中的异常没有匹配到,此时交由jvm处理该异常
 catch中的异常类型一定要注意,要能够捕获try中实际出现的异常。如果忘记具体的异常信息可以通过使用Exception去捕获异常信息
 注意:不要在catch中做业务逻辑判定
try-多重catch
语法结构:
	try{
		可能出现的异常的代码块
	}catch(异常1){
		异常解决办法
	}catch(异常2){
		异常解决办法
	}...{
	
	}
执行顺序:
	1. 执行try块,如果出现异常,就会new出当前异常对象,再去逐一			匹配catch中的异常内容
	2.如果匹配上,执行对应的catch中的代码,整个try-catch就执		行结束了
	3. 匹配上,jvm去解决当前异常信息
注意事项:
	a、 在多重catch中一般情况下会在最后一个catch语句中编写 			exception 用来捕获可能未被识别的异常信息
	b、不要在第一个catch中编写父类异常,不然会屏蔽所有子类异常
异常对象的常见方法:
	toString: 当前异常类型以及原因描述
	printStackTrace:打印堆栈信息(异常类型以及原因描述 异常位置) 
	getMessage: 异常原因
package com.mage.exceptio;

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

public class Test {
	public static void main(String[] args) {
		try {
			Scanner sc = new Scanner(System.in);
			System.out.println("输入第一个数:");
			int num1 = sc.nextInt();
			System.out.println("输入第二个数:");
			int num2 = sc.nextInt();
			int result = num1/num2;
			System.out.println("result:"+result);
			
			
		}catch(ArithmeticException e) {
			System.out.println("除数不能为零!大傻子");
			
		}catch(InputMismatchException e) {
			System.out.println("用户输入的数据类型不对");
			
		}catch(Exception e) {
			System.out.println("网络加载问题");
			
		}
		System.out.println("后续代码");
		
	}
	
	
}
try-catch-finally
语法结构:
	try{
		可能出现的异常的代码块
	}catch(异常1){
		异常解决办法
	}catch(异常2){
		异常解决办法
	}...{
	
	}finally{
		//代码块
		关闭资源的代码
	}
执行顺序:
	1. 执行try块
	2. 逐一匹配catch中的异常信息
	3. 匹配上就执行对应catch中的内容
	4.	没有匹配上,jvm去解决当前异常信息
	5.不管有没有匹配成功,都会执行finally中的内容
	finally中一般情况下编写关闭资源的操作
package com.mage.exceptio;

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

public class Test01 {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		try {
			System.out.println("输入第一个数:");
			int num1 = sc.nextInt();
			System.out.println("输入第二个数:");
			int num2 = sc.nextInt();
			int res = num1/num2;
			System.out.println("result:"+res);
			
		}catch(ArithmeticException e) {
			System.out.println("除数不能为零!");
			//System.out.println(e.printStackTrace());
			
		}catch(InputMismatchException  e) {
			System.out.println("输入数据类型不对!");
		}catch(Exception e) {
			System.out.println("网络加载有误");
		}
		finally {
			//一定会执行的
			System.out.println("我是fianlly中的代码");
			sc.close();
			
		}
		System.out.println("执行后续代码");
		
	}
}

jdk1.7后可以使用try-recourse
这个就是对try-catch-finally的改变
可以通过对于流、网络连接对象的创建声明在try()中,后续无须通过使用finally显式的关闭资源
try(资源1,资源2。。。){

}catch(){

}。。。{

}
package com.mage.exceptio;


import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * 
 *     jdk1.7之后对于try-catch-finally的改变
 *     	 可以通过对于流、网络连接对象的创建声明在try的()中,后续无序通过使用finally显式的关闭资源
 *     	try(资源1;资源2.。。。){
 *     		//可能出现的异常信息
 *     	}catch(异常1){
 *     		//解决办法
 *     	}。。。。。{
 *     	
 *     	}
 *     
 *
 */
public class Test02 {
	
	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("请输入第二个数》》》》》");
			//input.close();
			int num2 = input.nextInt();new IllegalStateException 
			
			
			
			int result = num1/num2;
			
			System.out.println(num1+"/"+num2+"="+result);
			input.close();
			
		}catch(InputMismatchException e) {
			System.out.println("输入有误");
		}catch(ArithmeticException e) {
			System.out.println("除数不能为0");
		}catch(Exception e) {//Exception e = new IllegalStateException 
			System.out.println("网络加载有误。。");
		}
		
		System.out.println("后续代码。。。。");
		
		
	}
}

finally的执行位置
测试如何让finally不执行
return 语句不会让finally不执行
finally先于return执行了
代码中存在System.eit()关闭虚拟机可以让finallly不执行,一般不这么干

检查时异常程序编译就会报错 (叫检查时异常)
运行时异常需要在执行时才会报错(运行时异常)
异常分类

图片

throw-throws
1. throw声明当前代码块中可能出现的异常信息,并且将当前异常信息抛出给调用者,对于调用者而言,通过try-catch捕获异常不管当前异常交由jvm解决
2. throw会导致当前程序中断掉,后续代码不会执行
3. throws在方法外对外抛出某个异常,调用者解决当前异常。main方法中对外抛出的异常都由jvm做,
throws抛出异常是异常解决的一种办法定义在方法外部,形式参数的后面,可以跑出多个异常,通过“,”分割
4. throw定义在方法内部,声明当前方法可能出现的异常信息,可以导致程序中断一般会将throw和throw一起使用,throw声明的异常是检查时异常,需要和throws一起使用但是throws可以单独使用。
自定义异常

图片

自定义异常:
	1.jdk中提供的异常信息不满足目前的使用
	2.如何定义?
		a、先声明一个自定义异常类
		b、 继承Exception
		c、 编写两个构造器,一个空,一个带字符串的构造器
一、
package com.mage.exception;

public class AgeException extends Exception{
	
	
	public AgeException() {
	}
	
	// 当前异常的原因描述
	public AgeException(String msg) {
		super(msg);
	}
	
}
二、
public class Test10 {
	public static void main(String[] args) /* throws AgeException */{
		
		
		User u = new User();
		try {
			u.setAge(-1);
			
		}catch(AgeException e) {
			//System.out.println("年龄有误。。。");
			System.out.println(e.getMessage());
		}
		System.out.println(u);
		
	}
}
class User{
	private int age;
	public User() {
		// TODO Auto-generated constructor stub
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) throws AgeException{
		if(age<0||age>150) {
			throw new AgeException("年龄输入有误");
		}
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [age=" + age + "]";
	}
	
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值