首页 > 代码库 > java异常
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语言对这些异常封装了自己的一套异常处理机制。我们能够通过使用这一套异常处理机制优化我们的程序代码,增强我们代码的可读性,可靠性和可维护性。异常处理机制是一种很好调试工具,正确的运用它能够帮助我们快速定位出错的位置。
java异常