Java简易教程——一篇搞定异常捕获和处理

 

img

一、Java的异常

在程序运行的过程中,出现异常的原因有很多,比如数据类型的异常,或者是文件路劲的错误导致的异常,或者是文件被删除了导致的异常,有或者是没有连接到服务器等。但是一个健全的程序,在遇到出错或者异常时候,要有办法应对。

方法一:返回约定得错误码

比如,处理一个文件,如果返回0,表示成功,返回其他整数,表示约定的错误码。

方法二、使用内置异常处理机制

既然Java有内置得一套异常处理机制,为啥还要自己定义错误码?内置异常处理机制使用跑出的方式。因为异常是一种类class,所以他本身带有类型的信息,有集成类的关系。

try {
    String s = processFile(C:\\test.txt);
    // ok:
} catch (FileNotFoundException e) {
    // file not found:
} catch (SecurityException e) {
    // no read permission:
} catch (IOException e) {
    // io error:
} catch (Exception e) {
    // other error:
}

二、捕获异常

像上面的例子,捕获异常可以使用try…catch语句,可能发生的错误的代码放在try{…}中,然后使用catch捕获对应的Exception及其子类。Exception是异常class的一个类,可以捕获并处理异常。

每种错误都需要对应的类来处理,像上面的例子中的FileNotFoundException,如果不写的话会出错,这个是Java内部定义好的。

因为main()方法是程序执行的入口,所以异常处理也应该放在main()方法里面,所以main()方法也是最后捕获Exception的机会。如果不想写任何try代码,可以直接把main()方法定义为throws Exception,那么内部就无需捕获了。

public class Main {
    public static void main(String[] args) throws Exception {
        byte[] bs = toGBK("中文");
        System.out.println(Arrays.toString(bs));
    }

    static byte[] toGBK(String s) throws UnsupportedEncodingException {
        // 用指定编码转换String为byte[]:
        return s.getBytes("GBK");
    }
}

捕获异常可以使用2种书写方式:

多个catch语句

使用多个catch,匹配到某个catch后,执行catch代码块,然后不再继续匹配。所以catch的顺序非常重要:子类必须写在前面。

try {
    String s = processFile(C:\\test.txt);
    // ok:
} catch (FileNotFoundException e) {
    // file not found:
} catch (SecurityException e) {
    // no read permission:
} catch (IOException e) {
    // io error:
} catch (Exception e) {
    // other error:
}



//如果两个类处理的代码相同可以使用|隔开 语法如下。
try {
    String s = processFile(C:\\test.txt);
    // ok:
} catch (FileNotFoundException | SecurityException e) {
    // 相同的语句
} 


finally语句

finally语句语句的作用是无论有没错误都会执行。例如一下的代码重复写了 System.out.println(“END”);所以可以改写放在finally语句里面。程序执行完无论有没错误都会执行finally语句。所以finally语句不是必须的,可写可不写;finally总是最后执行

try {
    String s = processFile(C:\\test.txt);
    // ok:
} catch (FileNotFoundException e) {
    // file not found:
     System.out.println("END");
} catch (SecurityException e) {
    // no read permission:
     System.out.println("END");
} catch (IOException e) {
    // io error:
     System.out.println("END");
} catch (Exception e) {
    // other error:
     System.out.println("END");
}


//改写
try {
    String s = processFile(C:\\test.txt);
    // ok:
} catch (FileNotFoundException e) {
    // file not found:
} catch (SecurityException e) {
    // no read permission:
} catch (IOException e) {
    // io error:
} catch (Exception e) {
    // other error:
}
finally {
        System.out.println("END");
    }

本文为博主原创文章,知识共享,开源精神,转载注明出处。