Java学习程序员javaSE

异常

2017-04-17  本文已影响90人  风吹稻子

1.异常是什么?

异常就是在本该顺理成章的地方发生了出乎意料的事情,这个“事情”就是异常。处理和解决这个事情,就是处理异常。

举例:

光头强像往常一样去砍树,突然发现刀没了。但是刀一直放在那个墙角啊,怎么会没了呢(异常)?最后只能去集市上买一把了,结果发现灰太狼在卖刀,才明白是灰太狼偷了他的刀(明白异常发生的原因)。还把灰太狼打了一顿,甚是高兴。(解决了bug,当然异常高兴)

2.异常的父类?

Object-->Throwable-->Exception -->运行时异常(RuntimeException)
                               -->检查类异常(CheckedException)
                  -->Error及其子类只能用来处理系统内部程序的异常和运行环境的异常,一般与硬件有关

解释:
异常可以分为Exception和Error两大类,它们的父类都是Throwable,而Exception又可以分为RuntimeException和CheckedException两大类

3.常出现的异常

  1. ArithmeticException
  2. ArrayIndexOutOfBoundException
  3. NullPointerException
  4. ClassNotFindExceotion
  5. IIIegalArgumentException
  6. ClassCastException
  7. 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.声明异常和抛出异常的区别?

  1. 声明异常: throws,声明异常后需要在调用方法时,捕获异常
  2. 抛出异常: throw

4.为什么为方法添加声明异常

如果当前方法出错,将会影响后续程序的执行,如果不想影响,需要提前给方法声明异常,使用时提示捕获异常。

5.抛出异常的意义

可以终止程序的允许,如果当前方法无法完成,后续操作也无须执行。但是抛出异常后,后续程序可以运行

6.处理异常的优点:

增加程序的健壮性

上一篇下一篇

猜你喜欢

热点阅读