JAVA——异常及异常处理

来源:互联网 发布:数据分析师加班厉害吗 编辑:程序博客网 时间:2024/05/16 12:00

1.异常的概念

  • 异常是指程序运行期间出现的错误,而非编译时的语法错误。例如,程序要打开不存在的文件夹、网络连接中断、操作数越界、装载一个不存在的类、算数异常等。

  • 使用异常的目的在于通过使用少于目前数量的代码来简化大型、可靠的程序的生成,并且通过这种方式可以使你更加自信:你的应用没有未处理的错误。——《JAVA编程思想》如是说。

  • 补充:
    这里写图片描述
  • 示例1:
public class  TestException{    public static void main(String[] args)     {        int array[] = {1, 2, 3};        System.out.println("array[5]=" + array[5]);    }}
  • 编译,运行:
D:\JavaProject\demo14>javac TestException.javaD:\JavaProject\demo14>java TestExceptionException in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5        at TestException.main(TestException.java:6)
  • 出现了“数组索引越界异常”,ArrayIndexOutOfBoundsException。在Java中,会严格检查数组的长度的,即在程序中,运行时不能出现数组越界的索引。

  • 示例2:

public class  TestException{    public static void main(String[] args)     {        int a = 2/0;    }}
  • 编译,运行:
D:\JavaProject\demo14>javac TestException.javaD:\JavaProject\demo14>java TestExceptionException in thread "main" java.lang.ArithmeticException: / by zero        at TestException.main(TestException.java:5)
  • 出现了算数异常。运行打印出的异常信息就是“错误的堆栈信息”。

  • 错误堆栈信息:此错误可能是上一个错误导致的,上一个错误又可能是另外一个错误引起的,到底是由哪一个错误引起的,把这些错误信息都打印出来,为程序员提供了调试信息,方便程序员进行错误追踪和调试。

2.异常的分类

这里写图片描述
这里写图片描述

3.捕获异常及处理

3.0异常处理

这里写图片描述

  • 补充:对于RuntimeException类的子类exception,我们可以也可以不使用try-catch语句来捕获异常。对于除了RuntimeException类的子类exception之外的exception,我们都必须需要使用try-catch语句来捕获异常,例如ArrayIndexOutOfBoundsException异常类。
  • 对于异常,当前环境没有足够的信息来解决这个问题,所以就把这个问题提交到一个更高级别的环境中,一直到main()方法,在这里将作出正确的决定。

这里写图片描述

3.1 调用抛出异常的方法使用try{}catch(){}语句

  • try{}catch(){}语句:当try代码中的程序发生了异常,系统将这个异常发生的代码行号、类别信息封装到一个对象e中,并将这个对象传递给catch代码块。
  • 每个try语句必须有一个或多个catch语句,try代码块与catch代码块及finally代码块之间不能有其他语句存在。
    这里写图片描述

  • finally语句
    (1)在try-catch语句后,还可以有一个finally语句,finally语句中的代码不管是异常是否被捕获总是要执行的。
    (2)finally中的代码块不能被执行的唯一情况是:在被保护代码块执行了System.exit(0);语句。
    (3)finally语句的其他用法参见:《Java编程思想》第12.8节,或者我的下一篇博文:JAVA——finally块中的代码什么时候被执行、执行的效果是什么?。

  • 示例3:
