java异常

Posted cynchanpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。
//			本演示样例没有真正的连接数据库查询。而是如果正确的username是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)在方法中通过throwkeyword抛出异常对象。

(3)假设在当前抛出异常的方法中处理异常,能够使用try-catch语句捕获并处理。否则在方法的声明处通过                throwskeyword指明要抛出给方法调用者的异常,继续进行下一步操作。

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

两个自己定义异常:找不到用户,password错误;两个异常都继承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这些keyword,写在代码中的都是编程式异常。

声明式异常:配置,转到相应页面 不使用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语言对这些异常封装了自己的一套异常处理机制。

我们可以通过使用这一套异常处理机制优化我们的程序代码,增强我们代码的可读性,可靠性和可维护性。异常处理机制是一种非常好调试工具,正确的运用它可以帮助我们高速定位出错的位置。















以上是关于java异常的主要内容,如果未能解决你的问题,请参考以下文章

片段中的 EditText 上的空指针异常 [重复]

Java异常处理机制

片段 getArguments() 空指针异常

Android Java:在 onCreateView() 中返回空视图的片段

java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段