java异常解析以及自定义异常实例
异常:(Exception)
JAVA异常是在java程序运行的时候遇到非正常的情况而创建的对象,它封装了异常信息,java异常的根类为java.lang.Throwable,整个类有两个直接子类java.lang.Error和java.lang.Exception.Error是程序本身无法恢复的严重错误.Exception则表示可以被程序捕获并处理的异常错误.JVM用方法调用栈来跟踪每个线程中一系列的方法调用过程,该栈保存了每个调用方法的本地信息.对于独立的JAVA程序,可以一直到该程序的main方法.当一个新方法被调用的时候,JVM把描述该方法的栈结构置入栈顶,位于栈顶的方法为正确执行的方法.当一个JAVA方法正常执行完毕,JVM回从调用栈中弹处该方法的栈结构,然后继续处理前一个方法.如果java方法在执行代码的过程中抛出异常,JVM必须找到能捕获异常的catch块代码.它首先查看当前方法是否存在这样的catch代码块,如果存在就执行该
catch代码块,否则JVM回调用栈中弹处该方法的栈结构,继续到前一个方法中查找合适的catch代码块.最后如果JVM向上追到了main()方法,也就是一直把异常抛给了main()方法,仍然没有找到该异常处理的代码块,该线程就会异常终止,如果该线程是主线程,应用程序也随之终止,此时 JVM将把异常直接抛给用户,在用户终端上会看到原始的异常信息.
2.一个方法抛出了异常,这个方法就必须声明这个异常的抛出
3.异常的声明:在方法上声明方法的意外结果
User register(String pwd,String email)
throws UserExistException;
4.异常类一般都继承于Exception
5.调用抛出异常的方法,必须要处理异常,有两种方案
1>.try--catch--finally 捕获异常
2>.直接抛出异常
6.如果代码出现异常,异常以后的代码将不会执行(finally)
2.1 捕获异常try -- catch--finally
1).try 尝试运程代码块,如果有异常会被随后的catch捕获异常发生之后代码不执行
2).catch代码块是异常处理代码,需要提供合理的处理
1>.异常的处理是与具体的业务逻辑有关
2>.可以写多个catch处理一系列异常,注意:异常的大小关系,大类型放在后面处理
3>.有时候直接catch 粗略的异常处理,代码相对简洁,语义比较模糊
4>.finally代码块,不管是否出现异常,总会执行的代码块
finally经常用来处理现场的清理 比如可靠的数据库链接 关闭
5>.处理异常的基本原则:能够底层处理的尽量底层处理,如果不能处理,我们必须抛出到调用方法
6>.异常捕获再抛出是一种底层异常封装转化成另外一种数据类型
7>.建议在捕获到异常时候使用e.printStackTrace(),打印到控制台
1.输出的内容是:出现异常的时候会调用堆栈
2.一般情况下,凡是捕获异常的代码都输出:(堆栈信息) e.printStackTrace()
today is 0728
异常的分类:
Throwable
Error:是系统不可恢复的错误,JVM发生的错误
OutOfMemoryError 堆内存溢出
*Error 栈内存溢出
Exception:程序可以检查处理的异常
非检查异常,javac忽略对这类异常的检查
关于异常的分类
Error:是JVM(java虚拟机)中出现的不可恢复的错误
Exception:是类发生的异常
1.检查异常: 编译期发生
2.非检查异常: 运行期(运行时)发生
3.自定义异常
记住常见的
RuntimeException:你不能跑得足够快,可能因为你太胖了。关掉你的电脑,出门锻炼吧。
NullPointerException:你没有狗。请你先找一只狗,比如一只布烈塔尼獵犬,然后再试一次。
IndexOutOfBoundsException:你把食指放在了无法接收的地方,重新放置,再试一次。
FileNotFoundException:一名木匠应该总是知道他的工具放在哪里。
NotSerializableException:你正试图把一部电影改成电视剧。
public class TryCatchDemo {
public static void main(String[] args) {
//System.out.println(test(null));
//System.out.println(test("0"));
System.out.println(test(""));
}
public static int test(String str){
try{
return str.charAt(0)-'0';
}//catch(NullPointerException e){
//打印异常
// e.printStackTrace();return 1;
//}
//catch(RuntimeException e){
// e.printStackTrace();return 2;
// }
catch(Exception e){
e.printStackTrace(); return 3;
}/*finally {
return 4;
}*/
//假如str为空 会出现空指针异常
}
}
由此可见和上面整理的一样可以写多个catch处理一系列异常,注意:异常的大小关系,大类型放在后面处理,大家可以自行验证
在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。
所有异常都必须是 Throwable 的子类。
如果希望写一个检查性异常类,则需要继承 Exception 类。
如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。
自定义异常实例 以下是代码
import java.util.HashMap;
import java.util.Map;
//该类提供了用户的管理功能:注册和登陆
public class UserManager {
/*准备了一个Map集合 ,存储了User对象
* key是email value是用户对象
*/
private Map<String, User> users= new HashMap<String, User>();
private int id=1;
/*该方法是根据email和pwd来注册用户
* 如果成功,则返回注册的用户对象
* 如果我们的eamil重复就抛出异常(自定义异常) 表示已注册过。
*/
public User reg(String email,String pwd) throws UserExistException
{ //异常的声明
if(users.containsKey(email)){
//抛出一个异常实例,将提前结束方法执行,返回异常实例
throw new UserExistException("该用户已存在:"+email);
}
User newuser=new User(id++,email,pwd);
users.put(email,newuser);
return newuser;
}
//登陆方法 用户名或密码错误时抛出异常
public User login(String email,String pwd) throws EmailOrPwdException
{
if(!users.containsKey(email)){
throw new EmailOrPwdException("该用户不存在:");
}
//根据email(key)获取集合里的value(User)
User u=users.get(email);
if(!u.pwd.equals(pwd)){
throw new EmailOrPwdException("密码有误");
}
return u;
}
}
class UserExistException extends Exception{
public UserExistException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}
class EmailOrPwdException extends Exception{
public EmailOrPwdException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
}
涉及的User类以及测试代码没有添加 可以自行举例验证 主要是想介绍一下自定义异常的处理
上一篇: Spring三种实例化方式
下一篇: 单点网站压力测试调优-第3季