文章目录

  • 错误和异常
  • try/catch语句
  • throw/throws 语句



在程序运行过程中难免会出现问题,Java中有一些类专门表示常见的问题。

错误和异常

过程:先抛出异常给JRE,再由JRE捕获异常。所有相关类都是throwable 的子类

错误(error)是比较严重的问题,基本上是运行代码时JVM出现的问题,当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError用Error类及其子类表示。

异常则一般是代码出现的问题,如方法使用的参数值为null值,被除数是0等。

分类::

  • Error类(不需要程序员处理):表示错误。
    Exception。

unchecked异常是运行时异常,Exception类的子类RuntimeException及其子类表示这类异常,如不建议在代码里处理。

checked异常是非运行时异常,一般是外部问题,如处理的文件格式不对,直接在代码里处理。

异常处理原则:
异常处理不能替代用户的问题,比如用户名错误;
异常处理不能替代测试;
异常处理不能小粒度地处理,最好是整个任务放在一个try语句里。
异常处理最好在高层即父类进行。

常见unchecked异常处理方法:
ArithmeticException,举例:

int b=0;
    if(b != 0) {
        System.out.println(1/b);
    }

NullPointerException,举例:

String str=null;
        if(str!=null) {
            System.out.println(str);
        }

ClassCastException,举例:

User u = new Student();
        if(u instanceof Teacher) {
            Teacher t = (Teacher) u;<>Teacher和Student均为User的子类<>
        }

ArrayIndexOutOfBoundsException,举例:

int[] a = new int[5];
        int l = 10;
        if(l<a.length) {
            System.out.println(a[l]);
        }

NumberFormatException,举例:

String s = "123abc";
        Pattern p = Pattern.compile("^\\d+$");
        Matcher m = p.matcher(s);
        if(m.matches()) {
            int num = Integer.parseInt(s);
        }

try/catch语句

如果异常可能会导致编译通不过,那么必须要用try/catch语句来处理。
try语句:放入可能出现异常的一段代码。

catch语句:放入异常处理代码,

finally语句:无论异常是否发生,一定会执行的语句,一般不要设置return语句,否则会覆盖前面语句的返回结果。

举例:

FileReader reader = null;
    try {
        reader = new FileReader("d:");
        char c = (char) reader.read();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally {
        try {
            if(reader != null) {
                reader.close();
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

throw/throws 语句

throws声明异常后,调用这个对象的时候才需要处理异常。

不建议在main里调用的时候继续声明,不然就会抛给JRE。

子类声明异常的条件:
不能超过父类的异常等级,即不能抛异常类的父类或上层类;
声明的异常不能是父类异常的同级别异常的子类异常。

public void run() throws IOException{...}

如果想在方法体内抛异常,就需要使用throw关键词,后面跟着异常对象而不仅仅是异常类,举例:

public void run(){
	throw new FileNotFoundException("file not found!");
}