语法定义:
try{ 代码片段 }catch(Exception e){ 代码段 }catch(){ }...
每个try语句块可以定义多个catch,当不同的异常我们有不同的处理手段时,可以分别捕获这些异常并处理。
最后一个catch处理Exception,可以避免因为一个未捕获的异常导致程序中断
比如IO操作完的关闭就可以放在finally中,以确保执行
public static void main(String[] args) {
FileOutputStream fos = null;//finally和try是两块作用域,若声明在try里finally里调用fos.close会报错,所以声明在外面
try {
fos = new FileOutputStream("fos.txt");
fos.write(1);
}catch(IOException e) {
System.out.println("出错了");
}finally {
try {//这里调用close也有可能出异常,所以也要写在异常处理块中
if(fos!=null)//因为最开始fos赋值为空,如果fos赋值的时候出错了,fos值是null
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
JDK7出现后,有一个特性:自动关闭。在try后面可以跟一个小括号,里面放的一般是继承了closeable的类(也就是有close功能的),不必再写finally代码段,这样编译时会自动添加。
下面这段代码编译后会自动补全和上面的一样
public static void main(String[] args) {
try (
FileOutputStream fos = new FileOutputStream("fos.txt");
){
fos.write(1);
}catch(IOException e){
System.out.println("出错了");
}
}
下面代码的运行结果是什么?
public static void main(String[] args) {
System.out.println(test("0")+","+test(null)+","+test(""));
}
public static int test(String str) {
try {
return str.charAt(0)-'0';
}catch(NullPointerException e) {
return 1;
}catch(Exception e) {
return 2;
}finally {
return 3;
}
}
返回结果3,3,3
return的执行过程分两步:
- 1,jvm在执行有返回值的方法时,会自动声明一个相应类型的变量来储存返回值,这里就是int,当return 时,先把后面的值赋给int变量.
- 2,第二步跳过后面的语句结束方法,但是return在try块里,结束前需要走一遍finally,所以finally里的return重新给int变量赋了个值
- 3.finally必走,finally里一旦写了return,之前的return都不会生效,这是要注意的
throw new ArithmeticException(String message);
比如在某个方法中可能因某些错误而引发异常,但是不希望直接在这个方法中处理这些异常,而希望调用它的这个方法来统一处理,这时候就可以使用throws
public class ThrowsDemo2 {
public void dosome()throws IOException ,AWTException{
}
}
class Son extends ThrowsDemo2{
可以什么都不抛
public void dosome() {
}
可以抛父类异常的其中几个
public void dosome()throws IOException {
}
可以抛出父类方法抛出异常的子类型异常
public void dosome()throws FileNotFoundException {
}
不允许抛出额外异常(与父类异常不同,且没有继承关系)
public void dosome()throws SQLException {
}
允许抛出父类方法抛出异常的子类异常,但是不可以抛父类异常的父类异常
public void dosome() throws Exception{
}
}
void printStackTrace()
try{}catch(){
e.printStactTrace();//输出执行堆栈信息
}
通常使用自定义异常来定义业务逻辑问题