java 异常

异常

异常概述:异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。简单来说就是程序出现了不正常的情况。异常本质就是Java当中对可能出现的问题进行描述的一种对象体现。

常见的异常
1.除数不能为0异常(ArithmeticException)
2.空指针异常(NullPointException)
3.数组越界异常(ArrayIndexOutOfBoundsException)
4.类型转换异常(ClassCastException)
异常分类

Error:称为错误,由Java虚拟机生成并抛出,程序对其不做处理。
Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示的声明或捕获。
RuntimeException:运行时期异常,又称为非受检异常,RuntimeException及其所有子类都是运行时期异常。
编译时期异常:不是继承自RuntimeException的Exception的子类都成为编译时期异常。

异常的处理

不做任何处理
异常将会交由虚拟机来处理而虚拟机的处理方式是:把异常的名称,异常出现的位置,异常原因,等信息输出打印在控制台,并同时将 程序停止执行。
自己处理异常
1.try…catch…
2. try…catch…finally
3. throws抛出异常
单个异常的处理
try…catch…finally的处理格式:
try{
//放置程序可能出现问题的代码
}catch(异常类 异常名){
//这里放置异常处理的代码
} finally{
//释放资源 这里的代码块总是回被执行,除非是遇到了System.exit终止当前运行的Java虚拟机
}

多个异常的处理
格式:try{

}catch(异常类名 变量名) {

}catch(异常类名 变量名) {

} catch…
排列catch 语句的顺序:先子类后父类 如果顺序是先父类再子类那么,发生异常时因为Java的多态特性异常会被父类吸收处理,那么后面的子类永远都不会运行
发生异常时按顺序逐个匹配
只执行第一个与异常类型匹配的catch语句
throws抛出异常
在定义一个方法的时候可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用者进行处理。
throws使用格式
[修饰符] 返回值类型 方法名(参数列表) [throws 异常类1,异常类2…]{
}
如果一个方法声明的是编译时期异常,则在调用这个方法之处必须处置这个异常(谁调用谁处理)。
重写一个方法时,它所声明的异常范围不能被扩大。

	public class Test05 {
		public static void main(String[] args) {
			try {
				calc();
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			System.out.println("00000000000000000");
			
		}
		
		public static int calc() throws ArithmeticException{
			int a = 10;
			int b = 0;
			int result = a/b;
			return result;
		}
	
	}
throw

throw和throws的区别
throws用在方法声明后面,跟的是异常类名,throw用在方法体内,跟的是异常对象名。
throws可以跟多个异常类名,用逗号隔开,throw只能抛出一个异常对象名。
throws表示抛出异常,由该方法的调用者来处理,throw表示抛出异常,由方法体内的语句处理。
throws表示出现异常的一种可能性,并不一定会发生这些异常,throw则是抛出了异常,执行throw则一定抛出了某种异常。

public class ExceptionTest02 {
	public static void main(String[] args) {
		String s = new String(new byte[] {11,22,33,44}, -1, 3);
		System.out.println(s);
		try {
			calc();
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("go on");
	}

	private static void calc() throws CloneNotSupportedException {
		int a = 10;
		int b = 0;
		// throws处理异常:
//		if (b != 0) {
//			System.out.println(a / b);
//		}
		
		// throw处理异常:
		if (b == 0) {
			throw new CloneNotSupportedException("除数不能为0");
		}
		System.out.println(a / b);
		
	}
}
Thowable

Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,
才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。

成员方法

public String getMessage():返回此 throwable 的详细消息字符串
public String toString():获取异常类名和异常信息。
public void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。
public void printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查阅。
	public class ExceptionDemo03 {
		public static void main(String[] args) throws FileNotFoundException {
	//		Throwable throwable = new NullPointerException();
			Throwable throwable = new ArithmeticException("除数不能为0");
			String message = throwable.getMessage();
	//		System.out.println(message);
			
			
	//		System.out.println(throwable.toString()); // java.lang.ArithmeticException: 除数不能为0 
			
			// public void printStackTrace():获取异常类名和异常信息,以及异常出现在程序中的位置。
	//		throwable.printStackTrace(); 
			
			// public void printStackTrace(PrintStream s):通常用该方法将异常内容保存在日志文件中,以便查阅。 
			
	//		throwable.printStackTrace(new PrintWriter("a.txt"));
			StackTraceElement[] stackTrace = throwable.getStackTrace();
			for (int i = 0; i < stackTrace.length; i++) {
				System.out.println(stackTrace[i].getMethodName() + "|" + stackTrace[i].getClassName() + "|" + stackTrace[i].getLineNumber() + "|" + stackTrace[i].getFileName()) ;
			}
			
			
			
		}
	}
自定义异常
public class ExceptionDemo11 {
	public static void main(String[] args) {
		
		boolean checkIDCard = false;
		try (Scanner input = new Scanner(System.in);){
			String id = input.next();
			checkIDCard = CheckUtils.checkIDCard(id);
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
		if (checkIDCard) {
			System.out.println("合法");
		} else {
			System.out.println("非法身份证");
		}
	}
}

class CheckUtils {
	
	private CheckUtils() {}
	
	public static boolean checkIDCard(String idCard) throws IDCardException {
		if (!idCard.matches("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])")) {
			throw new IDCardException("身份证不满足要求!!!!" + idCard);
		}
		return true;
	}
}

class IDCardException extends RuntimeException {

	private static final long serialVersionUID = 392084157998377850L;
	
	public IDCardException() {}
	
	public IDCardException(String msg) {
		super(msg);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值