异常处理机制


  • 抛出异常

  • 捕获异常

  • 异常处理的五个关键字

    • 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. 《逆向工程核心原理》——API HOOK

    编写dll处理hook逻辑,注入到目标进程,实现api hook. Windows10 notepad,通过hook kernel32.dll.WriteFile,实现小写字母转大写保存到文件. ho ...

  2. 浅析MyBatis(三):聊一聊MyBatis的实用插件与自定义插件

    在前面的文章中,笔者详细介绍了 MyBatis 框架的底层框架与运行流程,并且在理解运行流程的基础上手写了一个自己的 MyBatis 框架.看完前两篇文章后,相信读者对 MyBatis 的偏底层原理和 ...

  3. ffmpeg第五篇:让水印图片旋转起来

    这篇把上次挖的坑填上 ffmpeg正式篇的上一篇(传送门)说了,这一篇要让水印旋转起来,但是后面有事情一直没有时间搞,今天,它来了............ 如果想实现旋转的功能,需要使用ffmpeg过 ...

  4. Two point

    利用问题的本身与序列的特新,使用两个下标i, j对序列进行扫描(可以同向扫描,也可以反向扫描),以较低的时间复杂度解决问题,一般是O(n) 例1:给定一个递增的正整数序列和一个正整数M,求序列中的两个 ...

  5. HMS Toolkit助力开发者高效集成HMS Core

    当你的应用想集成华为HMS Core服务和上线华为应用市场,或当你已经开发了一个Android应用并集成了第三方移动服务,需要迁移使用HMS Core服务和上线华为应用市场的时候,如何快速.便捷.高效 ...

  6. 4. Linux-startx命令

    Linux系统startx命令的功能和使用方法 Linux系统命令startx的功能很简单,就是启动X Window的服务这一项,没有其他的了.其实startx命令启动的是xinit,然后再由xini ...

  7. xss-labs全关教程

    0x01 Level 1 查看源码,可以看到接收了name参数,并直接嵌入到HTML页面中了 没有任何过滤,而且直接会当作代码执行. 0x02 Level 2 先传入<script>ale ...

  8. OpenCV 之 空间刚体变换

    刚体就是 "刚性物体",它在运动过程中,内部各质点间的相对位置不会改变,也即 每两个质点间的距离 保持不变 假设刚体内任意两个质点,坐标分别为 $(x_1, y_1, z_1)$ ...

  9. C#如何优雅的多表读取

    关键词:C#.SqlDataReader.IDataReader.NextResult().Read(). Load().Dapper.多表,方便索引和搜索 最近有个需求,需要读一下模具系统的模具信息 ...

  10. 1090 Highest Price in Supply Chain

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...