java异常解析

一、## 异常的分类##

1. 运行时异常(非受检异常)
常见的运行时异常
ArithmeticException 数学计算异常
NullPointerException 空指针异常
ArrayIndexOutOfBoundsException 数组索引越界异常
NumberFormatException 字符串转换成数值类型异常
NegativeArraySizeException 负数数长度异常
IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围异常
ClassNotFoundException 类文件未找到异常
ClassCastException 造型异常

2. 编译时异常(受检异常)
IOException 文件的操作
SocketException 网络连接
FIleNotFoundException 文件未找到异常
EOFException 读写文件尾异常

异常类的结构图
这里写图片描述
二、## 异常的概述##

异常就是软件中的bug,犹如人存在健康隐患。当程序出现问题了,不及时用try catch进行处理会终止整个系统,甚至会导致系统崩溃。

java运用异常机制的目的
改正运行时异常,预先处理编译异常
运行时异常的目的:

找到运行异常的位置,并且通过判断更改进而可以避免此运行时异常,
例如 String s = null 可以判断 if(s != null) s.length() 则可以避免运行时的空指针异常,可以通过对信息进行处理避免运行异常。
在有必要的时候可以try catch捕获运行异常,为了不影响下面的程序的执行。其中一般不会在catch中继续抛出运行时异常(如NullPointerExcepiton)

编译异常(受检异常)的目的:
为了预先处理(throws声明抛出或try catch捕获)不可避免的编译异常,并需要对该异常进行处理。并向用户提示适当的信息,并且还有让下面的程序继续执行

异常中的关键字

finally
在try,catch中代码块,无论try中代码是否抛出异常,或者是否在catch中继续抛出异常都会执行finally中的代码块
其中当catch中有return 那么finally也有return 那么最后方法得到的值是finally中返回的值 (其中把方法中所有的返回值放在返回值栈中,到最后返回的是从栈顶弹出一个返回值) 会覆盖掉正常返回值
注:当catch块中向上继续抛出异常时,在finally中有return值时,会隐藏抛出的异常
finally的缺点
finally中会隐藏正常代码中的返回值,隐藏catch中的返回值,同时会隐藏抛出的异常
finally的优点
可以用finally对出现异常中的打开的资源进行关闭

throw和throws
throws:
出现的位置:必须在方法声明的后面,后跟一个或多个异常类,但在方法中不一定要抛出
作用是:说明此方法不处理一个或多个异常类的对象

throw:
出现的位置 :方法中,try catch中,在方法体中任何地方 后面跟new 异常类的对象
作用 抛出异常类对象

1.有throw一定有throws,但有throws并不一定有throw
2.throws后面的异常对象必须和throw new 异常类对象要对应

二、## 异常数据结构和异常栈跟踪##

Exception类中有个私有属性message,子类只能通过Exception中的构造方法才可对message进行设值。通过getMessage得到异常信息,其中追踪方法中出现的异常采用的是堆栈数据结构

public class TestException{
    public void m1()throws MyException{
        m2();
    }
      public void m2()throws MyException{
        m3();
    }
      public void m3()throws MyException{
       throw new MyException();
    }
    public static void main(String[] args){
        TestException t = new TestException()'
        try{
        t.m1();
        }catch(MyException e){
         e.printStackTrace();
        }
    }
}

首先把从主方法开始,把方法m1,方法m2,方法m3压入栈中,jvm从栈顶方法m3执行,当出现异常时(jvm创建异常对象),若该方法中没有通过try catch异常处理机制则检测方法是否声明了抛出该异常throws MyException(若既没有捕获也没有声明则系统终止程序)则交给调用方法m3的方法进行处理,保存异常信息以及出错的位置(那个方法,以及出错的位置),然后弹出方法m3,又会执行方法m2,重复上面的步骤。直到把异常交给了主方法main进行处理,检查该方法中有异常处理,则把异常对象抛给catch(MyException e)通过e.printStackTrace()输出方法栈中的所有异常信息
注: 所以当没有必要抛出异常时,尽量不要随意抛出,jvm新建异常对象,保存异常信息并追踪异常信息会耗时,耗资源。
当JVM创建异常对象 给异常对象中messge设置的什么信息,以及异常对象的toString方法 异常父类Exception的 String toString() return this.getClass()+”:”+this.getMessage() 返回的是异常信息

Jvm给一下异常对象设置的message信息为

Integer.parseInt(“1.2”)
NumberFormatException
For input string:”1.2(转换数据出错的字符串) “

ClassNotFoundException

java.lang.ClassCastException: bank.dynamo.view.test.Test cannot be cast to bank.dynamo.view.test.A

NullPointerException

Java.lang.NullPointerException

ArtihmeticException

java.lang.ArithmeticException: / by zero

ArrayIndexOutOfBoundsException
int[] a = new int[2]; int i = a[3];
3代表导致出现数组越界的序号
java.lang.ArrayIndexOutOfBoundsExeption:3

NegativeArraySizeException 负数长度异常
java.lang.NegativeArraySizeExcepton

FileNotFoundException

java.io.FileNotFoundException: c:\t.txt (系统找不到指定的文件。)
Class.forName(“java.dynamo.Test”)加载时找不到指定包下的字节码文件
ClassNotFoundException:java.dynamo.Test

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值