Java异常学习

Java异常

什么是异常

Exception:软件程序在运行过程中遇到的各种问题。

文件找不到,网络连接失败,非法参数;

检查型异常:用户错误或者问题引起。在编译时不能简单的被忽略。

运行时异常:肯恶搞被避免,在编译时被忽略。

错误(error):错误不是异常,是脱离程序员控制的问题,例如栈溢出。是爱编译的时候无法检查到的。

异常体系结构

Java把异常当作对象来处理。定义了一个基类:java.lang.Throwable作为所有异常的超类。

Error类对象是由Java虚拟机生成并抛出,与执行操作无关。

例如:Java虚拟机运行错误,当JVM没有内存资源,会出现OutOfMemoryError错误,此时会终止线程。

再如:类定义错误(NoClassDefFoundError)连接错误(LinkageError)错误不可查。

Error和Exception的区别:Error是灾难性的错误,是程序无法控制和处理的,Exception是可以被程序处理的。

Java异常处理机制

抛出异常:

捕获异常

处理异常

五个关键字:

try、catch、finally、throw、throws

idea快捷键:ctrl+alt+t

throw主动抛出异常:一般在方法使用:

public static void main(String[] args) {
    new Oop02().test(2,0);
}
public void test(int a,int b){
    if(b==0){
        throw new ArithmeticException();//主动抛出异常
    }else{
        System.out.println(a/b);
    }
}

输出结果:

Exception in thread "main" java.lang.ArithmeticException
at javademo.Oop02.test(Oop02.java:9)
at javademo.Oop02.main(Oop02.java:5)

Process finished with exit code 1

throws:方法处理不了这个异常,在方法抛出异常。

public static void main(String[] args) {
    try {
        new Oop02().test(2,0);
    } catch (ArithmeticException e) {
        e.printStackTrace();
    } 
}
public void test(int a,int b)throws ArithmeticException{
    if(b==0){
        throw new ArithmeticException();//主动抛出异常
    }else{
        System.out.println(a/b);
    }
}

输出结果:

java.lang.ArithmeticException
at javademo.Oop02.test(Oop02.java:13)
at javademo.Oop02.main(Oop02.java:6)

Process finished with exit code 0

自定义异常

其实大多数异常不需要自定义。

用户自定义异常类,需要继承Exception类

步骤:

1、创建自定义异常类;

2、在方法中通过throw关键字抛出异常对象;

3、如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续下一步;

4、在出现方法的调用这种捕获并处理异常。

public class Oop02 extends Exception {
    private int del;

    public Oop02(int del) {
        this.del = del;
    }

    @Override
    public String toString() {
        return "Oop02{" +
                "del=" + del +
                '}';
    }

    public static void main(String[] args) {
       a(1);
    }
    static  void a(int b){
            if(b>10){
                try {
                    throw new  Oop02(b);
                } catch (Oop02 oop02) {
                    oop02.printStackTrace();
                }
            }else {
                System.out.println("111");
            }
        }
    }

总结

1、处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理。

2、在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常。

3、对于不确定的代码,也可以加上try-catch,处理潜在的异常。

4、尽量去处理异常,切忌只是简单的调用printStackTrace()去打印。

5、具体如何去处理异常,要根据不同的业务需求和异常类型去决定。

6、尽量添加finally语句去释放占用的资源。

原文地址:https://www.cnblogs.com/yunxiaoqian/p/13911079.html