JAVA小知识27:异常与异常处理全解

一、异常

异常就是代表程序出现了问题,像我们之前学数组的时候碰到的数组越界异常,以及空指针异常等等都属于开发中经常能碰到的异常。

我们学习异常不是为了在以后中避免异常,而是学习碰到了异常以后该如何的处理。

1.1、异常的分类

Java的类库从java.lang.Throwable类开始,它定义了所有类型的错误和超类。Throwable分为两个主要子类:ErrorException

Error:代表的系统级别错误(属于严重问题)系统一旦出现问题,sun公司会把这些错误封装成Error对象。Error是给sun公司自己用的,不是给我们程序员用的。因此我们开发人员不用管它。
Exception:叫做异常,代表程序可能出现的问题,我们通常会用Exception以及他的子类来封装程序出现的问题。
RuntimeException:RuntimeException及其子类叫运行时异常,编译阶段不会出现异常提醒,运行时出现的异常(如:数组索引越界异常)
Exception下其他异常编译阶段就会出现异常提醒的。(如:日期解析异常)

1.2、编译时异常以及运行时异常

什么叫编译时异常?

我们直接看这段代码

在这段代码中我们看到了一个红色波浪线,有点基础的都知道,如果不解决这个红色波浪线我们编译

肯定是不通过的,现在我们看看它报了什么错。

看,未处理异常,这种异常就是编译时异常,在编译阶段必须手动的处理,否则就会一直报错。

那什么叫运行时异常呢?

这段代码中我们明确的知道数组是越界的,但是却不会给我报错,只有我们运行程序的时候才会报错。数组越界异常

我们总体看一下这两类异常

二、异常的作用

2.1、查看BUG的相关信息

我们来看下面这个代码:你觉得会报错吗?

会的,空指针异常,这里说arr.add("hello")是空指针,这里我们就能知道了,List集合不能这么创建。

再来看看这个代码:

通过异常我们能知道,其发生了越界的异常,能给我关键的信息。

2.2、查看底层情况

异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况,有时候可以手动抛出异常来处理事件。

三、异常处理方案

3.1、虚拟机默认处理异常

异常的名称异常原因异常出现的位置等信息输出在了控制台,然后程序停止执行,下面的代码不会再执行了,来看下列代码:

java 复制代码
public static void main(String[] args){
    List<String> arr = new ArrayList<String>();
    arr.add("hello");
    System.out.println(arr.get(0));
    System.out.println(arr.get(1));
    System.out.println(arr.get(0));
}

其执行结果为:

可以看到程序未出错之前的代码正常运行了,出错之后的没有运行。

3.2、手动处理异常

一般我们使用try...catch...来手动处理异常。他的作用是当try代码中出现了异常之后,不影响下面的代码运行。

我们再来看这段代码:

java 复制代码
public static void main(String[] args){
    List<String> arr = new ArrayList<String>();
    arr.add("hello");
    System.out.println(arr.get(0));
    try {
        System.out.println(arr.get(1));
    }catch (IndexOutOfBoundsException e){
        System.out.println("索引越界");
    }
    System.out.println(arr.get(0));
}

其输出为:

我们可以看到程序正常的往下面运行了,他的原理也很简单,如果try里面代码块报错了,会new一个报错类型的对象,然后去catch参数里面的异常去比较,如果能接收,就会执行catch里面的代码。

四、try...catch

4.1、如果try中没有遇到问题,怎么执行?

正常运行,不会运行catch里面的代码

4.2、如果try中可能会遇到多个问题,怎么执行?

有多少个异常类型就捕获多少个异常类型,但是正常运行时候第一个问题发生的时候就不回继续运行try里面的代码了。

如果我们要捕获多个异常,并且这些异常中如果存在父子关系的话,那么父类一定要写在下面。

java 复制代码
public static void main(String[] args){
    List<String> arr = new ArrayList<String>();
    arr.add("hello");
    List<String> arr1 = null;
    try {
        arr1.add("hello");
        System.out.println(arr.get(1));
    }catch (IndexOutOfBoundsException e){
        System.out.println("索引越界");
    }catch (NullPointerException n){
        System.out.println("空指针异常");//空指针异常
    }
    System.out.println(arr.get(0));//hello
}

4.3、如果try中遇到的问题没有被捕获,怎么执行?

没有捕获的话就相当于白写try...catch了,还是会调用JVM的异常处理,直接停止代码。

java 复制代码
public static void main(String[] args){
    List<String> arr = new ArrayList<String>();
    arr.add("hello");
    List<String> arr1 = null;
    try {
        arr1.add("hello");
    }catch (IndexOutOfBoundsException e){
        System.out.println("索引越界");
    }
    System.out.println(arr.get(0));//hello
}

4.4、如果try中遇到了问题,那么try下面的其他代码还会执行吗?

不会,会直接生成异常对象交给catch捕获。

五、异常常见方法

异常常见有三种方法,这三种方法都是定义在Throwable类当中的。

java 复制代码
public static void main(String[] args){
    List<String> arr = new ArrayList<String>();
    arr.add("hello");
    List<String> arr1 = null;
    try {
        arr1.add("hello");
    }catch (NullPointerException n){
        String message = n.getMessage();
        System.out.println("n.getMessage():"+message);//null
        String s = n.toString();
        System.out.println("n.toString():"+s);//java.lang.NullPointerException
        n.printStackTrace();//java.lang.NullPointerException at test.main(test.java:16)
    }
}

以上方法都不会停止JVM的运行

六、抛出异常

抛出异常有两个关键字 thorwsthorw
throws:写在方法定义处,表示声明一个异常。告诉调用者,使用本方法可能会有哪些异常
thorw:写在方法内,结束方法;手动抛出异常对象,交给调用者;方法中下面的代码不再执行了

相关推荐
时光の尘几秒前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
paopaokaka_luck2 分钟前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
以后不吃煲仔饭14 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师15 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者19 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
The_Ticker21 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
程序猿阿伟21 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
傻啦嘿哟39 分钟前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel
大数据编程之光43 分钟前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink
初九之潜龙勿用43 分钟前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net