java异常浅谈与分析

目录

1.认识Exception和Error

2.Exception是什么?

3.什么是Throwable

4.常见的异常

5.与 Exception 有关的 Java 关键字

6.什么是 Error

7.总结


1.认识Exception和Error

异常是程序经常会出现的问题,发现错误最佳的时候应该是编译阶段,也就是你试图运行程序之前。但是,在编译期间并不能找到所有的错误,有一些NullPointerExceptionClassNotFoundException异常在编译期找不到,这些异常是RuntimeException运行时异常,这些异常往往在运行才能发现。

我们写java程序经常会出现两种问题,一种是java.lang.Exception,一种是java.lang.Error,都用来

表示出现了异常情况,下面就针对这两种概念进行理解。

2.Exception是什么?

Exception 位于 java.lang 包下,它是一种顶级接口,继承于 Throwable 类,Exception 类及其子类都是 Throwable 的组成条件,是程序出现的合理情况
在认识 Exception 之前,有必要先了解一下什么是 Throwable

3.什么是Throwable

Throwable类是Java语言中所有错误(errors)异常(exceptions)的父类。只有继承于Throwable的类或者其子类才能够被抛出,还有一种方式是带有Java中的@Throw注解的类也可以抛出。

在Java规范中,对非受查异常和受查异常的定义是这样的:

The unchecked exception classes are the run-time exception classes and the error classes.
 

The checked exception classes are all exception classes other than the unchecked exception
classes. That is, the checked exception classes are Throwable and all its subclasses other
than RuntimeException and its subclasses and Error and its subclasses.

也就说,除了RuntimeException和其子类,以及error和其子类,其它的所有异常都是checkedException

那么按照这种逻辑关系,我们可以对Throwable及其子类进行归类分析,如图所示:

可以看出,Throwable位于异常的和错误的最顶层,我们查看Throwable类中发现它的方法和属性有很多,我们只看其中几个比较常用的

// 返回抛出异常的详细信息
public string getMessage();
public string getLocalizedMessage();

//返回异常发生时的简要描述
public public String toString()Ҕ

//打印异常信息到标准输出流上
public void printStackTrace();
public void printStackTrace(PrintStream s);
public void printStackTrace(PrintWriter s)

//记录栈针的当前状态
public synchronized Throwable fillInStackTrace();

此外,因为 Throwable 的父类也是 object ,所以常用的方法还有继承其父类的 getClass() 和getName() 方法。

4.常见的异常

下面我们回到 Exception 的探讨上来,现在你知道了 Exception 的父类是 Throwable,并且 Exception有两种异常,一种是 RuntimeException ;一种是 CheckedException ,这两种异常都应该去捕获
下面列出了一些 Java 中常见的异常及其分类。

RuntimeException

序号

异常名称

异常描述
1

ArrayIndexOutOfBoundsException

数组越界异常

2

NullPointerException

空指针异常

3

lllegalArgumentException

非法参数异常,例如:非日期格式的字符串转换成日期

4

NegativeArraySizeException

数组长度为负异常

5

lllegalStateException

非法状态异常,例如,如果在流被关闭之后尝试向其写入数据,就会抛出非法状态异常

6

ClassCastException

类型转换异常

例如:ClassCastException类型转换异常

Animal表示动物,Dog表示狗,是动物的子类,Cat表示猫,是动物的子类,看下面的代码:

Animal a = new Dog();  // (1)
Animal b = new Cat();   // (2)
Dog c = (Dog)a;            // (3)
Dog d = (Dog)b;            // (4)

第三行代码和第四行代码基本相同,从字面意思看都是把动物(Animal)强制转换成(Dog),但是第四行代码将产生java.lang.ClassCastException。原因是你要把一个猫(b这是动物猫)转换成狗,而第三行中是把狗转换成狗,所以可以。

UncheckedException

序号

异常名称

异常描述

1

NoSuchFieldException

表示该类没有指定名称抛出来的异常

2

NoSuchMethodException

表示该类没有指定方法抛出来的异常

3

IllegalAccessException

不允许访问某个类的异常

4

ClassNotFoundException

类没有找到抛出异常

5.与 Exception 有关的 Java 关键字

那么 Java 中是如何处理这些异常的呢? 在 Java 中有这几个关键字 throws、throw、try、finally、catch 下面我们分别来探讨一下。

throws 和 throw
在 Java 中,异常也就是一个对象,它能够被程序员自定义抛出或者应用程序抛出,必须借助于throws 和 throw 语句来定义抛出异常
throws 和 throw 通常是成对出现的,例如

static void cacheException() throws Exception{
    throw new Exception();
}

throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。 throws 语句用在方法声明后面表示再抛出异常,由该方法的调用者来处理。


throws 主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。 throw 是具体向外抛异常的动作,所以它是抛出一个异常实例。

try 、finally 、catch
这三个关键字主要有下面几种组合方式 try...catch 、try...finally、try...catch...finally。

try...catch 表示对某一段代码可能抛出异常进行的捕获,如下

static void cacheException() throws Exception{
    try {
        System.out.println("1");
    }catch (Exception e){
        e.printStackTrace();
    }
}

try...finally 表示对一段代码不管执行情况如何,都会走 finally 中的代码。

static void cacheException() throws Exception{
    for (int i = 0; i < 5; i++) {
        System.out.println("enter: i=" + i);
        try {
            System.out.println("execute: i=" + i);
            continue;
        } finally {
            System.out.println("leave: i=" + i);
        }
    }
}

try...catch...finally 也是一样的,表示对异常捕获后,再走 finally 中的代码逻辑。

6.什么是 Error

Error 是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM (Java 虚拟机)出现的问题。这些错误是不可检查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况,比如OutofMemoryError StackOverflowError 异常的出现会有几种情况。

7.总结

在 Java 中,你可以把异常理解为是一种能够提高你程序健壮性的机制,它能够让你在编写代码中注意这些问题,也可以说,如果你写代码不会注意这些异常情况,你是无法成为一位硬核程序员的。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心里向阳_无惧悲伤_sly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值