java笔记--异常详解与处理
一、异常概念
Throwable类是Java中所有错误或异常的超类。
1.只有当对象是此类(或其子类)的实例时,才能通过Java虚拟机或着Java throw语句抛出。
2.只有此类或其子类才可以是catch字句中的参数类型。
3.有两个直接子类:Error和Exception
Error--指应用程序不应该去处理捕获的一种严重问题,常表示系统级的错误,如内存溢出
Exception--指程序需要捕获,需要处理的异常,是一种设计或实现方面的问题。
Exception分为两类:RuntimeException和CheckedException
RuntimeException--运行时异常,由程序员错误导致,不需要捕获处理,直接由
虚拟机接管,层层上抛,记录日志,程序员应尽量避免此种异常。
CheckedException--一般异常,需要进行catch,如IO异常和SQL异常等。
注:Error是不需要程序员关心的,属于系统级的错误
RuntimeException需要程序员注意逻辑和编码上的谨慎,尽量避免此种错误发生
CheckedException需要进行捕获处理
--支持知识共享,转载请标注地址"http://www.cnblogs.com/XHJT/p/3927577.html "——和佑博客园,谢谢~~--
二、常见的RuntimeException异常:
1.ArithmeticException 算数异常--如最常见的除数为0
2.ArrayindexOutOfBoundsException 数组下标越界异常,但需要遍历数组时,用foreach或者ArraryList可避免此异常。
3.ClassCastException 强制转换异常
4.ClassNotFoundException 找不到指定类异常,此类异常常发生于以下几种情况,
如:Class类中的forName方法
ClassLoader类中的findSystemClass方法
ClassLoader类中的loadClass方法
5.NullPointException 空指针异常,当应用程序试图在需要对象的地方使用null时,抛出此异常:
如:调用null对象的实例方法
访问或修改null对象的字段
将null作为一个数组,获得其长度
将null作为一个数组,访问或修改其元素值
将null作为Throwable值抛出
要避免此类异常可在定义引用类型变量就对其初始化,或者在使用此变量进行是否为空判断。
6.ArrayStoreException 数组存值异常--即元素类型不一致时抛出此异常,但若数组引用类型为Object则不会抛出此异常。
三、其他常见异常
1.IllegalAccessExcetion 非法访问异常--是当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,
或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时
抛出的异常。
此异常最常见是在有安全管理器下使用反射设置私有域的值。此时必须要使用setAccessible()修改
其可见性。一般而言,尽量避免使用反射来访问私有域。
2.FileNotFoundException 文件未发现异常--在试图打开指定路径名表示的文件失败时抛出的异常。在不存在具有指定路径
名的文件时,该异常有FileInputStream、FileOutputStream和ReadomAccessFile构造方法抛出。
若此文件存在,却由于其他原因不可访问,将抛出此异常。如打开一个只读文件进行写入。
要避免此类异常,可先通过File类的exists()方法来判断此文件是否存在。也可使用文件选择器,把
可操作的文件均罗列出来。
3.SqlException 数据库异常--提供关于数据库访问错误或其他错误信息的异常。通过此异常可知道:
a.描述错误的字符串;
b."SQLstate"字符串,该字符串遵守XOPEN SSQLstate约定或SQL:2003约定
c.特定于每个供应商的整数错误代码。
d.到下一个Exception的链接
e.因果关系,可查出任何导致此SQLException的原因
四、对异常的处理
throw:
使用throw关键字可以在方法体中抛出异常。该异常既可以使系统预定义异常,也可是用户自定义异常;
throw总是出现在函数体中,用来抛出一个具体异常。程序会在throw语句后立即终止,它后面的语句执
行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子
句的try块:
throw 异常对象;
此时要抛出异常必须要应用在方法体中。
throws:
使用throws关键字可能会抛出异常;该异常既可以使系统预定义异常,也可是用户自定义异常;
throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception
子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型。如果异常的类型是
Error或 RuntimeException, 或它们的子类,这个规则不起作用, 因为这在程序的正常部分中
是不期待出现的。 如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的
类型。
[<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]
注:异常类可以声明多个,用逗号分割。
throw和throws的区别:
1.前者在方法体中使用,是一个语句,用于抛出具体的异常;后者在声明方法时使用,是一个方法,用于声明可能抛出的异常。
2.前者不能单独使用,要么和try-catch-finally配套,要么和throws配套;后者可单独使用。
3.使用前者,则一定会抛出异常,使用后者则可能会抛出异常
4.程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻
找含有与其匹配的catch子句的try块。
为预定于异常添加提示信息:
对于系统预定义的异常,一般而言至少有两个构造函数,即有参构造和无参构造。程序员可以使用有参构造方法来添加提示 信息。代码实例:
- package com.xhj.exception;
- /**
- * 为预定于异常添加提示信息:
- *
- * @author XIEHEJUN
- *
- */
- public class AddExceptionMessage {
- public static void throwException() {
- throw new UnsupportedOperationException("没有任何数据");
- }
- public static void main(String[] args) {
- try {
- AddExceptionMessage.throwException();
- } catch (Exception e) {
- System.out.println(e.getMessage());
- }
- }
- }
用户自定义异常:
虽然Java本身定义的异常类已经十分的丰富齐全,但是在实际应用当中,需求总是千变万化的。
当需求需要而Java预定义异常类中却没有时,编程人员可通过自定义异常类来满足开发需求。
要编写一个自定义的异常类很简单,只需要继承Exception类或其子类,然后实现其构造方法即可。
public class MyException extends Exception{}
代码实例:
- package com.xhj.exception;
- /**
- * 自定义异常
- *
- * @author XIEHEJUN
- *
- */
- public class MyDefinedException extends Exception {
- public MyDefinedException(String message) {
- super(message);
- }
- public static void main(String[] args) throws MyDefinedException {
- String[] str = { "1", "2", "3", "4", "5", "6" };
- for (String string : str) {
- if (string.equals("6")) {
- throw new MyDefinedException("此数据不能大于其字节长度!");
- }
- }
- }
- }
捕获异常:
当遇到异常,我们一般有两种解决方案:一种当然是将异常抛出;另外一种就是将异常捕获。
抛出异常是一个很简单的行为,但是这个简单的行为将会让程序直接退出。而在实际需求当中,并不是什么异常都能抛出的,因为不管怎么样,我们总是要保持程序处于运行状态的,不然也就没有什么意义了。
异常的捕获要通过try--catch--finally语句块来完成:
1.try是不可缺少额语句块,主要用来放置可能出现异常的语句;
2.catch和finally两者至少要有一个1个与try配套;3.catch块是用来放置异常发生后的处理语句;
4.finally里放置的则是无论发生异常与否都会执行的语句。
注:对异常进行捕获会占用很高的内存,因此try块中的语句要尽量少。try--catch--finally的执行顺序:
实例代码:
- package com.xhj.exception;
- /**
- * 认识try--catch--finally的执行顺序
- *
- * @author XIEHEJUN
- *
- */
- public class ExecuteExceptionShort {
- public static void main(String[] args) {
- String[] strs = new String[5];
- try {
- int i = strs.length;
- System.out.println("----进入try代码块----");
- System.out.println("String数组大小为:" + i);
- String str = "我是丑小鸭!";
- strs[5] = str;
- System.out.println("strs[5] = " + strs[5]);
- System.out.println("----离开try代码块----");
- } catch (Exception e) {
- System.out.println("----进入catch代码块----");
- System.out.println("异常为: " + e.toString());
- System.out.println("----离开catch代码块----");
- } finally {
- System.out.println("----进入finally代码块----");
- strs[4] = "我是美丽的白天鹅";
- System.out.println(strs[4]);
- System.out.println("----离开finally代码块----");
- }
- }
- }
注:try--catch--finally语句块可捕获多个异常,但是在捕获多个异常的时候一定要注多个catch的执行顺序,
所要捕获的异常一定要从小到大排列。当然也可直接通过所有异常的父类Exception,来简单处理。
java笔记--异常详解与处理的更多相关文章
- JAVA基础——异常详解
JAVA异常与异常处理详解 一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1 ...
- Java基础 - 异常详解
异常的层次结构 Throwable Throwable 是 Java 语言中所有错误与异常的超类. Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示 ...
- java之异常详解
一.什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域正常运行的情况,称之为异常. 二.异常体系 Java把异常当作对象来处理,并定义一个基类java. ...
- 云时代架构阅读笔记六——Java内存模型详解(二)
承接上文:云时代架构阅读笔记五——Java内存模型详解(一) 原子性.可见性.有序性 Java内存模型围绕着并发过程中如何处理原子性.可见性和有序性这三个特征来建立的,来逐个看一下: 1.原子性(At ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- 转:Java HashMap实现详解
Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1. HashMap概述: HashMap是基于哈希表的M ...
- 淘宝JAVA中间件Diamond详解(2)-原理介绍
淘宝JAVA中间件Diamond详解(二)---原理介绍 大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解.本次为大家带来的是diamond核心原理的介绍,主要包括server ...
- Java集合类的详解与应用
Java集合类的详解与应用 集合简介: 1.定义:可以同时存储不同类型的数据 他的存储空间会随着数据的增大而增大 2.缺点:只能存储引用数据类型 3.优点:更加合理的利用空间,封装了更多的方法,用起来 ...
- Java 反射机制详解(下)
续:Java 反射机制详解(上) 三.怎么使用反射 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属 ...
随机推荐
- TCP的三次握手和四次挥手
置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<两个简单的Loading> 作者主页:myvin 博主QQ:851399101(点击QQ和博主发起临时 ...
- 『开源』Slithice 2013 服务器集群 设计和源码
相关介绍文章: <『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布> <『集群』001 Slithice 服务器集群 概述> <『集群』002 Sli ...
- sql server 数据库备份,完整备份,差异备份,自动备份说明
Sql server 设置完整备份,差异备份说明 在数据库管理器中,选择要备份的数据库,右键找到“备份” 然后可以按照备份的方式进行备份. 关于文件的还原,作以下补充说明: 步骤为: 1.在需要还原的 ...
- [poj3046]Ant Counting(母函数)
题意: S<=x1+x2+...+xT<=B 0<=x1<=N1 0<=x2<=N2 ... 0<=xT<=NT 求这个不等式方程组的解的个数. 分析: ...
- Linux下巧用my.cnf,mysql连接服务器不需要输入账号密码信息
Linux下每次用mysql连接连接服务器,常常用如下方式: [root@localhost ~]# mysql -hlocalhost -uroot -p11111 每次都输入用户名,密码,多折腾人 ...
- jQuery Mobile学习日记(二)
首先依HTML5方式加载,DOCTYPE表示格式为HTML5:主要适用于iPhone.Android等,viewport表示适用于移动终端的适中显示,initial-scale缩放比例在1.0~1.3 ...
- iOS开发小技巧--父子控制器练习中get到的技能,控制核心动画的范围
一.未经过处理的动画是这样的,自定义的导航按钮也一起跟着转起来了. 二.自己想要的效果 三.实现这种效果的思想:核心动画要添加到view的layer上面,刚开始的情况是讲核心动画添加到了整个大view ...
- hdu4333 扩展KMP
慢慢研究可以发现,可以用扩展kmp来求.由于扩展kmp的next[]只有一部分,当前位子前面那部分和母串的后部分,所以可以将字符串复制接在后面一次. 先求如果next[]>0&& ...
- 【ZOJ 3870】 Team Formation
题意 n个数,找出有几对a.b 符合 a ^ b > max(a,b) .^表示异或号 分析 对于数a,如果它的二进制是: 1 0 1 0 0 1,那么和它 ^ 后 能比他大的数就是: 0 1 ...
- USACO 3.2 msquare 裸BFS
又是个裸BFS... 和西安网赛那道1006一样的,只不过加上了要记录方案.顺便复习map 记录方案直接在bfs队列的结点里加一个vector<int> opt,把从开头一直到当前结点的操 ...