Java 异常的捕获与处理详解(二)
(一)、throws关键字
throws关键字主要是在定义上使用的,表示的是此方法中不进行异常处理,而交给被调用处处理。
例如:
class MyMath {
public int div(int x, int y) throws Exception {
return x / y;
}
}
现在div()方法之中抛出一个异常出来,表示所有异常交给被调用处进行处理。
class MyMath {
public int div(int x, int y) throws Exception {
return x / y;
}
}
public class Test {
public static void main(String args[]) {
try {
System.out.println(new MyMath().div(10, 0));
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
java.lang.ArithmeticException: / by zero
at MyMath.div(Test.java:3)
at Test.main(Test.java:10)
注意:在调用throws关键字声明方法的时候,一定要使用异常处理操作进行异常的处理,这属于强制性的处理。
而主方法本身也属于方法,那么在主方法上也可以继续使用throws进行异常的抛出:
class MyMath {
public int div(int x, int y) throws Exception {
return x / y;
}
}
public class Test {
public static void main(String args[]) throws Exception {
System.out.println(new MyMath().div(10, 0));
}
}
运行结果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at MyMath.div(Test.java:3)
at Test.main(Test.java:9)
这时主方法将异常继续向上抛,交给JVM进行异常的处理,也就是采用默认的方式,输出异常信息,而后结束程序执行。
注意:在实际开发中,主方法不要加throws,因为程序如果有异常,我们也希望可以正常的结束。
(二)throw关键字
之前所有异常类的对象都是由JVM自动进行实例化操作的,用户自己也是可以手工地抛出一个异常类实例化对象,就通过throw完成了。
public class Test {
public static void main(String args[]) {
try {
throw new Exception("自定义的异常");
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
java.lang.Exception: 自定义的异常
at Test.main(Test.java:4)
小结:throw和throws的区别?
(1)throw: 在方法体内使用,表示人为地抛出一个异常类对象(这个对象可以是自己实例化的,也可以是已经存在的)
(2)throws: 在方法的声明上使用,表示此方法中不进行异常的处理,而交给被调用处处理。
(三)、异常处理标准格式
我们有种感觉,finally和throw没有用处。现要求定义一个div()方法,这个方法有如下的一些要求:
(1)在进行除法操作之前,输出一行提示信息;
(2)在除法操作执行完毕后,输出一行提示信息;
(3)如果中间产生了异常,则应该交给被调用处来进行处理。
class MyMath {
// 出现异常要交给被调用处出,使用throws
public int div(int x, int y) throws Exception {
System.out.println("===== 计算开始 =====");
int result = 0;
try {
result = x / y; // 除法计算
} catch (Exception e) {
throw e; // 向上抛
} finally {
System.out.println("===== 计算结束 =====");
}
return result;
}
}
public class Test {
public static void main(String args[]) {
try {
System.out.println(new MyMath().div(10, 0));
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
===== 计算开始 =====
===== 计算结束 =====
java.lang.ArithmeticException: / by zero
at MyMath.div(Test.java:7)
at Test.main(Test.java:20)
以上代码也可以做一些简化:
class MyMath {
// 出现异常要交给被调用处出,使用throws
public int div(int x, int y) throws Exception {
System.out.println("===== 计算开始 =====");
int result = 0;
try {
result = x / y; // 除法计算
} finally {
System.out.println("===== 计算结束 =====");
}
return result;
}
}
public class Test {
public static void main(String args[]) {
try {
System.out.println(new MyMath().div(10, 0));
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
===== 计算开始 =====
===== 计算结束 =====
java.lang.ArithmeticException: / by zero
at MyMath.div(Test.java:7)
at Test.main(Test.java:18)
直接使用try…finally,不带有catch,那么就连处理的机会都没有了,所以不建议使用try…finally。标准格式是try…catch、finally、throws、throw一起使用。
(四)、RuntimeException类
先来观察一段代码
public class Test {
public static void main(String args[]) {
String str = "123";
int num = Integer.parseInt(str);
System.out.println(num * num);
}
}
运行结果:
15129
这个程序就是将一个字符串变为了基本数据类型,而后执行乘法操作,但是下面来看一下parseInt()方法定义:
public static int parseInt(String s) throws NumberFormatException
发现这个方法上抛出了一个NumberFormatException的异常,按照之前所讲,如果存在了throws,则必须使用try…catch进行处理,可是现在却没有强制要求处理,这是为什么呢?
来观察一下NumberFormatException的继承结构:
java.lang.Object
|- java.lang.Throwable
|- java.lang.Exception
|- java.lang.RuntimeException
|- java.lang.IllegalArgumentException
|- java.lang.NumberFormatException
发现NumberFormatException属于RuntimeException的子类,而在Java之中明确规定:对于RuntimeException的异常类型,在编译的时候不会强制性的要求用户处理,用户可以根据需要有选择性的来进行处理,在开发之中,如果没有处理,那么出现异常之后将交给JVM默认进行处理。也就是说,RuntimeException的子异常类,可以由用户根据需要有选择性的来进行处理。
小结:RuntimeException和Exception的区别?请列举出几个常见的RuntimeException.
(1)RuntimeException是Exception的子类;
(2)Exception定义了必须处理的异常,而RuntimeException定义的异常可以选择性的进行处理。
常见的RuntimeException:
NumberFormatException、ClassCastException、NullPointerException、ArithmeticException、ArrayIndexOutOfBoundsException。
五、assert关键字(断言)
Java中断言指的是程序执行到某行之后,其结果一定是预期的结果,而在JDK 1.4之后增加了一个assert关键字。
两种语法形式:
(1)形式一:
assert condition;
这里condition是一个必须为真(true)的表达式。如果表达式的结果为true,那么断言为真,并且无任何行动
如果表达式为false,则断言失败,则会抛出一个AssertionError对象。这个AssertionError继承于Error对象。
(2)形式二:
asser condition:expr;
这里condition是和上面一样的,这个冒号后跟的是一个表达式,通常用于断言失败后的提示信息,说白了,它是一个传到AssertionError构造函数的值,如果断言失败,该值被转化为它对应的字符串,并显示出来。
使用断言:
public class Test {
public static void main(String args[]) {
int x = 10;
// 假设经过了若干操作
assert x == 30 : "x的内容不是30";
System.out.println(x);
}
}
默认情况下,Java之中的断言,不会在正常执行的代码中出现,如果要想启用断言,则应该增加-ea选项:
java -ea Test
运行结果:
Exception in thread "main" java.lang.AssertionError: x的内容不是30
at Test.main(Test.java:5)
(六)、自定义异常
在Java之中本身已经提供了大量的异常类型,但是在开发之中,这些异常类型还不能满足于开发的需要。所以在一些系统架构之中往往会提供一些新的异常类型,来表示一些特殊的错误,而这种操作就称为自定义异常类,而要想实现这种自定义异常类,那么可以让一个类继承Exception或RuntimeException。
class MyException extends Exception { // 自定义异常类
public MyException(String msg) {
super(msg);
}
}
public class Test {
public static void main(String args[]) throws Exception {
throw new MyException("自己的异常类");
}
}
运行结果:
Exception in thread "main" MyException: 自己的异常类
at Test.main(Test.java:9)
参考链接: http://blog.csdn.net/wei_zhi/article/details/52837635
Java 异常的捕获与处理详解(二)的更多相关文章
- Java 异常的捕获与处理详解 (一)
一,异常的产生(Exception) 异常是程序之中导致程序中断的一种指令流,异常一旦出现并且没有进行合理处理的话,那么程序就会中断执行. An exception is a flow of inst ...
- “全栈2019”Java异常第二十章:自定义异常详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- Kotlin异常与Java异常的区别及注解详解
Kotlin异常与Java异常的区别: throw的Kotlin中是个表达式,这样我们可以将throw作为Elvis表达式[val test = aa ?: bb,这样的则为Elvis表达式,表示如果 ...
- Mysql高手系列 - 第20篇:异常捕获及处理详解(实战经验)
Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 这是Mysql系列第20篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符 ...
- java的集合框架最全详解
java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...
- 牛客网 Java 工程师能力评估 20 题 - 详解
牛客网 Java 工程师能力评估 20 题 - 详解 不知在看博客的你是否知道 牛客网,不知道就太落后了,分享给你 : 牛客网 此 20 题,绝对不只是 20 题! 免责声明:本博客为学习笔记,如有侵 ...
- 【转】Java魔法堂:String.format详解
Java魔法堂:String.format详解 目录 一.前言 二.重载方法 三.占位符 四.对字符.字符串进行格式化 五.对整数进行格式化 六. ...
- java线程池的使用与详解
java线程池的使用与详解 [转载]本文转载自两篇博文: 1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html ...
- JAVA通过JDBC连接Oracle数据库详解【转载】
JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.htm ...
随机推荐
- Django(part2)
admin site:django自带了admin site,我们需要创建能访问site的用户 #以交互的方式创建超级用户 manage.py createsuperuser 如果要把model加到a ...
- NEON基本知识
http://blog.csdn.net/EmSoftEn/article/details/51834171 http://blog.csdn.net/yxnyxnyxnyxnyxn/article/ ...
- Paper Reading: Relation Networks for Object Detection
Relation Networks for Object Detection笔记 写在前面:关于这篇论文的背景知识,请参考我前面的两篇随笔(<关于目标检测>和<关于注意力机制> ...
- express + jqPaginator 分页展示内容
写在前面的话 分页展示内容也是我们在页面开发中经常会遇到的需求 前端页面利用jqPaginator这个jquery插件来编写 后端利用mysql存储数据 开始敲代码 回顾sql知识 首先让我们回顾一下 ...
- 存储Hyper-V虚拟机的硬盘空间不足时的处理
存储Hyper-V虚拟机的硬盘空间严重不足时的处理 ==先导出虚拟机到空间足够的硬盘,再在空间足够的分区上导入虚拟机 方法如下: 导出虚拟机: 导出之前,我们先删除不需要的快照. 在Hyper-V ...
- POJ-1511 Invitation Cards 往返最短路 邻接表 大量数据下的处理方法
题目链接:https://cn.vjudge.net/problem/POJ-1511 题意 给出一个图 求从节点1到任意节点的往返路程和 思路 没有考虑稀疏图,上手给了一个Dijsktra(按紫书上 ...
- linux的一页是多大
命令 getconf PAGESIZE 结果为4096,即一页=4096字节=4KB(注意是Byte,1B=8bit) 在使用mmap映射函数时,它的实际映射单位也是以页为单位的,即不过我们把MAP_ ...
- win7休眠的开启与关闭方法命令行操作和图文结合的鼠标操作
win7休眠的开启与关闭方法 从開始菜单中找到"附件→命令提示符",手工输入例如以下命令:powercfg -a.从这里能够清楚的看到,计算机是支持休眠的.显示"尚未启用 ...
- pig 调试(explain&illerstrate)
grunt> cat t.txt kw1 2 kw3 1 kw2 4 kw1 5 kw2 2 cat test.pig A = LOAD '/user/input/t.txt' as (k:ch ...
- zzulioj--1804--ZY学长的密码(字符串)
1804: ZY学长的密码 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 140 Solved: 53 SubmitStatusWeb Board ...