java学习记录19-异常和( Error及Exception)

image.png
###什么是异常?
异常是程序在编译或者执行的过程中可能出现的问题。
异常是应该尽量提前避免的。
异常可能也是无法做到绝对避免的,异常可能有太多情况了,开发中只能提前干预!
异常一旦出现了,程序就会退出JVM虚拟机而终止,开发异常是需要处理的。
研究异常并且避免异常,然后提前处理异常,体现的是程序的健壮性!!!
Error : 错误的意思,严重错误Error,无法通过处理的错误,一旦出现,程序员无能为力了,只能重启系统,优化项目。
比如内存奔溃,JVM本身的奔溃。这个程序员无需理会。

    Exception:才是异常类,它才是开发中代码在编译或者执行的过程中可能出现的错误,它是需要提前处理的。以便程序更健壮!

Exception异常的分类:
     1.编译时异常:继承自Exception的异常或者其子类,编译阶段就会报错,必须程序员处理的。否则代码编译就报错!!
     2.运行时异常: 继承自RuntimeException的异常或者其子类,编译阶段是不会出错的,它是在
            运行时阶段可能出现,运行时异常可以处理也可以不处理,编译阶段是不会出错的,但是还是建议处理!!

###常见的运行时异常。
运行时异常: 继承自RuntimeException的异常或者其子类,编译阶段是不会出错的,它是在 运行时阶段可能出现的错误,运行时异常编译阶段可以处理也可以不处理,编译阶段是不会出错的。

     1.数组索引越界异常:ArrayIndexOutOfBoundsException
     2.空指针异常 : NullPointerException
     3.类型转换异常:ClassCastException
     4.迭代器遍历没有此元素异常:NoSuchElementException
     5.数学操作异常:ArithmeticException
     6.数字转换异常: NumberFormatException

###常见的编译时异常认识。

 编译时异常:继承自Exception的异常或者其子类,没有继承RuntimeException
  编译阶段就会报错,必须程序员处理的。否则代码编译就报错!!
 编译时异常的作用:Java担心你技术不行,担心你出bug,直接干预提醒你请注意,你的代码极可能出错!
 编译时异常:可遇不可求的,遇到再解决。

###异常产生默认处理过程解析(下面代码说明)。
(1)会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。
(2)异常会从方法这里默认抛出给调用者,调用者最终抛出给JVM虚拟机。
(3)虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
(4)直接干掉当前程序。
(5)后续代码没有机会执行了,因为程序已经死亡。
小结:
默认处理过程会引起程序的死亡,异常在开发中还是需要程序员自己处理!!否则程序不健壮!!

public class ExceptionDemo {
   public static void main(String[] args) {
       System.out.println("程序开始。。。。。。。。。。");
       devide(1,0);
       System.out.println("程序结束。。。。。。。。。。");
   }

   public static void devide(int a , int b){
       System.out.println(a); // 日志
       System.out.println(b); // 日志
       int c = a / b ;
       System.out.println("结果是:"+c);
   }
}

编译时异常的处理方式(3种)。

 编译时异常:编译阶段必须处理,否则程序编译都不通过。
 编译时处理异常方式一:
     从出现异常的地方开始,逐层往外抛出给调用者,调用者也继续往外抛出,最终抛出给JVM虚拟机。
     格式:在方法上写上 throws 异常类型1,异常类型2 {}
     建议格式:在方法上写上 throws Exception

     结论:这种处理方式虽然代码编译没有错误了,
    但是与默认方式是一样的,是不负责的方式,依然会 在异常出现后结束程 
    序!!  不推荐这种方式!!

####编译时异常的处理方式二:
直接在出现异常的地方直接使用try-catch捕获并立即处理。
自己出问题自己解决掉,不抛给别人。

     try-catch格式:
            try{
                // 可能出现问题的代码,被监视的代码
            }catch(异常类型1 异常变量){
                // 处理异常
            }catch(异常类型2 异常变量){
                // 处理异常
            }...
            注意:try出现1次,catch多次。

编译时异常的处理方式三:
底层如果出现了异常,一层一层的往外抛出给调用者,最终调用者集中捕获处理。
谁最开始调用谁最终处理。这是最规范的方式,推荐使用的捕获处理方式。
总结:方式三是推荐做法,上层可以知道程序的执行情况,程序不会死亡!!

ClassNotFoundException和NoClassDefFoundError的区别:
ClassNotFoundException的产生原因:
导致ClassNotFoundException的可能是:是指不到指定的class。 ClassNotFoundException发生在加载阶段,解决该问题需要确保所需的类连同它依赖的包存在于类路径中,常见问题在于类名书写错误。

NoClassDefFoundError产生的原因在于:

如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候找不到类的定义。要查找的类在编译时存在,运行的时却找不到了。这个时候就会导致NoClassDefFoundError.
造成该问题的原因可能是打包过程漏掉了部分类,或者jar包出现损坏或者篡改。解决这个问题的办法是查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类。

什么是自定义异常:
Java已经为代码可能出现的问题都设计了一个异常类来代表。
但是异常可能是有千千万万中情况,Java不可能为所有的异常都设计一个类来代表。所以需要自定义异常。
自定义异常也是异常:
1.自定义编译时异常:继承Exception,重写构造器。
2.自定义运行时异常:继承RuntimeException。,重写构造器。
如果希望异常的提醒更加强烈建议用自定义编译时异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值