Day015 异常处理机制
异常处理机制
抛出异常
捕获异常
异常处理的五个关键字
- 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函数捕获到异常时,会抛到调用该函数的方法中,在该方法中进行捕获处理。
遇到异常,就意味着你要进步了,这是一件好事。
Day015 异常处理机制的更多相关文章
- Java异常处理机制 try-catch-finally 剖析
Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...
- JAVA 异常处理机制
主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...
- 深入理解java异常处理机制
异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...
- C++学习笔记27:异常处理机制
一.异常处理机制基础 异常的定义 程序中可以检测的运行不正常的情况 异常处理的基本流程 某段程序代码在执行操作时发生特殊情况,引发一个特定的异常 另一段程序代码捕获该异常并处理它 二.异常的引发 th ...
- C++中的异常处理机制
C++中的捕获异常机制catch参数中实参的类型不同,采取的处理方式则不相同,且与普通的函数调用还不一样,具体表现为当抛出异常throw A()或throw obj时,对象会进行一次额外的对象复制操作 ...
- 16、java中的异常处理机制
异常:就是程序在运行时出现不正常情况.异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象. 其实就是java对不正常情况进行描述后的对象体现. 对于问题的划 ...
- Struts——(四)异常处理机制
在通常的情况下,我们得到异常以后,需要将页面导航到一个错误提示的页面,提示错误信息.利用Stuts我们可以采用两种方式处理异常: 1.编程式异常处理 即我们在Action中调用业务逻辑层对象的方法时, ...
- Java面向对象编程之异常处理机制
一:Java的异常处理机制的优点: 1:把各种不同情况的异常情况分类,使用JAVA类来表示异常情况,这种类被称为异常类.把各种异常情况表示成异常类,可以充分的发挥类的可扩展性和可重用性. 2:异常流程 ...
- Java之异常处理机制
来源:深入理解java异常处理机制 2.Java异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 ...
随机推荐
- SparkSQL中产生笛卡尔积的几种典型场景以及处理策略
[前言:如果你经常使用Spark SQL进行数据的处理分析,那么对笛卡尔积的危害性一定不陌生,比如大量占用集群资源导致其他任务无法正常执行,甚至导致节点宕机.那么都有哪些情况会产生笛卡尔积,以及如何事 ...
- C++11多线程编程(常见面试题)
[题目1] 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码 [题解] 首先我们来分析一下这道题...( ...
- 使用C# (.NET Core) 实现模板方法模式 (Template Method Pattern)
本文的概念内容来自深入浅出设计模式一书. 项目需求 有一家咖啡店, 供应咖啡和茶, 它们的工序如下: 咖啡: 茶: 可以看到咖啡和茶的制作工序是差不多的, 都是有4步, 其中有两步它们两个是一样的, ...
- Java例题_39 判断奇偶后分数累加
1 /*39 [程序 39 分数累加] 2 题目:编写一个函数,输入 n 为偶数时,调用函数求 1/2+1/4+...+1/n,当输入 n 为奇数时,调用函数 3 1/1+1/3+...+1/n 4 ...
- Linux性能优化:内存使用情况分析
Blog:博客园 个人 目录 什么是内存 Linux内存回收机制 查看Linux内存情况 查看/proc/meminfo 使用free命令查看 Buffer和Cache Swap 内存泄漏和内存溢出 ...
- 系统编程-信号-总体概述和signal基本使用
信号章节 -- 信号章节总体概要 信号基本概念 信号是异步事件,发送信号的线程可以继续向下执行而不阻塞. 信号无优先级. 1到31号信号是非实时信号,发送的信号可能会丢失,不支持信号排队. 31号信号 ...
- 加快Python运行速度
01 使用哈希表的数据结构 如果在程序中遇到大量搜索操作时,并且数据中没有重复项,则可以使用查找而不是循环.举例如下: items = ['a', 'b',..,'100m'] #1000s of i ...
- Golang 基于Prometheus Node_Exporter 开发自定义脚本监控
Golang 基于Prometheus Node_Exporter 开发自定义脚本监控 公司是今年决定将一些传统应用从虚拟机上迁移到Kubernetes上的,项目多而乱,所以迁移工作进展缓慢,为了建立 ...
- 删除文件--rm
rm file 删除文件 rm -r dir 删除指定文件夹及文件夹下的所有内容 rm -rf dir 强制删除指定文件夹及文件夹下的所有内容
- ICMP主机探测过程
#1from scapy.all import * from random import randint from optparse import OptionParser #2 对用户输入的参数进行 ...