异常的处理,Arrays类的使用
异常
异常定义
-
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
-
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误
java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出
java.lang.ArithmeticException 的异常。 -
发生异常的原因
a. 用户输入了非法数据
b. 要打开的文件不存在
c. 网络通信是连接中断,或者JVM内存溢出
编译时异常
- 最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常
- 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
错误
- 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
异常处理
Exception类
-
所有的异常类是从 java.lang.Exception 类继承的子类。
-
Exception 类是 Throwable
类的子类。除了Exception类外,Throwable还有一个子类Error 。 -
Java
程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。 -
Error 用来指示运行时环境发生的错误。
-
例如,JVM 内存溢出。一般地,程序不会从错误中恢复。
-
异常类有两个主要的子类:CheckException 类和 RuntimeException 类。
a. CheckException:检查时异常|编译时异常:一旦出现编译时异常,必须要手动进行处理,否则程序无法运行
b. 运行期间才会出现的异常
所有的运行期异常都会直接或者间接的继承自RuntimeExceptionc. 处理:增强程序的健壮性 (if判断)
Java内置异常类
-
1.NullPointerException 空指针
-
2.ArrayIndexOutOfBoundsException 数组越界异常
-
3.ArithmeticException 数学异常
-
4.ClassCastException 类型转换异常
-
5.NegativeArraySizeException 负数异常
-
6.NumberFormatException 数字格式异常
异常方法
-
public String getMessage()
返回关于发生的异常的详细信息。这个消息在Throwable
类的构造函数中初始化了。 -
public Throwable getCause()
返回一个Throwable 对象代表异常原因。 -
public String toString()
使用getMessage()的结果返回类的串级名字。
-
public void printStackTrace()
打印toString()结果和栈层次到System.err,即错误输出流。 -
public StackTraceElement [] getStackTrace()
返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。 -
public Throwable fillInStackTrace()
用当前的调用栈层次填充Throwable
对象栈层次,添加到栈层次任何先前信息中。
捕获异常
-
try中一旦遇到异常代码了,后面的代码将不在执行,直接去执行对象的catch中的内容
-
catch可以有一个也可以有多个,最好给不同的异常不同的catch,最终可以给Exception最大范围接受异常
-
如果出现多个catch,应该
把最大范围的写在最后,否则范围小的将永远执行不了 -
如果是编译时异常必须使用异常处理的两种方式之一处理,如果是运行时异常可以增强健壮性也可以异常处理
Throws/throw关键字
-
如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws
关键字来声明。throws 关键字放在方法签名的尾部。 -
也可以使用 throw
关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
Finally关键字
-
finally 关键字用来创建在 try 代码块后面执行的代码块。
-
无论是否发生异常,finally 代码块中的代码总会被执行。
-
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
-
finally 代码块出现在 catch 代码块最后,语法如下:
-
自定义异常
-
当代码执行到某一个阶段时,逻辑上想要抛出一个异常,可以进行选择异常(jdk提供的,可以自定义)
a. 需要直接或者间接的继承自Exception
b. 自定义类体实现
-
所有异常都必须是 Throwable 的子类。
a. 如果希望写一个检查性异常类,则需要继承 Exception 类。
b. 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。