涉及到异常类相关的文章:

(1)异常类不能是泛型的 http://www.cnblogs.com/extjs4/p/8888085.html

(2)Finally block may not complete normally的问题,参考文章:https://www.cnblogs.com/extjs4/p/9375400.html

(3)JLS https://docs.oracle.com/javase/specs/jls/se7/html/jls-11.html#jls-11.2

(4)关于动态代理的异常 http://www.importnew.com/28664.html

try{ }catch(Exception e){ }

上面的例子不会报错,虽然try块中不会抛出异常,所以catch中Exception或者Exception的父类时不要求try块中一定要抛出相应异常。  

Throwable为顶层父类,派生出Error类和Exception类,如下图:

错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。

关于断言的java.lang.AssertionError也是无法处理的,如果出现错误,程序将终止。开启断言可在Eclipse中的VM arguments中传入参数:-ea 进行开启

异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。而且如果这些异常没有被处理,会导致线程退出。异常又分为非检查异常(unckecked exception)与检查异常(checked exception)。

由上图可以看出,继承

例1:

class SubThread extends Thread  {
	@Override
	public void run() throws ArithmeticException{
		int i = 0;
		int x = i / i; // 抛出java.lang.ArithmeticException
		System.out.println("SubThread end...");
	}

}  

运行时异常如果不处理最终还是会导致线程终止。

例2:

class SubThread extends Thread  {
	@Override
	public void run() throws ArithmeticException{
		int i = 0;
		try {
			int x = i / i;
		} catch (Exception e) {
                    throw e;
		}
		System.out.println("SubThread end...");
	}
}  

抛出异常时没有具体进行处理,同样会导致线程终止。如果注释掉throw e语句后,则线程就可正常结束打印出SubThread end...

11.2.1. Exception Analysis of Expressions

A class instance creation expression (§15.9) can throw an exception class E iff either:

  • The expression is a qualified class instance creation expression and the qualifying expression can throw E; or

  • Some expression of the argument list can throw E; or

  • E is determined to be an exception class of the throwsclause of the constructor that is invoked (§15.12.2.6); or

  • The class instance creation expression includes a ClassBody, and some instance initializer block or instance variable initializer expression in the ClassBody can throw E.

A method invocation expression (§15.12) can throw an exception class E iff either:

  • The method to be invoked is of the form Primary.Identifierand the Primary expression can throw E; or

  • Some expression of the argument list can throw E; or

  • E is determined to be an exception class of the throwsclause of the method that is invoked (§15.12.2.6).

For every other kind of expression, the expression can throw an exception class E iff one of its immediate subexpressions can throw E.

eg1:

class FirstException extends Exception {  }

class AA{
	public AA() throws FirstException{}
}
// 方法上必须有FirstException,否则下面抛出FirstException都将报错
public void dd() throws FirstException { 

	AA a = new AA(){}; // // throw FirstException

	Object b = new Object(){
		// instance variable initializer
		AA a = new AA(); // throw FirstException
		// instance initializer block
		{
			AA a = new AA(); // // throw FirstException
		}
	};

}

11.2.2. Exception Analysis of Statements

throw statement (§14.18) whose thrown expression has static type E and is not a final or effectively final exception parameter can throw E or any exception class that the thrown expression can throw.

For example, the statement throw new java.io.FileNotFoundException(); can throw java.io.FileNotFoundException only. Formally, it is not the case that it "can throw" a subclass or superclass of java.io.FileNotFoundException.

throw statement whose thrown expression is a final or effectively final exception parameter of a catch clause C can throw an exception class E iff:

  • E is an exception class that the try block of the trystatement which declares C can throw; and

  • E is assignment compatible with any of C's catchable exception classes; and

  • E is not assignment compatible with any of the catchable exception classes of the catch clauses declared to the left of C in the same try statement.

try statement (§14.20) can throw an exception class E iff either:

  • The try block can throw E, or an expression used to initialize a resource (in a try-with-resources statement) can throw E, or the automatic invocation of the close() method of a resource (in a try-with-resources statement) can throw E, and E is not assignment compatible with any catchable exception class of any catch clause of the try statement, and either no finally block is present or the finally block can complete normally; or

  • Some catch block of the try statement can throw E and either no finally block is present or the finally block can complete normally; or

  • finally block is present and can throw E.

An explicit constructor invocation statement (§8.8.7.1) can throw an exception class E iff either:

  • Some expression of the constructor invocation's parameter list can throw E; or

  • E is determined to be an exception class of the throwsclause of the constructor that is invoked (§15.12.2.6).

Any other statement S can throw an exception class E iff an expression or statement immediately contained in S can throw E.

关于异常的一些注意点:

(1)If a catch block handles more than one exception type, then the catch parameter is implicitly final.

(2)Rethrowing Exceptions with More Inclusive Type Checking(更具包容性的类型检查)

static class FirstException extends Exception {	}

static class SecondException extends Exception { }

// Java7之前对异常的处理
public void rethrowExceptionPriorSE7(String exceptionName)
		throws Exception {
	try {
		if (exceptionName.equals("First")) {
			throw new FirstException();
		} else {
			throw new SecondException();
		}
	} catch (Exception e) {
		throw e;
	}
}
// Java7新增对异常的处理语法
public void rethrowExceptionSE7(String exceptionName)
		throws FirstException, SecondException {
	try {
		if (exceptionName.equals("First")) {
			throw new FirstException();
		} else {
			throw new SecondException();
		}
	} catch (Exception e) {
		throw e;
	}
}

