什么是异常

在程序运行时打断正常程序流程的任何不正常的情况称为错误或异常。异常包括用户造成的异常和

系统造成的异常。

例如:网络连接中断、操作符越界、加载的类找不到

异常产生的原因和分类

1. 异常产生的原因

在Java中异常产生,主要是有三种原因:

  • 编写程序代码中的错误产生的异常,比如数组越界、空指针异常等,这种异常叫做未检查的异常,一般需要在类中处理这些异常

  • Java内部错误发生的异常,Java虚拟机产生异常

  • 通过throw(抛出异常)语句手动生成的异常,这种异常叫做检查的异常,一般是用来给方法调用者一些必要的信息

2.异常分类

Throwable:是异常类根类,其派生出两个重要的子类, Error 和 Exception

  • Exception类 表示可预料异常,可以处理或恢复;
  • Error类 表示不可预料异常,不能处理或恢复。

异常处理方法

1.捕获并处理异常

try-catch-finally语句

try-catch-finally语句捕获程序中产生的异常,然后针对不同的情况采取不同的处理程序进行处理。

try-catch-finally语句基本格式
try{
Java statements //一条或多条可能抛出异常的Java语句
}catch(Exception e){
Java statements //Exception类型的异常(所有可处理的异常)执行的代码
}finally{
//无论是否存在异常,始终被执行的代码
}
执行情况:
  • 情况1:try块中代码没有出现异常,不执行catch块代码,执行catch块后面的代码;
  • 情况2:try块中代码出现异常,catch中异常类型匹配(相同或者父类),Java会生成相应的异常对象,Java系统寻找匹配的catch块。执行catch块后面的代码,try块中代码不会执行;
  • 情况3:try块中代码出现异常,catch中异常类型不匹配,不执行catch块代码,只执行finally{}中的代码,不执行catch块后其他的代码。
  • 情况4:一段代码可能会引发多种类型的异常,当引发异常时,会按顺序来查看每个 catch 的异常类型,并只执行第一个与异常类型匹配的 catch 中的异常处理代码,其他的 catch 中的异常处理代码将不会执行

注:catch块中如何处理异常:其中一种方式——自定义内容输出

例1:情况1

public class ExceptionDemo01 {
public static void main(String[] args) {
int a =10;
int b = 2;
try {
int c = a / b;
System.out.println(c);
} catch (ArithmeticException e) { //捕获ArithmeticException异常,对于初学者来说,建议直接写Exception,因为它可以捕获所有异常
System.out.println("除数不能为0");
}finally {
System.out.println("程序结束");
}
}
}
//运行结果:
5
程序结束

例2:情况2

public class ExceptionDemo01 {
public static void main(String[] args) {
int a =10;
int b = 0;
try {
int c = a / b; //除数为0,出现异常
System.out.println(c);
} catch (ArithmeticException e) { //catch中异常类型匹配,执行catch块后面的代码
System.out.println("除数不能为0");
}finally {
System.out.println("程序结束");
}
}
}
//运行结果
除数不能为0
程序结束

例3:情况3

import java.util.InputMismatchException;

public class ExceptionDemo01 {
public static void main(String[] args) {
int a =10;
int b = 0;
try {
int c = a / b; //除数为0,出现异常
System.out.println(c);
} catch (InputMismatchException e) { //catch中异常类型不匹配,不执行catch块代码
System.out.println("除数不能为0");
}finally { //执行
System.out.println("程序结束");
} System.out.println("程序结束0000"); //不执行
}
}
//运行结果
程序结束

2.将方法中的异常抛出

两种抛出异常方式:throw和throes

throw用于在代码中抛出异常

格式如下:

throw new 异常类型;

throws用于在方法中抛出异常

格式如下:

方法名() throws 异常类型{
//方法体
}

例:

//提取一个方法:两个数相除
public static void devide() throws Exception { //throws
int a =10;
int b = 0;
if(b == 0) { //如果b等于0,抛出异常
//人为制造异常对象
throw new Exception("除数不能为0"); //throw
}else {
System.out.println("两个数相除:"+a/b); }
}
throw和throws的区别:
  • 位置不同:throw在方法内部;throws在方法的声明处
  • 内容不同:throw + 异常对象;throws + 异常类型
  • 作用不同:throw:异常出现的源头,制造异常;throws在方法声明处,告诉方法调用者,这个方法可能会出现我声明的这些异常。然后调用者对这个异常进行处理:要么自己处理要么继续向外抛出异常。

异常的传播

当某个方法抛出异常时,如果当前方法没有捕获异常,异常就会抛到上层调用方法,知道遇到某个try...catch被捕获为止。

public class Main{
try{
process1();
}catch(Exception e){
e.printStackTrace();
}
} static void process1(){
process2();
} static void process2(){
lnteger.parselnt("abc"); //抛出异常
}
printStackTrace()方法

