1.异常是什么?
异常就是在本该顺理成章的地方发生了出乎意料的事情,这个“事情”就是异常。处理和解决这个事情,就是处理异常。
举例:
光头强像往常一样去砍树,突然发现刀没了。但是刀一直放在那个墙角啊,怎么会没了呢(异常)?最后只能去集市上买一把了,结果发现灰太狼在卖刀,才明白是灰太狼偷了他的刀(明白异常发生的原因)。还把灰太狼打了一顿,甚是高兴。(解决了bug,当然异常高兴)
2.异常的父类?
Object-->Throwable-->Exception -->运行时异常(RuntimeException)
-->检查类异常(CheckedException)
-->Error及其子类只能用来处理系统内部程序的异常和运行环境的异常,一般与硬件有关
解释:
异常可以分为Exception和Error两大类,它们的父类都是Throwable,而Exception又可以分为RuntimeException和CheckedException两大类
3.常出现的异常
- ArithmeticException
- ArrayIndexOutOfBoundException
- NullPointerException
- ClassNotFindExceotion
- IIIegalArgumentException
- ClassCastException
- NumberFormatException
代码:
package 异常;
public class ExceptionTest {
public static void main(String[] args) {
int num = 5 / 0;
System.out.println(num);
}
}
测试结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at 异常.ExceptionTest.main(ExceptionTest.java:12)
注意:当出现异常之后,后面代码不可被执行
4.处理异常的方法
1.
try {
} catch() {
//先子类,后父类
//只执行第一个成功匹配的异常
}
2.
try{
}catch(){
}fianlly{
//不管有没有异常都会被执行
System.exit(-1)
}
3. 只有System.exit(-1);finally才不会执行,其他情况都会执行,即使在finally之前定义了return
测试代码:
package 异常;
public class Test {
public static void main(String[] args) {
int[] a = {};
System.out.println(a[0]);
}
}
测试结果:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at 异常.Test.main(Test.java:8)
测试2(使用try catch finally)
package 异常;
public class Test {
public static void main(String[] args) {
try {
int[] a = {};
System.out.println(a[0]);
} catch (Exception e) {
System.out.println("数组为空");
} finally {
//除非System.in(-1),finally才不会被HI行
System.out.println("始终会被执行");
}
}
}
测试结果:
数组为空
始终会被执行
5.捕获异常的过程
当代码产生异常后,系统会自动创建一个异常对象,如果系统创建的异常对象和catch(异常对象)中的异常对象一致,就会执行catch中的内容
代码测试:
package 异常;
public class ExceptionTest {
public static void main(String[] args) {
try {
int num = 5 / 0;
System.out.println(num);
} catch (NullPointerException e) {
System.out.println("出错了");
}
}
}
测试结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at 异常.ExceptionTest.main(ExceptionTest.java:7)
总结:从上可以看出,如果捕获的异常不匹配,结果还是会报异常
注意:在try里面,一旦异常发生,后面的部分代码就不再执行。
6.为当前项目创建自己独有的异常类型
创建一个自己的异常类,继承自IllegalArgumentException异常类
package 异常;
public class AgeOverException extends IllegalArgumentException{
//构造方法
public AgeOverException(){}
public AgeOverException(String msg){
super(msg);
}
}
测试类
package 异常;
public class Student {
private int age;
public int getAge() {
return age;
}
//声明异常
public void setAge(int age) throws Exception{
if (age > 0 && age < 100) {
this.age = age;
} else {
//抛出异常
throw new AgeOverException("用户输入的年龄不对");
}
}
public static void main(String[] args) throws Exception {
Student s = new Student();
s.setAge(120);
}
}
测试结果:
Exception in thread "main" 异常.AgeOverException: 用户输入的年龄不对
at 异常.Student.setAge(Student.java:17)
at 异常.Student.main(Student.java:23)
7.其他问题
1.什么是检查异常
检查异常:如果当前的方法在运行时可能会出现异常,那么我们就需要声明异常,以便于在调用的时候捕获异常。防止程序中断。
2.什么是运行时异常
运行时异常:运行时产生的错误
3.声明异常和抛出异常的区别?
- 声明异常: throws,声明异常后需要在调用方法时,捕获异常
- 抛出异常: throw
4.为什么为方法添加声明异常
如果当前方法出错,将会影响后续程序的执行,如果不想影响,需要提前给方法声明异常,使用时提示捕获异常。
5.抛出异常的意义
可以终止程序的允许,如果当前方法无法完成,后续操作也无须执行。但是抛出异常后,后续程序可以运行
6.处理异常的优点:
增加程序的健壮性
网友评论