04 - JavaSE之异常处理
异常的概念(运行期出现的错误)
java 异常是 java 提供的用于处理程序中错误的一种机制。
所谓的错误是指在程序运行的过程中发生的一些异常事件。(如:除0溢出,数组下标越界,所要读取的文件不存在)
设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。
java 程序的执行过程中如果出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息并将被提交给java运行时系统,这个过程被称为抛出(throw)异常。
当 java 运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象叫给其处理,这一过程称为捕获(catch)异常。
try里面编写可能抛出异常的代码,catch编写捕获异常后处理的代码。
把发生异常的堆栈打印出来:e.printStackTrace();
异常的分类
- 异常根类 Throwable 分子类 Error + Exception

Error 是系统内部错误(虚拟机生成并抛出,包括动态链接失败,虚拟机错误等,程序不对其做处理)。
Exception是我们可以处理的所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显式的声明或捕获。
Exception 分 RuntimeException(运行期异常)+ 其他。
RuntimeException:一类特殊的异常,如除0异常,数组下标越界等,其产生的比较频繁,处理麻烦,如果显式的声明或者捕获将会对程序的可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序,用户可以catch,也可以不catch。
void m(int i) throws ArithmeticException {
if(0==i) {
throw new ArithmeticException("除0异常 1th");
}
}
public class Test {
public static void main(String[] args) {
try {
Test t = new Test();
t.m(0);
}
catch (Exception e) {
System.out.println("除0异常 2th");
}
}
}
- 常见异常类型举例:
- ArithmeticException
int i = 1;
int k = 0;
int m = i/k;
- NullPointerException
String s = null;
int l = s.length();
- ClassCastException
Object o = new Object();
String s = (String)o;
int l = s.length();
- NegativeArraySizeException
int len = -1;
int[] a = new int[len];
a[0] = 0;
- ArrayIndexOutOfBoundsException
int len = 10;
int[] a = new int[len];
a[10] = 10;
异常的捕获和处理
- try语句:
- try语句制定了一段代码,该段代码就是一次捕获并处理的例外的情况。
- 在执行的过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做相应的处理。
- 如果没有例外产生,所有的catch代码段都被忽略不执行。
- catch语句:
- 在catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。
- 在catch中声明的异常对象(catch (someExpresion e))封装了异常事件发生的信息,在catch语句块中可以使用这个对象的一些方法获取这个信息:例如:getMessage(); 用来得到有关异常事件的信息;printStackTrace();用来跟踪异常事件发生时执行堆栈的内容。
- finally语句:
- catch语句块后面可以跟上一个finally语句块。
- finally语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能对程序的状态作统一的管理。
- 无论try所指向的程序是否抛出异常,finally所指定的代码都要被执行。
- 通常在finally语句中可以进行资源的清理工作。如:关闭打开的文件;删除临时文件等。
FileInputStream in = null;
try {
in = new FileInputStream("myfile.txt");
int b = 0;
b = in.read();
while(-1 != b) {
System.out.print((char)b);
b = in.rasd();
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
System.out.println(e.getMessage());
}
finally {
try {
in.clsoe();
}
catch (IOException e) {
e.printStackTrace();
}
}
异常的抛出
public void someMethod() throws someExpresion {
if(someCondition()) {
throw new someExpresion("错误原因"); // 然后在某种情况下抛出这种异常
}
}
try {
someMethod(); // 调用该方法时试图捕获异常
}
catch(someExpresion e) {
// 异常处理代码
}
**
Tips:
- public void someMethod() throws someExpresion:
throws写在后面声明该方法可能抛出异常(由系统自动抛出异常),如果写了这句话,对于RuntimeException 则可以不catch,其他的异常则需要写try catch,如果你不想写try catch,则你可以再继续往外抛(在方法后面写throws)。
2.throw new someExpresion("错误原因");
表示的是手动抛出异常。
**
public class Test {
public static void main(String[] args) {
Test t = new Test();
try {
t.method1();
} catch (someException e) {
e.printStackTrace();
}
}
public void method1() throws someException {
method2();
}
public void method2() throws someException {
method3();
}
public void method3() throws someException {
throw new someException("someException occur in method3.");
}
}
注意
- 执行throw语句之后,运行流程立即停止(如上第一份代码第二个End未打印)。然后系统立即检查是否有能够匹配的catch语句块,如果找到则执行对应的catch语句块,如果找不到则转向上一层的try语句块并继续查找对应的catch语句块,如果一直找不到对应的catch语句块,则异常对象被抛到系统异常处理。
public class Test {
public static void pro(String s) {
if(s != null) {
System.out.println(s);
}
else {
throw new NullPointerException("Ooops!, s is null.");
}
System.out.println("End");
}
public static void main(String[] args) {
try {
pro("Hello Java");
pro(null);
}
catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
/*
打印结果:
Hello Java
End
Ooops!, s is null.
*/
- catch时注意:应该先捕获小的,再捕获大的,否则编译报错。
catch (NullPointerException e) {
System.out.println("NullPointerException");
}
catch (Exception e) {
System.out.println(e.getMessage());
}
使用自定义的异常
使用自定义异常一般有如下步骤:
通过集成 java.lang.Exception 类声明自己的异常类。
在方法适当的位置生成自定义异常的实例,并用 throw 语句抛出。
在方法的声明部分用 throws 语句声明该方法可能抛出的异常。
class MyException extends Exception {
private int id;
public MyException(String message, int id) {
super(message);
this.id = id;
}
public int getId() {
return id;
}
}
public class Test {
public void regist(int num) throws MyException {
if(num < 0) {
throw new MyException("人数为负。", 3);
}
System.out.println("登记人数:" + num);
}
public void manager() {
try {
regist(100);
}
catch (MyException e) {
System.out.println("登记失败,出错类型码:" + e.getId());
e.printStackTrace();
}
System.out.println("操作结束");
}
public static void main(String[] args) {
Test t = new Test();
t.manager();
}
}
异常与继承
重写方法需要抛出与原方法所抛出异常类型一致的异常或不抛出异常。
例如:
class A {
public void method() throws IOException {...}
}
class B1 extends A {
public void method() throws FileNotFoundException {...} // 范围小了,错误
}
class B2 extends A {
public void method() throws Exception {...} // 范围大了,错误
}
class B3 extends A {
public void method() {...} // 正确
}
class B3 extends A {
public void method() throws IOException, MyException{...} // 错误
}
04 - JavaSE之异常处理的更多相关文章
- Java匹马行天下之JavaSE核心技术——异常处理
Java匹马行天下之JavaSE核心技术——异常处理 异常的简介 在Java中,异常就是Java在编译.运行或运行过程中出现的错误. 程序错误分为三种:编译错误.运行时错误和逻辑错误 编译错误是因为程 ...
- JAVASE(十三) 异常处理
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.异常体系结构 说明: |-----Throwable |-----Error :没针对性代码进行 ...
- 第6章 AOP与全局异常处理6.1-6.4 慕课网微信小程序开发学习笔记
第6章 AOP与全局异常处理 https://coding.imooc.com/learn/list/97.html 目录: 第6章 AOP与全局异常处理6-1 正确理解异常处理流程 13:236-2 ...
- 第6章 AOP与全局异常处理6.5-6.11 慕课网微信小程序开发学习笔记
https://coding.imooc.com/learn/list/97.html 目录: 第6章 AOP与全局异常处理6-1 正确理解异常处理流程 13:236-2 固有的处理异常的思维模式与流 ...
- Java基础10:全面解读Java异常
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- 马士兵Java视频教程 —— 学习顺序
第一部分:J2se学习视频内容包括: 尚学堂科技_马士兵_JAVA视频教程_JDK5.0_下载-安装-配置 尚学堂科技_马士兵_JAVA视频教程_J2SE_5.0_第01章_JAVA简介_源代码_及重 ...
- PHP 7.0 安装使用与性能监测!
PHP 7.0发布,网上关于新版的介绍很多,介于 7.0 在正式发布之前已经发过若干个 Beta.8个 RC,应该不会出现重大问题.今日我将一台机器升级至 PHP 7.0 并将有关信息记录如下. 本人 ...
- java初学者必看的学习路线
不管在编程语言的排行榜中,还是在大多数企业应用的广泛程度来看,Java一直都是当之无愧的榜首.Java语言有着独特的魅力吸引着广大的年轻人去学习,每个人学习的方式方法不一样. 第一步:首先要做好学习前 ...
- [转载]马士兵Java视频教程 —— 学习顺序
书(Java核心编程)+视频..这样学感觉比较好.. 原文地址:马士兵Java视频教程 —— 学习顺序作者:习惯 第一部分:J2se学习视频内容包括: 尚学堂科技_马士兵_JAVA视频教程_JDK5. ...
随机推荐
- 阿里云对象存储oss上传文件夹
最近公司做工程项目,实现文件夹云存储上传. 网上找了一天,发现网上很多代码都存在相似问题,最后终于找到了一个满足我需求的项目. 工程如下: 这里对项目的大文件传输功能做出分析,怎么实现文件夹上传的,如 ...
- Group精确定位(canvas定位)
## <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> &l ...
- 笔记 Bioinformatics Algorithms Chapter1
Chapter1 WHERE IN THE GENOME DOES DNA REPLICATION BEGIN 一. ·聚合酶启动结构域会结合上游序列的一些位点,这些位点有多个,且特异,并且分布 ...
- 常用模块xml,shelve,configparser,hashlib
XML 什么XML:全称 可扩展标记语言 标记指的是代表某种含义的字符 XML<> 为什么需要XML 为能够在不同的平台间继续数据的交换 为了使交换的数据能让对方看懂 就需要按照一定的语法 ...
- ADALINE小demo
线性逼近 clear;clc;close all x = [1,0.5; 1.5,1.1; 3,3; -1.2,-1]; y = x(:,2); x = [ones(size(x,1),1),x(:, ...
- Codeforces Round #264 (Div. 2) C. Gargari and Bishops 主教攻击
http://codeforces.com/contest/463/problem/C 在一个n∗n的国际象棋的棋盘上放两个主教,要求不能有位置同时被两个主教攻击到,然后被一个主教攻击到的位置上获得得 ...
- codeforces 477D
题意:给定一个长度<=5000的二进制字符串S,以及一个初始为0的n,有一下两种操作: 1. 输出n(n>=1并且为2进制形式输出) 2.n=n+1 每次选择一种操作.. 求:1.有多少方 ...
- [jquery] 遮罩弹窗,点击遮罩弹窗自动隐藏
$("#id_sign_forbidden_win .c-content").click(function(event){ event.stopPropagation(); // ...
- asp.net core 健康检查
asp.net core 健康检查 ASP.NET Core 2.2 开始,提供了健康检查中间件和库,用来报告应用基础结构组件的运行状况.官方文档在此 运行状况检查由应用程序作为 HTTP 终结点公开 ...
- 简谈Entity Framework的优缺点
Entity Framework简介 Entity Framework的全称为 ADO.NET Entity Framework ,简称为EF, 是微软以ADO.NET为基础发展出来的实体框架,早期被 ...