一、try…catch
如果你希望让程序发生异常以后能改得到控制就需要try…catch来处理
1、语法格式
try{
//可能发生异常的代码
}catch ( 异常类型 异常对象名 ){ //异常对象名绝大多数都是写 e
//处理这个异常的代码
}
//----------------------------------------------------------------------------------------
try{
//可能发生异常的代码
}catch ( 异常类型1 异常对象名 ){ //异常对象名绝大多数都是写 e
//处理这个异常的代码
}catch ( 异常类型2 异常对象名 ){ //异常对象名绝大多数都是写 e
//处理这个异常的代码
}catch ( 异常类型3 异常对象名 ){ //异常对象名绝大多数都是写 e
//处理这个异常的代码
}
……
会报错,数组越界,为什么呢?因为你一个参数都没给它传啊,你没有给它传值,那么它的长度就是0
那么怎么给它传值呢?
鼠标右键
然后配置一下,结果就出来了
下面我们继续来看异常处理
如果参数我们设置的是张三和李四,那么下面又进行了求商
就会报这个错
这个时候 try……catch 就派上用场了
但是这个异常并没有考虑到所有的异常,我们还得加
下面我们来研究一下
(1)e.printStackTrace() 是啥意思 print 打印 Trace 痕迹
打印异常的详细信息,包括追踪跟踪信息,即对象一路经历了哪些方法
继续 张三 李四 的参数运行代码,看下会打印什么
(2)e.getMessage() : 返回简单的错误信息提示
3、打印异常/错误信息
System.err.println( xx )
用于区别于普通的信息,其实也就是改了个颜色,其它的啥也没改
System.err/println ( ) ; 打印错误信息
System.out.println( );打印正常信息
4、多个catch分支,如何匹配和执行的?
从上到下,依次判断,一旦有一个满足,后面就不看了,只会进一个
建议:如果catch中的异常类型有大小包含关系,那么小的在上,大的在下,如果没有大小包含关系,顺序随意
因为Exception是它们的父类,如果按照我们从上到下判断的顺序的话,那么所有的异常就都进Exception了,下面的就根本没有机会执行到了
所以应该小的写在前面,大的写在后面
5、如果catch可以捕获try中发生的异常,那么程序会 try ……catch 下面的代码继续运行,程序不会挂
如果无法捕获try中发生的异常,就会导致当前方法结束并且把异常对象抛出给调用者,如果调用者可以处理,那么从调用者处理后的代码继续运行,否则继续往上抛,最终到达JVM,程序就崩溃了
二、try…catch…finally
如果我们有这样的一个需求:不管try中是否发生异常,也不管catch 是否可以捕获异常,要求有一段代码都必须执行
语法如下:
try{
//可能发生异常的代码
}catch ( 异常类型1 异常对象名 ){ //异常对象名绝大多数都是写 e
//处理这个异常的代码
}catch ( 异常类型2 异常对象名 ){ //异常对象名绝大多数都是写 e
//处理这个异常的代码
}catch ( 异常类型3 异常对象名 ){ //异常对象名绝大多数都是写 e
//处理这个异常的代码
}
……
finally{
//如果我们有这样的一个需求:不管try中是否发生异常,也不管catch 是否可以捕获异常,这段代码都必须执行
}
总结
try-catch也可以简写,在C#或者java中也可以这样简写
try{
//可能发生异常的代码
}catch{
//处理这个异常的代码
}
try{
//可能发生异常的代码
}catch{
//处理这个异常的代码
}finally{
//这里的代码一定会执行
}
可以没有catch,但是不能只有 try
//面试题中会出现
try{
//可能发生异常的代码
}finally{
//这里的代码一定会执行
}