import java.io.*;public class  TestException{    public static void main(String[] args)     {        FileInputStream fis = null;        fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt");/*myfile.txt里面的内容是hello world!*/        int b = fis.read();        while(b != -1)        {            System.out.println((char)b);            b = fis.read();        }        fis.close();    }}
  • 编译,运行:可以发现,存在异常没有进行捕获和处理(抛出)。
D:\JavaProject\demo14>javac TestException.javaTestException.java:7: 错误: 未报告的异常错误FileNotFoundException; 必须对其进行捕获或声明以便抛出                fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt");                      ^TestException.java:8: 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出                int b = fis.read();                                ^TestException.java:12: 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出                        b = fis.read();                                    ^TestException.java:14: 错误: 未报告的异常错误IOException; 必须对其进行捕获或声明以便抛出                fis.close();                         ^4 个错误
  • 查看jdk文档:
    (1)FileInputStream类有三个构造方法,此处调用的构造方法如下图,可以看到该构造方法抛出了一种没找到目标文件的异常类。因此,我们在调用该方法时,必须要使用try-catch语句进行捕获异常。
  • 若一个方法名后写明了throws时,调用该方法时必须使用try-catch语句进行捕获异常。当所抛出的异常类是RuntimeException的子类时,可以不对其进行try-catch。

  • 这里写图片描述
    这里写图片描述

  • 方法close()和方法read()都会抛出异常:

  • 这里写图片描述
    这里写图片描述

  • 示例4:

import java.io.*;public class  TestException{    public static void main(String[] args)     {        FileInputStream fis = null;        try{            fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt");            int b = fis.read();            while(b != -1){               System.out.print((char)b);               b = fis.read();            }        }catch (FileNotFoundException fe){            fe.printStackTrace();        }catch (IOException ioe){            ioe.printStackTrace();        }finally{            try{                fis.close();            }catch (IOException ioe){                ioe.printStackTrace();            }        }    }}
  • 编译,运行:输出hello world!
D:\JavaProject\demo14>javac TestException.javaD:\JavaProject\demo14>java TestExceptionhello world!

3.2 声明方法时抛出异常:throws SomeException

  • 如果将“示例4”的部分代码写成一个方法:因为在这个func方法中,throws抛出了两个异常:FileNotFoundException 、 IOException。因此,我们在使用该方法时,就必须使用try-catch语句进行捕捉和处理。
  • 在声明时,所抛出的异常是方法体中可能存在的所有异常类。而FileNotFoundException 是IOException的子类,所以在声明方法时,直接抛出IOException类异常即可。但是为了直观,程序的可读性,还是建议把所有可能的异常类均完整的写出来。
  • 而在使用该方法时,FileNotFoundException 是IOException的子类,可以直接创建父类的异常对象IOException即可。

  • 示例5:

import java.io.*;public class  TestException{    public static void main(String[] args) {        try{            TestException te = new TestException();            te.func();        }catch (IOException e){            e.printStackTrace();        }    }    void func() throws FileNotFoundException , IOException {        FileInputStream fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt");        int b = fis.read();        while(b != -1){           System.out.print((char)b);           b = fis.read();        }        fis.close();    }}
  • output:
D:\JavaProject\demo14>javac TestException.javaD:\JavaProject\demo14>java TestExceptionhello world!
  • 当使用函数调用方法func()时,func抛出的异常不是Runtime异常,而是必须捕捉的异常,因此在调用时必须写try-catch,并进行处理。见示例6。
  • 如果捕捉到这周异常后,也不知道怎么处理,那么继续将这些异常给抛出(在函数名后throws+要抛出的异常),这时直接调用它即可,不需要try-catch语句。只是抛出父类的异常IOException即可。见示例7。

  • 示例6:

import java.io.*;public class  TestException{    public static void main(String[] args) {        TestException te = new TestException();        te.f();    }    void func() throws FileNotFoundException , IOException {        FileInputStream fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt");        int b = fis.read();        while(b != -1){           System.out.print((char)b);           b = fis.read();        }        fis.close();    }    void f()     {        try{            func();        }catch (FileNotFoundException e){            e.printStackTrace();        }catch (IOException e){            e.printStackTrace();        }    }}
  • 示例7:
import java.io.*;public class  TestException{    public static void main(String[] args) {        try{            TestException te = new TestException();            te.f();        }catch (IOException e){            e.printStackTrace();        }    }    void func() throws FileNotFoundException , IOException {        FileInputStream fis = new FileInputStream("D:\\JavaProject\\demo14\\myfile.txt");        int b = fis.read();        while(b != -1){           System.out.print((char)b);           b = fis.read();        }        fis.close();    }    void f() throws IOException{           func();    }}

3.3 手动的构造并抛出异常对象

  • 遇到异常时,遇到throws时,可自动的往外抛出异常,我们不再去管它了。而还有一种异常,就必须自己手动的往外抛。
  • 抛的格式:throw + 要抛出的异常对象。方法定义时,指明要抛出异常的类。
  • 示例8:其中,可以指定异常信息,如”被除数为0“,利用getMassage()方法就可获得这个信息。当抛出new ArithmeticException(“被除数为0”);以后,这句后面的语句将不再执行。
void m(int i) throws ArithmeticException {        if(i==0)             throw new ArithmeticException("被除数为0");    }

4.使用自定义异常

-这里写图片描述
这里写图片描述
这里写图片描述

  • 注意:重写方法需要抛出与原方法所抛出异常类型一致的异常,或那些异常的字迹,或不抛出异常。
  • 这里写图片描述
0 0
原创粉丝点击