欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java异常解析以及自定义异常实例

程序员文章站 2022-05-23 18:19:18
...

 异常:(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将把异常直接抛给用户,在用户终端上会看到原始的异常信息.                                    

 1.异常是行为(方法,过程)的意外结果
 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类以及测试代码没有添加 可以自行举例验证 主要是想介绍一下自定义异常的处理