异常处理机制


  • 抛出异常

  • 捕获异常

  • 异常处理的五个关键字

    • try:监控一个代码块,有异常就能通过catch捕获
    • catch(想要捕获的异常类型):捕获想要捕获的异常,catch代码块的代码只有在捕获到异常才执行
    • finally:处理善后工作。不管有没有捕获到异常,finally代码块的代码都会执行
    • throw用来抛出一个具体的异常类型(用在方法体中,使用throw一定会抛出一个异常)
    • throws用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁。(用在方法声明后面,表示可能会抛出异常,不一定会抛出)**

如何抛出和捕获异常


首先,我们来先看一个异常

public static void main(String[] args) {
int a=1;
int b=0; System.out.println(a/b);
}

输出结果

Exception in thread "main" java.lang.ArithmeticException: / by zero

用try catch捕获这个异常

public static void main(String[] args) {
int a = 1;
int b = 0; try {
System.out.println(a / b);
} catch (ArithmeticException e) {
System.out.println("程序出现异常:"+e);
} finally {
System.out.println("finally");
}
}

输出结果

程序出现异常:java.lang.ArithmeticException: / by zero
finally

接下来我们把b改为1试一下

public static void main(String[] args) {
int a = 1;
int b = 1; try {
System.out.println(a / b);
} catch (ArithmeticException e) {
System.out.println("程序出现异常:" + e);
} finally {
System.out.println("finally");
}
}

输出结果:

1
finally
  • 可以发现如果没有捕获到异常,catch代码块是不会执行的,而finally代码块不管有没有捕获到异常都会执行。
  • 通常try和catch一起使用,finally可以不要,finally最常用在一些I/O流、资源类的使用后的关闭工作。

接下来,我们再看一个异常

public class Test {
public static void main(String[] args) {
new Test().a();
} public void a(){
b();
} public void b(){
a();
}
}

输出结果

Exception in thread "main" java.lang.StackOverflowError

​ 因为a调b,b调a,程序陷入死循环,最终导致栈溢出了,接下来我们用上面的方式捕获异常

public class Test {
public static void main(String[] args) {
try {
new Test().a();
} catch (ArithmeticException e) {
System.out.println("程序出现异常:" + e);
} finally {
System.out.println("finally");
}
} public void a(){
b();
} public void b(){
a();
}
}

输出结果

finally
Exception in thread "main" java.lang.StackOverflowError

可以发现没有捕获到异常,这是因为这个异常不是ArithmeticException,而是StackOverflowError,所以当然就捕获不到,接下来回顾一下异常类

我们知道了这是个栈溢出异常,要用StackOverflowError或者它的父类来捕获,假设我不知道它会抛出什么异常,我直接用异常的超类Throwable捕获也是可以的。

public class Test {
public static void main(String[] args) {
try {
new Test().a();
} catch (Throwable e) {
System.out.println("程序出现异常:" + e);
} finally {
System.out.println("finally");
}
} public void a(){
b();
} public void b(){
a();
}
}

输出结果

程序出现异常:java.lang.StackOverflowError
finally

捕获多个异常


还是上面的例子,这次我们捕获多个异常,我们知道Error和Throwable都能捕获到异常

public class Test {
public static void main(String[] args) {
try {
new Test().a();
} catch (Exception e) {
System.out.println("Exception捕获:" + e);
} catch (Error e) {
System.out.println("Error捕获:" + e);
} catch (Throwable e) {
System.out.println("Throwable捕获:" + e);
} finally {
System.out.println("finally");
}
} public void a() {
b();
} public void b() {
a();
}
}

输出结果:

Error捕获:java.lang.StackOverflowError
finally

​ 我们发现只被Error捕获,多个catch最终只有一个catch捕获到异常,接下来我们把Error和Throwable调换一下

public class Test {
public static void main(String[] args) {
try {
new Test().a();
} catch (Exception e) {
System.out.println("Exception捕获:" + e);
} catch (Throwable e) {
System.out.println("Throwable捕获:" + e);
} catch (Error e) {//编译报错了Exception 'java.lang.Error' has already been caught
System.out.println("Error捕获:" + e);
} finally {
System.out.println("finally");
}
} public void a() {
b();
} public void b() {
a();
}
}

​ 直接编译报错了Exception 'java.lang.Error' has already been caught,因为我们已经通过Throwable先捕获异常了,而Error是Throwable的子类,所以这个Error的catch永远不会被执行。因此捕获多个异常应该按从小(异常子类)到大(异常父类)的顺序捕获


快速捕获异常快捷键

  • 选中需要捕获异常的代码,ctrl+alt+t

throw主动抛出异常


我们程序中一些我们已经预知的异常,我们可以通过throw主动抛出

以第一个异常为例,我们都知道除数为0肯定是异常,我们就可以自己抛出

