最近的一个内部表决系统开发过程中,
发现对异常处理还存在一些模棱两可的地方,
所以想着整理一下
主要涉及到:
1.try catch finally throws throw 的使用和解读
2.自定义异常的使用
3.常见的运行异常

/**
* Java 异常处理
* try catch finally throws throw
* @author Ma San
*
*/
public class ExceptionTest {


// 函数可能发生异常时 两种处理办法
// 1.try catch 捕获并处理异常
// 2.throws 声明异常
/**
* try catch 捕获并处理异常
*/
public void function1(int index){
try {
// 以下代码抛出异常,并且被捕获
if(--index<0) throw new Exception("index out of 0");
} catch (Exception e) {
// catch 内处理异常
// TODO: handle exception
}
}

/**
* throws 声明异常
* @throws Exception
*/
public void function2(int index) throws Exception{
// 以下代码抛出异常
if(--index<0) throw new Exception("index out of 0");
}

// 比较 try catch 和 throws 的区别
// 前者会捕获异常并处理,后者只是声明会发生的异常,并不能捕获也不能处理
// throws声明异常,如果被抛出,最终也会被try catch 捕捉处理
// 如果程序中没有try catch 那么 该线程被终止,如果是主线程则程序会被终止

// try catch finally throws throw 语法规则和比较

// 1.try catch :捕获异常
// 2.finally : 任何情况下都会执行的代码
// 3.throws: 声明可能会发生的异常
// 4.throw: 抛出异常

//语法规则:
//(1):try代码块不能单独存在,后边至少有一个catch或者finally代码块
// 以下代码会发生编译错误
public static void main(String args[]) throws Exception{
try{
//代码
}
}
//(2):try代码快后边可以没有catch也可以有多个catch,可以没有finally也可以有一个finally
// 其中,如果catch 和 finally要共存,则finally 必须出现在catch的后面

// (3): try 代码块和catch、finally代码块是不同的作用域
// 在try代码块声明的变量 catch 和 finally不能访问
try
{
// 在try代码块中声明变量
int num = 0;

}
catch (Exception e)
{
num++; // 不合法,编译错误
}finally{
num = 9; // 不合法,编译错误
}

// 定义在try代码块外
int num = 0;
try
{

}
catch (Exception e)
{
num++; // 合法
}finally{
num = 9; // 合法
}

 

(4): try 后面包含多个catch的时候,JVM会一次和各个catch代码块声明的异常类型匹配
如果异常对象为某个异常类型或者其子类实例就执行这个catch代码块,不再执行其他的。
例:
try
{
code;//假设可能抛出FileNotFoundException
}
catch (SQLException)
{
System.out.println("SQLException");
}
catch (IOException)
{
System.out.println("IOException");
}
catch (Exception)
{
System.out.println("Exception");
}
发生异常控制台会输出 “Exception”;

(5)throw 语句后面不允许紧跟其他语句,因为这些语句永远不会被执行

}

分类:

技术点:

相关文章: