java异常

异常基础知识

    1. Error和Exception

             Error:程序无法处理的错误,必须停止JVM

        Exception:程序可以处理,JVM没有必要停止。程序可以接着运行

    2. Exception分类

运行期异常和非运行期异常

运行期:(也称为非受控异常)

程序逻辑角度:在程序执行期间发生的异常,一般是程序逻辑异常;可以不处理,NullPointerException、                                    IndexOutOfBoundsException

非运行期:(受控异常)

  程序语法角度:在语法角度的异常,如果不处理程序编译不能够通过IOException  SQLException

    3. 使用异常的几种处理方式

1.      根据每种业务创建不同异常

2.      每层抛出相应的异常

         比如:Dao层异常最好不要直接抛给用户,最好由业务转换成用户理解的异常再抛出

3.      每个模块抛出一种异常

4.      错误码可以做到异常细粒度划分,采用错误码可以减少异常类的创建

异常处理的原则

     1.尽可能处理异常

       如果不处理异常,这个异常会当异常是错误的时候直接导致程序不能够运行。如果是Exception,也就导致我们在编译程序,运行程序的时候发生问题。最最主要的原因,当发生这些异常的时候因为没有任何的提示会让我们很难调试。给用户的体验也不好。

举例登录中如果不作处理很难看出是哪里出错了

     2.具体问题具体解决

       Exception优点在于不同类型的问题提供不同的处理操作,运行期还是非运行期异常的类型是不同的。有效异常处理的关键是识别特定故障场景,并开发解决磁场经典特定行为。比如创建的另个异常处理类

当然还有很多的原则,自己对这两点体会比较深,如果大家还想要了解更多可以在深入了解一下。http://www.bingobing.net/archives/144

 

异常处理机制

    捕获异常,抛出异常,自定义异常,异常链

    1. 捕获(try {} catch(Exception e){} finally{})

       方法抛出异常后,运行时系统将寻找合适的异常处理器。潜在的异常处理器是异常发生时以此存留在调用栈中的方法集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即找到了异常处理器。运行时系统从发生异常的方法开始,以此回查调用栈中的方法,直到找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止,即意味着java程序终止。

            Catch:抓到的异常在栈中依次停留进行匹配-->直到相符-->如果不相符终止程序

       Finally:可有可无的代码。无论如何都要执行,所以return放在里面其实没有特别大的必要

     2.  抛出(throw throws)

       当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象包含了异常类型和异常出现时的程序状态等异常信息。运行系统负责寻找处理异常的代码执行。

public class LoginDao {
		
		public User findUserById(String userId){
//			需要查询根据userId查询userId和userPwd。
//			本示例没有真正的连接数据库查询,而是假设正确的用户名是test,密码也是test
			User user = new User();
			user.setUserName("test");
			user.setPassword("test");
			return user;
		}
		public void loginDao(String userId,String password){
			User user = findUserById(userId);
			if(user == null){
				//throw相当于return,下面不会执行了
				throw new UserNotFoundException("用户代码不正确,代码= 【" +userId+ "】"  );
			}
			if(!user.getPassword().equals(password)){
				throw new PasswordNotCorrectException("密码不正确");
			}

		}

}


    3.  自定义

      使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。

 在程序中使用自定义异常类,大体可分为以下几个步骤。

(1)创建自定义异常类。

(2)在方法中通过throw关键字抛出异常对象。

(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过                throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。

(4)在出现异常方法的调用者中捕获并处理异常。

两个自定义异常:找不到用户,密码错误;两个异常都继承RuntimException

public class UserNotFoundException extends RuntimeException {

	public UserNotFoundException() {
		// TODO Auto-generated constructor stub
	}

	public UserNotFoundException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public UserNotFoundException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}

	public UserNotFoundException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

}
public class PasswordNotCorrectException extends RuntimeException {

	public PasswordNotCorrectException() {
		// TODO Auto-generated constructor stub
	}

	public PasswordNotCorrectException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public PasswordNotCorrectException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}

	public PasswordNotCorrectException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

}

4. 声明式异常和编程式异常

编程式异常:上面的代码中使用try,catch,finally这些关键字,写在代码中的都是编程式异常。

声明式异常:配置,转到对应页面 不使用catch

在配置文件(web.xml)中配置发生哪些异常的时候转到相应的页面。

<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">	
	<!-- 声明式异常的配置:发生的异常 ,发生此种异常转向的页面 -->
	<error-page>
		<exception-type>com.pf.ApplicationException</exception-type>
		<location>/error.jsp</location>
	</error-page>
	
	<error-page>
		<error-code>404</error-code>
		<location>/http_error.jsp</location>
	</error-page>
	
	<error-page>
		<error-code>500</error-code>
		<location>/http_error.jsp</location>
	</error-page>
</web-app>

ApplicationException

public class ApplicationException extends RuntimeException {

	public ApplicationException() {
		// TODO Auto-generated constructor stub
	}

	public ApplicationException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public ApplicationException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}

	public ApplicationException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

}

5.总结

       百分之百没有错误的程序是不存在的, 如果我们能预知一些错误的发生并且提前对这些错误做一些处理,那么我们程序的可靠性,可维护性就高很多。在编程语言中将这些错误称为异常,java语言对这些异常封装了自己的一套异常处理机制。我们能够通过使用这一套异常处理机制优化我们的程序代码,增强我们代码的可读性,可靠性和可维护性。异常处理机制是一种很好调试工具,正确的运用它能够帮助我们快速定位出错的位置。



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。