java中的异常 Exception 相关知识点汇总

java异常时java提供的用于处理程序中错误的一种机制

int i = 1/0;

该行代码会顺利通过编译器,但是运行后系统会报错,提示为:

Exception in thread “main” java.lang.ArithmeticException: / by zero at Helloworld.main(Helloworld.java:5)

这就是java程序的异常,碰到编译器无法顺利解析判断的代码块,程序会顺利通过编译器,但是在执行时则会报错.

JDK中定义了很多异常类,这些类对应各种各样可能出现的异常事件,所有的异常对象,都是派生于Throwable类的实例,如果内置的不能满足需要,还可以创建自己的异常类.
在这里插入图片描述
Error为Unchecked Exception 编译器不会通过,但Exception,编译会正常通过,但是运行时会报错,Exception用来定义所有可以作为异常被抛出来的类.

Error表示表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。

Runtime Exception为运行时异常,说白了是不受检查异常,编译器并不是万能的,它也有很多情况,碰到的错误是无法判断的,但是当运行时异常会被暴露出来,例如经典的1/0或空指针

所有不是Runtime Exception的异常,统称为Checked Exception
又被称为"已检查异常",这类异常的产生不是程序本身的问题,通常是外界因素造成的,为了预防这些异常产生时,造成的程序的中断或得不到正确的结果,java要求编写可能产生这类异常的程序代码一定要做异常的处理.

通俗来讲Checked Exception和Runtime Exception的区别在于:

checked异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常(空指针异常),它就是运行时异常,并且这种异常还是最常见的异常之一。

遇到Exception,我们需要手动敲代码去处理异常
代码样板:

try {
           //用来放可能会发成异常的代码块
        }catch(Exception e){
            //对相应异常进行处理
        }catch(Exception e) {
            //对相应异常进行处理
        }finally {
            //遇到异常,try中的语句会终止,但是finally块的语句会强制执行
        }

放一段经典的异常实例

public static void main(String[] args)  {
        FileReader reader = null;  //IO流相方面的子类
        try {
            reader = new FileReader("d:/b.txt");  //将D盘根目录下的b.txt传参给FileReader并赋给reader
            System.out.println("step1");
            char c1 = (char)reader.read();  //读取该文件的第一个字符
            System.out.println(c1);

        } catch (FileNotFoundException e) {
            System.out.println("step2");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println(3123232);
            e.printStackTrace();
        }finally {
            System.out.println("step3");
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("finally语句块,强制执行");
        }
    }

由于D盘下并没有b.txt,则发生了Checked Exception异常,控制台反馈:

