java中的异常现象及分析

一:结构概述
java语言中有Error类和Exception类它们都是Throwable的子类
举例:典型的Error错误有:
StackOverflowError:原因栈的深度超过了虚拟机分配给的线程的栈的长度,比如方法的递归调用就会造成这样的错误
OutOfmemoryError:原因有不断地向堆内存中创建新的对象造成堆内存溢出
举例:

public class TestError {

    private static List<String[]> list = new ArrayList<>();

    public static void main(String[] args) {
        for (int i = 0; i < 100000; i++) {
            list.add(new String[10000]);
        }
    }

    public  static void test(){

        test();

    }

}

这样的循环就会造成OutOfmemory();
二:处理异常
(1)积极处理:try -catch
try{//可能出现的异常的代码
}catch(异常的类型 对象 ){
//捕捉后的代码
}
1)catch能捕捉的异常要么是精准匹配要么是异常的父类
2)可以用多个catch来捕捉多个异常(异常子类在前,父类在后)
30JDK1.7之后一个catch可以有多个异常类型
(2)消极处理
在方法的生命上可以添加一个throws加上一个异常类型,交给运行时系统来解决,或者交给调用本方法的方法来解决,注意(main方法的调用者为虚拟机若虚拟机来处理异常时就会程序退出)
举例:

public class Demo1 {
    public static void main(String agrs[]) {
        try {//调用他的方法来解决
            mi();
        }catch (ParseException e){
            e.printStackTrace();
        }
    }

    private static void mi() throws ParseException {//抛出可能出现的异常
        SimpleDateFormat format = new SimpleDateFormat("yyyy--MM--dd");
        Date date = format.parse("2018--06--8");
        System.out.println(date);
    }
}

二:对异常的行为进行分类
可分为以下二类:
(1)检查异常:除了RuntimeException之外的异常都为检查异常,检查异常的解决方式为1)捕获2)抛出
(2)未检查异常:RuntimeException及其子类与Error都是未检查异常,一般的解决方法为:1)捕获2)抛出3不处理
三:主动抛出异常
throw关键字通常用于方法体之中,并且抛出一个异常对象,程序执行到throw语句立即停止,后面语句不会执行,如果在抛出异常之后要在上一级代码之中来捕获就需要使用throws关键字来方法声明上来指明要抛出的异常,若要捕捉一抛出的异常就要用try-catch块
举例:

自定义的异常类
public class MyException extends Exception {

    String message;

    public MyException(String message) {
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }
}
public class MyException extends Exception {

    String message;

    public MyException(String message) {
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }
}

四:总结
1.异常对象的方法:
e.getMessage() 获取异常的信息
e.printStackTrace() 打印异常的跟踪信息
异常的传播:与方法调用的方向相反
2.异常的使用经验:
(1)不要吞掉异常:catch块后的语句不能为空
(2)在与有返回值的方法中时连用:有两种解决方法:1)catch后加一个return语句 2)或者抛出一个异常
3.子类继承父类时异常的注意事项:
子类在重写父类的方法时不能抛出比父类更广泛的异常(如果子类与父类的继承都为未检查异常不用满足上述原则)
4.一般建议检查异常转换为未检查异常,避免很多繁琐的步骤
try(){

}catch(Exception e){

}
finally{

}
如果try, catch与Finally都有return语句则以Finally的为准
如果finally语句中不含有return语句则以try的return为准。

猜你喜欢

转载自blog.csdn.net/weixin_40843624/article/details/81490800