学习Java的第九天
-
异常的体系结构
- 异常有个顶级父类 Throwable
- 下面有两个直接子类 Exception Error
- 其中Error 不编写针对性代码进行处理
- Exception又分为编译时异常和运行时异常
-
运行时异常常有
-
:ArrayIndexOutOfBoundsException
@Test public void array(){ int[] arrays = new int[3]; System.out.println(arrays[3]); }
-
ClassCastException
public void method(){ Object str = "abc"; // 此处运用了多态 和 自动装箱 Integer in1 = (Integer)str; }
-
NullPointerException
public void method1(){ //NullPointerException String []str1 = null; System.out.println(str1[0]);
-
ArithmeticException
public void method2(){ //ArithmeticException 数学运算异常 int m = 4; int n = 0; int i = m / n; System.out.println(i); }
-
-
编译时异常通常有
- FileNotFoundException
- java.io.FileNotFoundException
- EOFException 文件已经终止 但是继续读取
-
异常的处理机制
-
try-catch-finally
-
Java程序的执行过程中如出现异常,会生成一个异常类对象, 该异常对象将被提交给Java运行时系统,这个过程称为抛出 (throw)异常。 一般逐级上抛,抛到主方法就终止。
-
格式:
try{ ...... //可能产生异常的代码 } catch( ExceptionName1 e ){ ...... //当产生ExceptionName1型异常时的处置措施 } catch( ExceptionName2 e ){ ...... //当产生ExceptionName2型异常时的处置措施 } finally{ ...... //无论是否发生异常,都无条件执行的语句
-
-
捕获异常的有关信息: 与其它对象一样,可以访问一个异常对象的成员变量或调用它的 方法。
- getMessage() 获取异常信息,返回字符
try { i = m / n; } catch (java.lang.Exception e) { // e.printStackTrace(); e.getMessage(); } //抛出 0 说明 0的输入不合适
- printStackTrace() 获取异常类名和异常信息,以及异常出 现在程序中的位置。返回值void。
-
finally
- 不论在try代码块中是否发生了异常事件,catch语句是否执 行,catch语句是否有异常,catch语句中是否有return, finally块中的语句都会被执行。
-
在开发中,运行时异常一般不需要捕获 抛出异常
- 一般是对编译时异常进行捕获 抛出异常
-
异常的处理机制2-throws
- 如果一个方法可能生成某种异常,但是不能确定如何处理这种异常,应该显示的声明抛出异常,表面该方法将不对这些异常进行处理,由该方法的调用者负责处理。
public void readFile(String file) throws FileNotFoundException { // 读文件的操作可能产生FileNotFoundException类型的异常 FileInputStream fis = new FileInputStream(file); }
- 重写方法不能抛出比 被重写方法更大的异常
-
手动抛出异常-throw
IOException e = new IOException(); throw e; //首先要生成异常类对象,然后通过throw语句实现抛出操作(提交给Java运行环境)。 //可以抛出的异常必须是Throwable或其子类的实例。
-
用户自定义异常类特点
- 用户自定义异常类都是RuntimeException的子类。
- 通常需要编写几个重载的构造器。
- 需要提供serialVersionUID
- 通过throw抛出
- 要见名知义
-
throws和throw的区别
- throws 声明在方法的声明处 用来对异常做处理
- throw声明在方法内 用来 抛出一个异常的对象