一、异常的概念
在Java中,程序执行过程中发生的不正常行为称为异常。
Java体系结构:
1.2异常的分类
- 编译异常,也称为受检查异常(Checked Exception).
class Person implements Cloneable{
public String name;
public int age;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); //想要该类深拷贝,就要重写clone方法
}
}
- 运行异常,也称为非受检查异常(Unchecked Exception).
public class Test7 {
public static void main(String[] args) {
int[] arr = null;
System.out.println(arr.length);
}
}
在Java中,异常的主要关键字有:throw、try、catch、finally、throws.
二、异常的抛出与捕获
**在Java中,可以借助关键字,抛出一个指定的异常对象,将错误信息告知调用者。 其语法如下:
throw new XXXException("发生异常的原因");
实现一个获取数组中任意位置元素的方法 :
public class Test {
public static int getElement(int[] arr,int ret) {
if(null == arr) {
throw new NullPointerException("null");
}
if((ret < 0)||(ret >= arr.length)) {
throw new ArrayIndexOutOfBoundsException("下标错误");
}
return arr[ret];
}
public static void main(String[] args) {
int[] arr = {1,2,3,4};
System.out.println(getElement(arr,3));
}
}
【注意事项】
1. throw必须写在方法的内部 .
2. 如果抛出的是编译异常,调用者必须处理,否则无法通过编译 .
3. 异常一旦抛出,其后的代码就不会执行.
2.2 异常的捕获并处理
异常的捕获,也就是异常的具体处理方式,主要有两种方式:异常声明throws(不处理异常,只是编译通过) 和 try-catch捕获处理。
public static void main1(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
int a = scanner.nextInt();
System.out.println(10 / a);
System.out.println("不执行");
}catch (ArithmeticException e) {
System.out.println("捕获到了算数异常");
e.printStackTrace();
}finally {
scanner.close();
System.out.println("不管是否发生异常");
}
System.out.println("其他代码");
}
三、自定义异常
Java中虽然已经内置了丰富的异常类, 但是并不能完全解决实际开发中所遇到的一些异常问题,此时就需要程序猿自己手动创建一些异常类.
用户需求: 实现一个软件登录功能.
- 我们可以自己实现异常类,但必须继承Exception 或者 RunTimeException.
- 实现一个带有String类型参数的构造方法,以便显示异常原因.
public class passWordError extends RuntimeException{
public passWordError() {
super();
}
public passWordError(String message) {
super(message);
}
}
然后,我们在main方法中调用自定义异常类即可:
public class Test6 {
private String userName = "admin";
private String passWord = "123456";
private void login(String userName,String passWord) {
if(!this.userName.equals(userName)) {
throw new UserNameError("用户名错误");
}
if(!this.passWord.equals(passWord)) {
throw new UserNameError("密码错误");
}
System.out.println("登录成功,欢迎主人使用");
}
public static void main(String[] args) {
try {
Test6 test6 = new Test6();
test6.login("admin","123456");
}catch (UserNameError e) {
e.printStackTrace();
}catch (passWordError e) {
e.printStackTrace();
}
}
}
【注意事项】
- 自定义异常通常会继承自 Exception 或者 RuntimeException .
- 如果密码和用户名都错误的话,只能发生一个异常.
与
君
共
勉
:
你
迷
茫
的
原
因
,
在
于
读
书
太
少
,
而
想
的
太
多
.
与君共勉 : 你迷茫的原因,在于读书太少,而想的太多.
与君共勉:你迷茫的原因,在于读书太少,而想的太多.