可以打印出方法的调用栈,对于调试错误非常有用(每层方法调用均给出了源代码的行号,可以直接定位产生异常的代码位置

Java异常结构图

Exception的分类

RuntimeException 运行时异常(非检查型异常)

编译器不强制处理异常。常见运行时异常(非检查型异常)

NullpointerException:空指针异常
ClassCastException:类型强制转换异常
IllegalArgumentException:传递非法参数异常
IndexOutOfBoundsException:下标越界异常
NumberFormatException:数字格式异常
ArrayIndexOutOfBoundsException: 数组越界异常。
ArrayStoreException:数组类型不一致异常
ArithmeticException:算术异常(除0异常)
BufferOverflowException:缓冲区溢出异常

CheckedException 非运行时异常(检查型异常)

编译器强制处理异常,否则显示编译错误。常见非运行时异常 (检查型异常):

ClassNotFoundException:找不到指定 class 异常
IOException:IO 操作异常
FileNotFoundException:文件不存在异常
SQLException:SQL语句异常
InterruptedException:中断异常

异常处理机制的特点

  1. 通过异常传播可以将异常传递到合适的位置再处理,使得Java语言的异常处理更加灵活;
  2. 可以在源代码级别将正在执行的逻辑代码和异常处理的代码相分离,更加便于代码阅读和维护;
  3. 过度使用异常处理将降低程序的执行效率,增加语法的复杂度。

Java异常 小白版的更多相关文章

  1. 常见 Java 异常解释(恶搞版)

    常见 Java 异常解释:(译者注:非技术角度分析.阅读有风险,理解需谨慎o(╯□╰)o) java.lang ArithmeticException 你正在试图使用电脑解决一个自己解决不了的数学问题 ...

  2. 【译】常见 Java 异常解释(恶搞版)

    常见 Java 异常解释:(译者注:非技术角度分析.阅读有风险,理解需谨慎o(╯□╰)o) java.lang ArithmeticException 你正在试图使用电脑解决一个自己解决不了的数学问题 ...

  3. 《Thinking In Java第四版》拾遗

    <Thinking In Java第四版>拾遗 转自我的github(http://katsurakkkk.github.io/2016/05/Thinking-In-Java%E7%AC ...

  4. 《Effective Java(中文第二版)》【PDF】下载

    <Effective Java(中文第二版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382186 Java(中文第二版)& ...

  5. 《Effective Java中文版第二版》读书笔记

    说明 这里是阅读<Effective Java中文版第二版>的读书笔记,这里会记录一些个人感觉稍微有些重要的内容,方便以后查阅,可能会因为个人实力原因导致理解有误,若有发现欢迎指出.一些个 ...

  6. java(异常体系及权限修饰符)

    java异常体系 异常的体系: 异常体系: --------| Throwable 所有错误或者异常的父类 --------------| Error(错误) --------------| Exce ...

  7. 模拟实现 Promise(小白版)

    模拟实现 Promise(小白版) 本篇来讲讲如何模拟实现一个 Promise 的基本功能,网上这类文章已经很多,本篇笔墨会比较多,因为想用自己的理解,用白话文来讲讲 Promise 的基本规范,参考 ...

  8. java异常有效实践

    异常在我们的平时开发过程中是非常寻常并且经常会面对的,我们有很多方式来处理和使用异常.充分发挥异常的优点可以提高程序的可读性,可靠性和可维护性.但是如果使用不当,也会带来很多负面影响. 参考 effe ...

  9. 《Head First Java(第二版)》中文版 分享下载

    书籍信息 书名:<Head First Java(第二版)>中文版 作者: Kathy Sierra,Bert Bates 著 / 杨尊一 编译 张然等 改编 豆瓣评分:8.7分 内容简介 ...

  10. Java 异常面试题(2020 最新版)

    Java异常架构与异常关键字 Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制. Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程 ...

随机推荐

  1. 5分钟了解LangChain的路由链

    上上篇文章<5分钟理透LangChain的Chain>里用到了顺序链SequentialChain,它可以将多个链按顺序串起来.本文介绍LangChain里的另外1个重要的链:路由链. 1 ...

  2. 【ZeroMQ】zguide 第一章 部分翻译

    为了更好的阅读体验,请点击这里 本文大部分内容翻译自 Chapter 1 - Basics,原因是之前翻译的版本太老了,不得不亲自披挂上阵拿机器翻译一下.只截取了部分自己可能用得到的,所以如果有看不太 ...

  3. SSH免登陆要点

    A要登录到B,则A把自己的公钥发送给B. 涉及到RSA加密:非对称算法,即用一把公钥加密,就必须用一把对应的私钥解密:用私钥签名,就必须用公钥解签名. 签名:为了身份的防篡改. 加密:为了数据的安全性 ...

  4. 移动web布局方法

    继续更新移动端的一个布局,这也是经典中的经典,当初只知道个rem和vwvh适配,其实这里面还有很多的门道不只是一个适配这么简单 一.前置 1.背景缩放 我们都知道做移动端,给的图都是二倍图,你拿来用直 ...

  5. SQLServer统计采集数据库相关信息

    在MS Sql Server中可以能过以下的方法查询出磁盘空间的使用情况及各数据库数据文件及日志文件的大小及使用利用率: 1.查询各个磁盘分区的剩余空间:Exec master.dbo.xp_fixe ...

  6. P9376 题解

    首先考虑怎么暴力. 考虑把每个数进行 \(B\) 进制分解,然后我们惊奇的发现这两个操作就是把最低位去掉和往最低位后面插入一个数. 然后我们顺藤摸瓜,把每个数的分解扔到 Trie 树上,我们发现我们要 ...

  7. 基于python3 flet库的证书查看工具

    前言 基于python3 flet库实现了证书信息的提取,留作自用,如有错误欢迎指正. 正文 程序架构: 主程序 main.py 证书解析程序 certHandle.py 运行 python main ...

  8. Java中的泛型(类、接口、方法)

    一.泛型概述 1. 什么是泛型? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数.在调用普 ...

  9. SpringBoot集成ShardingSphere分表中间件

    ShardingSphere简介 ShardingSphere 由 JDBC.Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成. 它们均提供标准化的基 ...

  10. vue 理解yarn start 和yarn dev的区别

    yarn dev,当文件变动后,会自动重启. yanr start不会自动重启 nodemon会监听文件变动,跟yarn dev和yarn start无关.