异常
异常概述:异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。简单来说就是程序出现了不正常的情况。异常本质就是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);
}
}