一、概念
异常:程序运行过程中出现的非正常的情况。
异常处理:当异常出现时,执行预先准备好的程序。
异常处理必要性:减少用户的损失、同时也减少给用户带来的不必要的麻烦;也可以利用异常处理给与用户一些提示。
二、异常的分类
Throwable:Java语言中的异常或是错误的父类,位于 java.lang 包中。
(1) 构造方法
a. Throwable() :无参数的构造方法
b. Throwable(String message):带有异常信息的构造方法
(2) 成员方法:
a. String getMessage():获取字符串类型异常信息
注意:为用户做提示信息而设置的方法。
b. void printStackTrace():打印输出方法调用过程中产生的栈详细异常信息。
注意:此方法为编程人员调试程序而设置的方法。
Error:是Throwable的子类,代表错误
注意:Error通常是仅靠程序本身无法恢复的严重错误
例如:JVM内存不足或是方法调用过程中栈溢出(java.lang.StackOverflowError栈溢出)、
OutOfMemoryError(堆溢出)
Exception:是Throwable的子类,代表异常
(1) RuntimeException:运行时异常、未检查异常,和RuntimeException 有直接或间接继承关系的异常类称为运行时异常
a. 特点:编译器不检测此类异常,编译通过,但是运行报错
b. 处理:运行时异常可处理也可以不处理,此类通过严谨代码可以避免
c. 常见的运行时异常:
① ArrayIndexOutOfBoundsException(数组下标越界)
② StringIndexOutOfBoundsException(字符串下标越界)
③ IndexOutOfBoundsException(集合中下标越界)
④ java.lang.NullPointerException(空指针异常)
⑤ java.lang.ClassCastException(类型转换异常)
⑥ java.lang.NumberFormatException(数字格式转换异常)
(2) 非RuntimeException:非运行时异常、已检查异常,和 RuntimeException没有任何继承关系的异常类称为非运行时异常
a. 特点:编译器检测此类异常,编译报错
b. 处理:非运行时异常一旦出现,必须处理
三、异常的处理
1.throws 声明一个异常,告诉程序员调用此方法需要处理异常:
代码示例
public static void func(int x,int y) throws ArithmeticException{
if(y == 0) {
//程序员 想自己手动抛出异常--》一般情况:手动抛出的都是自定义异常
throw new ArithmeticException("你给的y == 0 不能作为除数!");
}
System.out.println(x/y);
}
2.try{}catch{}
代码示例
public static void func() throws ArrayIndexOutOfBoundsException{
int[] array = {1,2,3,4,5,6};
System.out.println(array[100]);
}
public static void main(String[] args) {
try {
func();
}catch (ArrayIndexOutOfBoundsException e) {
System.out.println("数组越界异常");
}
}
finally的注意事项:笔试选择题 * 特性:finally当中的代码是肯定会被执行的 * 1、finally当中的代码是肯定会被执行的 不管是否发生异常 * 2、finally当中千万不要写 return语句 * 3、用于资源的释放 * 例如:I/O 文件 关闭
四、自定义异常类
定义一个类继承Exception或是其子类,如果定义的类继承了RuntimeException或是RuntimeException的子类,则此异常为运行时异常;如果此类和 RuntimeException没有任 何继承关系,则异常类为非运行时异常
提供两个构造方法:
a. 无参数的构造方法
b. 有参数的构造方法,参数类型为 String,接收异常信息利用super(message); 设置异常信息
练习题:
自定义异常实现登录
public class Test {
private static String userName = "ys";
private static String password = "121212";
static class UserError extends Exception{
public UserError(String message){
super(message);
}
}
static class PasswordError extends Exception{
public PasswordError(String message){
super(message);
}
}
public static void login(String userName,String password)throws UserError,PasswordError{
if (!Test.userName.equals(userName)){
throw new UserError("用户名错误");
}
if (!Test.password.equals(password)) {
throw new PasswordError("密码错误");
}
System.out.println("登陆成功");
}
public static void main(String[] args) {
try {
login("ys", "121212");
} catch (UserError userError) {
userError.printStackTrace();
} catch (PasswordError passwordError) {
passwordError.printStackTrace();
}
}
}