异常处理机制


  • 抛出异常

  • 捕获异常

  • 异常处理的五个关键字

    • 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. linux安装mysql8.0

    linux 上安装mysql8.0 mysql版本8.0.16 MySQL Community 操作系统centos7 准备工作: mysql8.0 rpm文件 安装步骤: 1. 下载mysql的re ...

  2. 二叉树的建立与遍历(c语言)入门

    树其实在本质上就是一对多,链表就是一对一. 二叉树的建立: 这里的代码采用的是最粗暴的创建方法,无实际用处.但初次学习二叉树可以通过这个创建方法更好的理解二叉树. 二叉树的遍历: 遍历在大体上分为递归 ...

  3. 攻防世界 reverse 进阶 APK-逆向2

    APK-逆向2 Hack-you-2014 (看名以为是安卓逆向呢0.0,搞错了吧) 程序是.net写的,直接祭出神器dnSpy 1 using System; 2 using System.Diag ...

  4. 我叫小M,立志建立MySQL帝国。

    我是小M,我在卡拉巴拉星球. 我喜欢数据,我立志成为一个数据管理者. 所以我来 Y 公司应聘,听说他们的数据量挺大的. 面试过程还是挺简单的. 我用 007 这三个数字就轻易打败了一堆吹嘘 996 的 ...

  5. JAVA题目:小芳的妈妈每天给她2.5元,她都会存起来,但是,每当这一天是存钱的第五题或者5的倍数的话,她都会去用掉6块钱。 问:至少经过多少天可以存到100块?

    1 /*题目:小芳的妈妈每天给她2.5元,她都会存起来, 2 但是,每当这一天是存钱的第五题或者5的倍数的话, 3 她都会去用掉6块钱. 4 问:至少经过多少天可以存到100块? 5 */ 6 /*分 ...

  6. springboot的拦截器报错plicationFilterChain.java:193) ~[tomcat-embed-core-9.0.36.jar:9.0.36]

    解决方案: spingboot的拦截器"index.html"少"/",太粗心了

  7. 考前自救题库NABCD分析

    考前自救题库NABCD分析 项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-初次邂逅,需求分析 项目名称:考前自救题库(暂定) 项目简介:本产品计 ...

  8. BUAA_OO_第二单元

    BUAA_OO_2020_UNIT2 一.程序结构分析 第五次作业 UML & Mertrics ​ 电梯的调度问题,实质上就是任务的请求与分配问题,笔者在第五次作业中采用简单的"生 ...

  9. ATMS中去拉起新的进程,并在新进程启动后调用attachApplication时,resume待启动的Activity

    相关文章: ATMS中去pause Activity A. 目录 ATMS拉起新进程 堆栈 resumeTopActivityInnerLocked:1684, ActivityStack start ...

  10. aws eks 通过eksctl 创建nodegroup

    参考官方文档:https://eksctl.io/usage/managing-nodegroups/ 创建nodegroup命令 eksctl create nodegroup --cluster= ...