step2
java.io.FileNotFoundException: d:\b.txt (系统找不到指定的文件。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(Unknown Source)
at java.io.FileInputStream.(Unknown Source)
at java.io.FileInputStream.(Unknown Source)
at java.io.FileReader.(Unknown Source)
at Bilibili.One27Exception.main(One27Exception.java:20)
step3
finally语句块,强制执行

首先D盘下并没有b.txt,则后续再try中的代码跳过不执行,导致没有打印step1,然后跳转到参数为FileNotFoundException的catch语句(文件不存在的异常为FileNotFoundException,系统碰到异常会自动寻找带有此异常的catch语句,如果该异常为参数的catch不存在,则跳转到该异常的父类继续寻找),然后打印step2,调用printStackTrace()方法,列出异常信息,(catch语句的常用方法后文有介绍),catch语句执行完毕,检查到存在finally语句(finally语句并非必须),执行finally语句,如果判断reader是否为空,非空对象,reader.close()销毁对象,然后打印finally语句块,强制执行

try语句:try语句制定了一段具体代码,该段代码就是一次捕获并处理的范围,在执行过程中,当任何一条语句产生异常时,就会跳过该段后面的代码,
注:当异常处理的代码执行完毕以后,是不会回到try语句去执行尚未执行的代码的.

catch语句:每个try语句都伴随着一个或多个catch语句块,用于处理可能产生的不同类型的异常对象

catch常用方法:

toString();   //显示异常的类名和异常的原因
getMessage();    //只显示产生异常的原因,但不提示类名
printStackTrach();    //用来跟踪异常事件发生时堆栈的内容

java常见异常

  • ClassCastException 类型转换异常
  • ClassNotFoundException 未找到相关类异常
  • ArithMeticException 算数异常
  • ArrayIndexOutOfBoundsException 数组下标越界异常
  • ArrayStoreException 数组中包含不兼容的值异常
  • SQLException 操作数据库异常
  • NullPointerException 空指针异常
  • NoSuchFieldException 字段未找到异常
  • NoSuchMethodException 方法未找到异常
  • NumberFormatException 字符串转换为数字异常
  • NegatireArraySizeException 数组size为负数异常
  • StringIndexOutOfBoundsException 字符串索引超出范围异常
  • IOException IO流异常
  • IllegalAccessException 不允许访问某类异常
  • InstantiantionException 类无法被实例化异常
  • EOFException 文件已结束异常
  • FileNotFoundException 文件未找到异常

RuntimeException常见异常

  • NullPointerException 空指针异常
  • ArrayIndexOutOfBoundsException 数组下标越界异常
  • ArithMeticException 算数异常
  • ArrayStoreException 数组中包含不兼容的值异常
  • SecurityException 安全性异常
  • NegatireArraySizeException 数组size为负数异常
  • IllegaArgumentException 非法参数异常

新手碰到异常尽量自己查询原因并解决,遇到看不懂或者无法对应处理的异常善用搜索引擎

java提供了内置的异常类,我们也可以extends手动自定义异常类

package YourPackage;

/**
 * 自定义异常
 */
public class One30MyException {
    public static void main(String[] args) {
        new Person().setAge(-3);
    }

}

class Person{
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age < 0){
            throw new IllegalArgumentException("age小于零,年龄设置不合理");
        }
        this.age = age;
    }
}

/**
 * p22手动抛出了异常类IllegaAgeException,而此异常类继承了RuntimeException
 * 如果继承的是runtime则不需要再trycatch或者抛出,但如果继承的是非RuntimeException则需要手动抛出或者trycatch
 */
class IllegaAgeException extends Exception {
    public IllegaAgeException() {

    }
    public IllegaAgeException(String message){
            super(message);
    }

}

自定义异常类一般需要敲一个无参构造器和string构造器,代码块中的super(message)为标配代码

使用异常机制的建议:

  1. 要避免使用异常处理代替错误处理,这样会降低程序的清晰性且效率低下
  2. 处理异常不可以代替简单测试 -->只在异常情况下使用异常
  3. 不要进行小且散乱的异常处理,应该将整个任务包装在一个try语句中,并分别针对可能的异常情况进行catch处理
  4. 异常一般在项目的高层处理,

有一种暖男叫catch,有一种真爱叫try—catch,世上最真情的爱恋就是你在try我在catch,无论你发什么脾气,我都静静的接受,默默地处理,不管你有什么错,我都会原谅你,爱着你。

有一种懒汉员工叫throws,甭管有啥事都往外抛,做错事了就交给上级擦屁股,上级不会再给上级,给到老板为止,老板也不会那就gg了,倒闭吧。

有一种听话员工叫循环,你让他做几遍工作他就做几遍,让他不睡觉一直加班他还就真敢做,没有老板break的允许是断然不敢停下的。

有一种霸道总裁叫finally,只要他想做的事就必须要做到,就算是return想要阻挡都不行,除非死亡,否则他会不顾一切去得到他的猎物。

有一种垃圾回收站叫finallize,他和我们的霸道总裁finally的名字非常相似,但是千万不能叫错了,不然后果很严重的。重要的事情说三遍,不能叫错,不能叫错,千万不能叫错!

有一种江湖叫类,江湖里有了人就叫对象,人有了技能就叫方法。

有一本取名法典叫做标识符,专门用来给类,方法和变量取名字的,法典里规定了必须以字母,下划线 _
或者美元$符号为开头才行,而且对大小写还相当敏感,并且绝对不能是关键字,像class,catch那种是万万不能用来取名的。

法典里有一种取名规则叫驼峰规则,给方法和变量取名的时候第一个单词必须小写,第二个、第三个单词首字母大写,此乃驼峰规则。当然了,如果是给类取名的话,那就是每个单词的首字母都得大写,别问我为什么,就是这么牛。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值