侧边栏壁纸
  • 累计撰写 39 篇文章
  • 累计创建 1 个标签
  • 累计收到 3 条评论
标签搜索

【深入浅出-面试】(2)

mousycoder
2015-10-12 / 0 评论 / 0 点赞 / 62 阅读 / 2,042 字
温馨提示:
本文最后更新于 2022-01-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

答案:D

分析

Java 异常的结构体系

Throwable 类包含了其线程创建时线程执行堆栈的快照,包含了给出有关错误更多的消息字符串,
有颜色的代表运行时异常,非checked exception,可以不try catch ,则由jvm处理,白色的异常代表checked exceptions必须由try-catch捕获。

非RuntimeException

非runtimeException 一般是外部错误,例如:从文件尾后读取数据,这并不是程序本身的错误,而是应用环境的错误,凡是继承Throwable的,都可以捕获,抛出。

ERROR

Error由虚拟机生成并抛出,,属于JVM系统内部错误或者资源耗尽等严重情况,属于JVM需要担负的责任,这一类异常事件是无法恢复或者不可能捕获的,将导致应用程序中断,但是自定义Error是可以捕获的。

package com.mousycoder.error;

public class MyError extends Error{

	public MyError() {
		super();
	}
	
	MyError(String msg) {
		super(msg);
	}
	
	public static void main(String[] args) {
		
		try {
			throw new MyError("error");
		} catch (Throwable e) {
			System.out.println("catching!");
		}
		
	}
	

}

异常机制

传统异常是由函数返回一个特殊的结果表示,例如: -1表示异常,有时候 -1确是表示正确的值,这样代码可读性差,正确的处理和异常处理代码在一起,异常则由程序员来处理,要求比较高,经过改良之后,程序出现异常,则程序流程发生改变,控制权转到异常处理器,由异常处理器处理,异常处理器也是有很多的,直到找到一个适合的异常处理器,并处理异常。

异常的转译

  • ERROR到Exception

比如讲SQLException转成DAOException,让异常更加准确的表达

package com.mousycoder.error;

import java.sql.SQLException;

public class DAOException extends Throwable{
	public DAOException() {
		super();
	}
	
	DAOException(String msg,Throwable e){
		super(msg, e);
	}
	
	public static void main(String[] args) throws DAOException {
		SQLException s = new SQLException();
		throw new DAOException("dao异常",s);
	}
	
}

console

Exception in thread "main" com.mousycoder.error.DAOException: dao异常
	at com.mousycoder.error.DAOException.main(DAOException.java:16)
Caused by: java.sql.SQLException
	at com.mousycoder.error.DAOException.main(DAOException.java:15)

Spring中DispatcherServlet的doDispatch()方法将Error转成Exception,挽回错误发生带来的负面影响。

	private void triggerAfterCompletionWithError(HttpServletRequest request, HttpServletResponse response,
			HandlerExecutionChain mappedHandler, Error error) throws Exception, ServletException {

		ServletException ex = new NestedServletException("Handler processing failed", error);
		if (mappedHandler != null) {
			mappedHandler.triggerAfterCompletion(request, response, ex);
		}
		throw ex;
	}
  • Exception到RuntimeException

将检查异常转成非检查异常,让代码变得优雅,但是增加了系统发生系统的可能性

  • Error到RuntimeException

代码简洁,统一异常处理

异常链

将异常的原因一个一个串起来,底层信息传给上层,逐级传递

模型:

try {
     lowLevelOp();
    } catch (LowLevelException le) {
     throw (HighLevelException)
      new HighLevelException().initCause(le);
}
0

评论区