public static void main(String[] args) {
int a=1;
int b=0;
try {
if(b==0){
throw new ArithmeticException("除数为0");//主动抛出异常
}
System.out.println(a/b);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}

输出结果

java.lang.ArithmeticException: 除数为0
at com.dwy.exception.Test2.main(Test2.java:10)

throws抛出异常


我们写一个打印两个数相除的结果的方法

public class Test3 {
public static void main(String[] args) {
int a=1;
int b=0; try {
new Test3().printDivide(a,b);
} catch (ArithmeticException e) {
e.printStackTrace();
}
} //打印两个数相除的结果
public void printDivide(int a,int b) throws ArithmeticException{
System.out.println(a/b);
}
}

输出结果

java.lang.ArithmeticException: / by zero
at com.dwy.exception.Test3.printDivide(Test3.java:17)
at com.dwy.exception.Test3.main(Test3.java:9)

在printDivide函数捕获到异常时,会抛到调用该函数的方法中,在该方法中进行捕获处理。

遇到异常,就意味着你要进步了,这是一件好事。

狂神说java

Day015 异常处理机制的更多相关文章

  1. Java异常处理机制 try-catch-finally 剖析

    Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...

  2. JAVA 异常处理机制

    主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...

  3. 深入理解java异常处理机制

       异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...

  4. C++学习笔记27:异常处理机制

    一.异常处理机制基础 异常的定义 程序中可以检测的运行不正常的情况 异常处理的基本流程 某段程序代码在执行操作时发生特殊情况,引发一个特定的异常 另一段程序代码捕获该异常并处理它 二.异常的引发 th ...

  5. C++中的异常处理机制

    C++中的捕获异常机制catch参数中实参的类型不同,采取的处理方式则不相同,且与普通的函数调用还不一样,具体表现为当抛出异常throw A()或throw obj时,对象会进行一次额外的对象复制操作 ...

  6. 16、java中的异常处理机制

    异常:就是程序在运行时出现不正常情况.异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象. 其实就是java对不正常情况进行描述后的对象体现. 对于问题的划 ...

  7. Struts——(四)异常处理机制

    在通常的情况下,我们得到异常以后,需要将页面导航到一个错误提示的页面,提示错误信息.利用Stuts我们可以采用两种方式处理异常: 1.编程式异常处理 即我们在Action中调用业务逻辑层对象的方法时, ...

  8. Java面向对象编程之异常处理机制

    一:Java的异常处理机制的优点: 1:把各种不同情况的异常情况分类,使用JAVA类来表示异常情况,这种类被称为异常类.把各种异常情况表示成异常类,可以充分的发挥类的可扩展性和可重用性. 2:异常流程 ...

  9. Java之异常处理机制

    来源:深入理解java异常处理机制 2.Java异常    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 ...

随机推荐

  1. unbutu系统扩展磁盘大小

    建议下载一个可视化工具,这样的话就更不容易出错 sudo apt install gparted 在终端中运行这条命令就可安装可视化工具 fdisk -l 在终端中输入这条命令来查看自己系统所挂载的磁 ...

  2. L3-021 神坛 (叉积排序+向量积求面积)

    题目链接 https://pintia.cn/problem-sets/994805046380707840/problems/994805046577840128 题意:给定n个点求三角形最小面积: ...

  3. Hystrix 实战经验分享

    一.背景 Hystrix是Netlifx开源的一款容错框架,防雪崩利器,具备服务降级,服务熔断,依赖隔离,监控(Hystrix Dashboard)等功能. 尽管说Hystrix官方已不再维护,且有A ...

  4. 【pytorch学习笔记0】-CNN与LSTM输入输出维度含义

    卷积data的四个维度: batch, input channel, height, width Conv2d的四个维度: input channel, output channel, kernel, ...

  5. XML数据持久化学习笔记

    一.XML基础语法 1.XML结构:XML是一种树结构的文本 2.XML注释:格式:<!--在其中书写注释-->,在注释中可以单行注释也可以多行注释 3.固定内容:<?xml ver ...

  6. Android学习之在Adapter中调用Fragment

    •前言 在学习<第一行代码>,4.5 小节--一个简易版的新闻应用的时候: 在为 RecyclerView 创建适配器的时候: 作者直接在 NewsTitleFragment.java 中 ...

  7. 全网最详细的Linux命令系列-iptrad-ng网络流量监测命令

    观察网络流量的工具:IPTRAF 想知道你的Linux系统上网络流量有多大吗?想知道是哪一块网卡承载着网络流量吗?想知道哪一个进程产生了网络流量吗?iptraf可以帮你做到.在最新的Linux rel ...

  8. 从一个Demo开始,揭开Netty的神秘面纱

    本文是Netty系列第5篇 上一篇文章我们对于I/O多路复用.Java NIO包 和 Netty 的关系有了全面的认识. 到目前为止,我们已经从I/O模型出发,逐步接触到了Netty框架.这个过程中, ...

  9. 干货满满 AppGallery Connect研习社·直播深度解析优质应用开发流程

  10. mybatis的本质和原理

    背景 项目需要,我们需要自己做一套mybatis,或者使用大部分mybatis的原始内容.对其改造,以适应需要.这就要求我再次学习一下mybatis,对它有更深入的了解. 是什么    MyBatis ...