In detail, in Java SE 7 and later, when you declare one or more exception types in a catch clause, and rethrow the exception handled by this catch block, the compiler verifies that the type of the rethrown exception meets the following conditions:

  • The try block is able to throw it.
  • There are no other preceding catch blocks that can handle it.
  • It is a subtype or supertype of one of the catch clause's exception parameters.

如上的三条对Java7及后面的版本来说都需要进行检查,如下:

static class FirstException extends Exception {	}

static class SecondException extends FirstException { }

// Java7新增对异常的处理语法
public void rethrowExceptionSE7(String exceptionName)
		throws FirstException, SecondException {
	try {
		throw new FirstException();
	} catch (SecondException e) {
		throw e;
	}
}

在try块中抛出父类异常,在catch中捕获子类异常,这是允许的。  

参考:

(1)http://www.importnew.com/26613.html

(2)https://docs.oracle.com/javase/specs/jls/se7/html/jls-11.html

(3)https://docs.oracle.com/javase/8/docs/technotes/guides/language/catch-multiple.html

Java中的异常Exception的更多相关文章

  1. java中的异常(Exception)

    基本概念 将程序执行中发生的不正常的情况称为"异常".开发中的语法错误和逻辑错误不是异常 执行过程中的异常事件可分为两大类 错误(Error):Java虚拟机无法解决的严重问题.例 ...

  2. Java中的Checked Exception——美丽世界中潜藏的恶魔?

    在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能.有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常.但是在查看这些API的文档时,我们却没 ...

  3. 【Java心得总结二】浅谈Java中的异常

    作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...

  4. Java中的异常-Throwable-Error-Exception-RuntimeExcetpion-throw-throws-try catch

    今天在做一个将String转换为Integer的功能时,发现Integer.parseInte()会抛出异常NumberFormatException. 函数Integer.parseInt(Stri ...

  5. Java中的异常详解

    一.异常定义 阻止当前方法或作用域继续执行的问题,称为异常 二.异常分析      所有不正常类都继承Throwable类,这个类主要有两个子类Error类和Exception类.Error指系统错误 ...

  6. Java中的异常和处理详解

    简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?. ...

  7. Java中的异常简介

    Java中异常的分类 Java中的异常机制是针对正常运行程序的一个必要补充,一般来说没有加入异常机制,程序也能正常运营,但是,由于入参.程序逻辑的严谨度,总会有期望之外的结果生成,因此加入异常机制的补 ...

  8. java中的异常类

    Java中的异常: 1. Throwable是所有异常的根,java.lang.Throwable Throwable包含了错误(Error)和异常(Exception),Exception又包含了运 ...

  9. Java 中的异常

    前段时间集合的整理真的是给我搞得心力交瘁啊,现在可以整理一些稍微简单一点的,搭配学习 ~ 突然想到一个问题,这些东西我之前就整理过,现在再次整理有什么区别嘛?我就自问自答一下,可能我再次整理会看到不一 ...

随机推荐

  1. 13、容器之间的link

      很多时候我们的业务分为前台和后台,例如:"前台的代码需要连接数据库进行数据操作":但是在写代码的时候我们并不知道后台数据库的地址是什么,所以我们可以docker通过固定的名字来 ...

  2. SQL Server触发器的基本使用

    sqlserver_SQL触发器的使用及语法(转自:百度文库) 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程 ...

  3. Postgresql 日志审计

    配置log_destination = 'csvlog'logging_collector = off log_directory = 'pg_log'log_connections = onlog_ ...

  4. MVC控制器中动作方法返回的结果

    在MVC控制器中主要的返回方式有如下几种: 1.Content(): 返回文本类型的ContentResult,比如“这是我做的一个MVC”. 2.File(): 返回文件类型的内容FileResul ...

  5. PDF文档转换为图片、图片转成PDF 及PDF合并

    简介 功能:PDF文档按每页转换成一张图片,一张图片转换成一张PDF 并将多张PDF合成一个多页的PDF文档. 经历:在各个网站上搜索始终出现各种问题,尤其是遇到引用的版本问题尤其头疼,不是不能适用当 ...

  6. ES6——Class的继承

    class 的继承和使用. 子类继承父类,使用extends关键字. 为父类知道那个静态方法,使用 static方法名字super: 在构造函数中,可以当一个函数来使用,相当于调用父类的构造函数. 在 ...

  7. C#基础笔记(第十九天)

    1.CSS 层叠样式表 对HTML的补充实现网页内容和页面效果的彻底分离1.内联样式表(在标签内设置元素的样式)<p style="background:red; font-size: ...

  8. mysql--pymysql 模块

    pymysql模块 一.安装 cmd中使用pip或者, pycharm中控制台选择Terminal输入下面的命令,即可安装pymysql模块 pip3 install pymysql 二. 连接,执行 ...

  9. Java中Io流操作-File类的常用操作-创建文件,创建文件夹

    package com.hxzy.IOSer; import java.io.File;import java.io.IOException; public class Demo03 { public ...

  10. Elasticsearch入门CRUD(新增、查询、修改、删除)

    1. 项目中引用 Elasticsearch.NET         Elasticsearch 其他版本可在: http://www.nuget.org/  找到对应的项目以源码 ! 本文以 2.4 ...