【Java编程高级进阶】如何使用自定义类型的异常?
2017-01-02 13:40
1206 查看
在文章“Unreachable catch block for IOException. This exception is never thrown from the try statement body”中有小伙伴提到:我的是一个自定义的异常,用到自定义的异常就出现这个问题,请问怎么解决?这里讲一下如何使用自定义类型的异常,以及为什么要使用自定义类型的异常。
Java中凡是继承自Exception但不是继承自RuntimeException的类都是非运行时异常。
2. 运行时异常(Runtime Exception/Unchecked Exception)
RuntimeException类直接继承自Exception类,称为运行时异常。Java中所有的运行时异常都直接或间接的继承自RuntimeException。
Java中所有的异常类都直接或间接的继承自Exception。
使用try…catch…finally语句块进行捕获
在产生异常的方法所在的方法声明throws Exception
二、对于运行时异常,可以不对其进行处理,也可以对其进行处理。一般情况下都不对其进行处理。
在使用Java API的方法时会产生异常,由于实际的需要,我们需要创建和使用自定义异常。使用全新的异常类,应用到系统程序中。
其它的是什么?例如WindowsAPI的GetLastError,swift、Go的多返回值 ,返回一个实体类包含所有需要的信息;
而这个方法同样也有多种应用。
应用一:你的一个方法中把一些必须满足的条件作为异常来处理;
应用二:你的一个方法中把所有可能遇到的异常都捕获了,附加上其它信息抛出新的异常;
应用三:以上两种混合应用;
package wasdev.sample.servlet;
/**
* 自定义异常
* @author testcs_dn
*
*/
public class CustomException extends Exception {
private static final long serialVersionUID = -3260180827302646043L;
/**
* 扩展信息
*/
private String exMsg;
public String getExMsg() {
return exMsg;
}
public void setExMsg(String exMsg) {
this.exMsg = exMsg;
}
/**
*
*/
public CustomException() {
super();
}
public CustomException(String msg) {
super(msg);
}
/**
*
* @param msg 异常信息
* @param exMsg 扩展信息
*/
public CustomException(String msg, String exMsg) {
super(msg);
this.setExMsg(exMsg);
}
}
应用类Servlet:SimpleServlet.java
如果你有更好的应用场景欢迎分享!
我这里只定义了一个异常类:CustomException,你也可以做如下定义,只要你喜欢:
UserNameException,PasswordException,FileWriteException……等等。
===========文档信息============
版权声明:非商用自由转载-保持署名-注明出处
署名(BY) :testcs_dn(微wx笑)
文章出处:[无知人生,记录点滴](http://blog.csdn.net/testcs_dn)
异常的分类
1. 非运行时异常(Checked Exception)Java中凡是继承自Exception但不是继承自RuntimeException的类都是非运行时异常。
2. 运行时异常(Runtime Exception/Unchecked Exception)
RuntimeException类直接继承自Exception类,称为运行时异常。Java中所有的运行时异常都直接或间接的继承自RuntimeException。
Java中所有的异常类都直接或间接的继承自Exception。
异常的处理
一、对应非运行时异常,必须对其进行处理。处理方式有两种:使用try…catch…finally语句块进行捕获
在产生异常的方法所在的方法声明throws Exception
二、对于运行时异常,可以不对其进行处理,也可以对其进行处理。一般情况下都不对其进行处理。
在使用Java API的方法时会产生异常,由于实际的需要,我们需要创建和使用自定义异常。使用全新的异常类,应用到系统程序中。
为什么使用自定义类型的异常
其实这是问题处理的模式/方式之一;其它的是什么?例如WindowsAPI的GetLastError,swift、Go的多返回值 ,返回一个实体类包含所有需要的信息;
而这个方法同样也有多种应用。
应用一:你的一个方法中把一些必须满足的条件作为异常来处理;
应用二:你的一个方法中把所有可能遇到的异常都捕获了,附加上其它信息抛出新的异常;
应用三:以上两种混合应用;
应用实例
自定义异常类:CustomException.javapackage wasdev.sample.servlet;
/**
* 自定义异常
* @author testcs_dn
*
*/
public class CustomException extends Exception {
private static final long serialVersionUID = -3260180827302646043L;
/**
* 扩展信息
*/
private String exMsg;
public String getExMsg() {
return exMsg;
}
public void setExMsg(String exMsg) {
this.exMsg = exMsg;
}
/**
*
*/
public CustomException() {
super();
}
public CustomException(String msg) {
super(msg);
}
/**
*
* @param msg 异常信息
* @param exMsg 扩展信息
*/
public CustomException(String msg, String exMsg) {
super(msg);
this.setExMsg(exMsg);
}
}
应用类Servlet:SimpleServlet.java
package wasdev.sample.servlet; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class SimpleServlet */ @WebServlet("/SimpleServlet") public class SimpleServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.getWriter().print("Hello World!"); try { doSomething(); } catch (CustomException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { doSomething("user", "pwd"); } catch (CustomException e) { // TODO Auto-generated catch block e.printStackTrace(); } } protected void doSomething() throws CustomException{ throw new CustomException("abcd"); } protected void doSomething(String userName, String password) throws CustomException{ if (userName == null || userName.length() == 0){ throw new CustomException("abcd", "userName"); } if (password == null || password.length() == 0){ throw new CustomException("abcd", "password"); } File f = new File("test.txt"); if (f.exists()){ try { FileOutputStream fos = new FileOutputStream(f); try { fos.close(); } catch (IOException e) { throw new CustomException("abcd", "IOException"); } } catch (FileNotFoundException e) { throw new CustomException("abcd", "FileNotFoundException"); } } } protected void doSomething2(){ try { throw new CustomException("abcd", "扩展信息"); } catch (CustomException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
结束语
这里只是演示自定义异常的使用方式,不要纠结演示代码的业务合理性,如果你有更好的应用场景欢迎分享!
我这里只定义了一个异常类:CustomException,你也可以做如下定义,只要你喜欢:
UserNameException,PasswordException,FileWriteException……等等。
===========文档信息============
版权声明:非商用自由转载-保持署名-注明出处
署名(BY) :testcs_dn(微wx笑)
文章出处:[无知人生,记录点滴](http://blog.csdn.net/testcs_dn)
相关文章推荐
- Java 实现自定义异常 以及如何使用该异常
- Java高级系列——何时使用、如何使用异常(Exceptions)
- java高级编程学习如何使用打印服务 API
- Java 泛型高级编程 ? 类型占位符的使用
- JAVA如何使用自定义异常
- java fastjson如何自定义转换含枚举类型对象(编程技巧)
- java fastjson如何自定义转换含枚举类型对象(编程技巧)
- 如何在Qt中使用自定义数据类型
- js高级编程------------使用prototype仿java对象实现表单验证
- 使用iBatis中报 java.sql.SQLException: 无效的列类型异常
- 黑马程序员-- 高级网络编程 什么是泛型?泛型的定义?泛型如何使用?为什么要使用泛型?
- Zookeeper 进阶之——Zookeeper编程示例(如何使用Zookeeper实现屏障Barriers和队列Queues)
- 如何在Qt中使用自定义数据类型 (zz)
- Java访问DotNet平台WCF服务,使用自定义对象如IDictionary做参数时,抛出"Did not understand MustUnderstand"异常
- java基础--网络编程之 自定义浏览器和URL类的使用
- 如何在Android中写和使用一个自定义的java库
- Java编程时主线程如何捕获子线程抛出的异常
- .“在JAVA中,异常子类必须在它们任何父类之前使用,因为运用父类的catch语句将捕获该类型及其所有子类类型的异常。这样,后面运行子类的catch语句将永远不会到达。而且,Java中不能到达的代码是一个错误。”
- 如何在Qt中使用自定义数据类型
- 如何 iOS 编程中使用自定义 TableViewCell