Java基础(七)--Exception异常处理
发现错误的理想时机是程序运行之前(编译期),然后不太现实,很多异常无法被发现(特别是业务上的数据),需要在运行时解决。
错误恢复机制保证代码健壮性的方式,异常处理在程序中很常见,也是必须的,必须考虑有可能发生的异常,才能保证程序的正常运行。而且
一旦程序出现异常,异常处理及日志能帮助我们定位和解决异常。
概念:
Exception,是一种意外,不正常的现象。使用异常可以降低处理代码的复杂度,如果不适用异常,就必须通过判断去检查错误,而且可能在很
多地方都要判断,使用异常,只需要在一个地方处理错误,可以节省代码,能够把正常程序运行和异常分开。
异常分为Error和Exception,继承Throwable
1、Error:无法处理的异常,是一种错误,最常见的就是OutOfMemoryError,jvm直接停止运行
2、Exception:一般性的异常,只要能够捕捉处理,就能保证程序正常运行,比如NullPointerException、IndexOutOfBoundsException
Exception又分为:
1、运行时异常RuntimeException:
我们将RuntimeException或其他继承自RuntimeException的子类称为unchecked Exception。RuntimeException即使不编写异常处理的程序
代码,依然可以编译成功。这种异常在程序运行过程中可能出现,例如NullPointException、ClassCastException等
2、非运行时异常RuntimeException:
其他继承自Exception异常的子类称为checked Exception,编译器强制要求进行捕获处理,比如常见的IOExeption、SQLException,否则编
译无法通过
如何处理异常?
异常处理方式常用的有两种,分别如下:
1、try、catch、finally
public static void main(String[] args) {
try { //要检查的程序语句
int i = 3/0;
System.out.println("test");
}} catch (ArithmeticException e) {
System.out.println("ArithmeticException");
} catch (Exception e) { //异常发生时的处理语句
System.out.println("Exception Message: " + e.getMessage());
throw e;
} finally { //肯定会执行的部分,无论是否发生异常
System.out.println("finally Handler");
}
}
结果:
ArithmeticException
finally Handler
总结:
1、finally、catch都是可以省略的
2、catch可以有多个,如果没有异常,不会执行,发生异常的话,按照顺序匹配,如果匹配,就不会与后面的catch块匹配
3、finally无论如何都会执行,即使之前有return语句。通常在finally进行资源释放的代码,或者lock的解锁,某些关键日志的保存等业务场景
PS:不要在finally使用return,因为会覆盖之前的return语句,很容易造成混淆
相比throws更加灵活,更好的控制程序流程
2、throw、throws
public int add(int i) throws Exception {
if (i == 0) {
throw new IllegalArgumentException();
}
return 0;
}
throws:是把异常交给jvm进行处理,把异常往上层抛出,一旦发生最终的结果可能就会程序终止(如果上层方法不进行try catch),可以抛出
多个异常,一般需要在上层进行try catch块进行处理。
throw:用于主动抛出异常,throw关键字可以写在任何地方,通常和业务有关,通常这个异常时自定义和业务相关的Exception类
总结和建议:
1、父类或接口,对于子类是实现类的限制:
1.1).无论是继承还是实现,父类或者接口没有抛出异常,实现类或子类不能抛出异常
public class A { public void f1() { }
}
public class B extends A{ @Override
public void f1() throws IOException{
System.out.println("");
}
}
1.2).父类或者接口抛出异常Exception1,实现类或子类可以是否抛出异常都可以,如果抛出Exception2,不能是Exception1的父类
public class A { public void f1() throws IOException{ }
}
public class B extends A{ @Override
public void f1() throws Exception{
System.out.println("");
}
}
1.3).父类的方法抛出异常只有非运行时异常(运行时异常),则子类在重写该方法的时候声明的异常也只能有非运行时异常(运行时异常),
不能含有运行时异常(非运行时异常)。
public class A { public void f1() throws IOException{ }
}
public class B extends A{ @Override
public void f1() throws IOException,ClassNotFoundException{
System.out.println("");
}
}
PS:类和接口在这方面的限制是相同的
2、throws一定是具体的Exception,而不是直接抛出Exception,否则上层必须也是抛出Exception,无法定位具体的异常
3、多catch块的异常,一定是小异常在前面,否则可能永远无法捕捉到
4、谨慎使用异常,因为会影响程序性能,能用判断解决还是要判断的
5、不要使用空的catch块
6、异常处理尽量抛到最上层进行统一处理
内容参考:Java异常处理和设计和《Java异常处理》
Java基础(七)--Exception异常处理的更多相关文章
- java基础系列--Exception异常处理
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7191280.html 1.概述 Java代码中的异常处理是非常重要的一环,从代码中可以看到 ...
- Java基础七-正则表达式
Java基础七-正则表达式 一.定义: 特定的符号的组合 二.作用: 用于操作字符串数据 三.优缺点 简化代码,但是阅读性差 四.引入 4.1 问题 判断一个号码是否是QQ号? 不是零开头 6-15位 ...
- Java基础(55):Exception类详解(转)
Java中的异常 Exception java.lang.Exception类是Java中所有异常的直接或间接父类.即Exception类是所有异常的根类. 比如程序: public class Ex ...
- java基础学习总结——异常处理
一.异常的概念 异常指的是运行期出现的错误,也就是当程序开始执行以后执行期出现的错误.出现错误时观察错误的名字和行号最为重要.
- Java基础__Java中异常处理那些事
一.Exception 类的层次 所有的异常类是从 java.lang.Exception 类继承的子类. Exception 类是 Throwable 类的子类.除了Exception类外,Thro ...
- Java基础学习之异常处理(6)
@ 目录 1.异常是什么 1.1.Error 1.2.Exception 2.异常处理机制 2.1.捕获异常 2.2.抛出异常 3.自定义异常 3.1.自定义检查性异常 3.2.自定义运行时异常 1. ...
- java基础六 [异常处理](阅读Head First Java记录)
在程序运行时,我们不能保证所有服务和方法都是正确的,如果发生问题报错会导致程序崩溃,所以需要对一些可以预见的错误进行异常处理,通过throw去抛出一个异常,然后用try..catch..将要执行的该方 ...
- 复习java基础第二天(异常处理)
一.常见的异常类型: public class TestException { public static void main(String[] args) { int i = 10; //数学异常: ...
- java基础七 [图形用户接口](阅读Head First Java记录)
到目前为止我们接触的都是Java的命令行,但是为了让用户使用,必须有图形化界面,所以这章主要讲的是怎么使用GUI(图形用户接口) 创建一个GUI:javax.swing.* 本章讲的布局相关内容都 ...
随机推荐
- 背包系统学习笔(tu)记(cao)
这几天在学习背包系统,网上有看到一个挺牛逼的背包系统,不过人家那个功能很全面,一个背包系统就囊括了装备,锻造,购买等等功能(这里给出网址:https://blog.csdn.net/say__yes/ ...
- poj 3233(矩阵高速幂)
题目链接:http://poj.org/problem?id=3233. 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以非常显然是矩阵高速幂,但有一点.本题k的值非常大.所以要用 ...
- ImportError: No module named 'ConfigParser'
Resolve Method: I found the problem. I had manually installed a newer version of python (version 3.2 ...
- Deferred Rendering(二)G-Buffer的组织
先来看一张网上广为流传的<杀戮地带2>典型的Deferred Shading的G-Buffer组织: 这里补充解释下几个点: 不存Position,而由depth和屏幕像素坐标反推出来.參 ...
- 2015/12/30 字符集 ASCII 到Unicode
——每个软件开发人员应该无条件掌握的知识! ——Unicode伟大的创想! 相信大家一定碰到过,打开某个网页,却显示一堆像乱码,如"бЇЯАзЪСЯ"."�??????? ...
- tf.float32 implicity
简介 | TensorFlow https://tensorflow.google.cn/programmers_guide/low_level_intro 我们来构建一个简单的计算图.最基本的指 ...
- centos7 安装8188eu驱动小记
最小化安装把lsusb和lspci装上 使用lsusb 和lspci的命令, centos上的安装命令: yum -y install usbutils yum -y install pciutils ...
- NinePatchChunk.java分析
最近在Swing中使用.9图片,用到了NinePatchChunk.java文件,但是发现有时会出现无法完美展示的情况,决定修复一下这个问题,顺便研究一些.9的绘制过程 通过分析发现draw函数先是计 ...
- P3199 [HNOI2009]最小圈 01分数规划
裸题,第二个权值是自己点的个数.二分之后用spfa判负环就行了. 题目描述 考虑带权的有向图G=(V,E)G=(V,E)G=(V,E)以及w:E→Rw:E\rightarrow Rw:E→R,每条边e ...
- 词典(一) 跳转表(Skip table)
词典,顾名思义,就是通过关键码来查询的结构.二叉搜索树也可以作为词典,不过各种BST,如AVL树.B-树.红黑树.伸展树,结构和操作比较复杂,而且理论上插入和删除都需要O(logn)的复杂度. 在词典 ...