Java 异常处理机制
作者:邹爱红
撰写时间:2019年05月08日
Java异常处理机制为:抛出异常,捕捉异常,处理异常。
使用try…catch捕获异常有五点要注意:
不要过度使用异常,不能使用异常处理机制来代替正常的流程控制语句:就是不能用异常代替流程控制语句:比如:ifelse,能用流程控制语句解决的问题,不要扔给异常
异常捕获时,一定要先捕获小范围异常,再捕获大范围异常。否则小范围异常将无法被捕获,如果大范围的在上面先捕获,下面的小范围就不能捕获了,Exception是大范围的
避免出现庞大的try块:被扔到try块中的代码就相当于Java虚拟机会有一个监视得类去监视它。运行过程是慢的
避免使用catch(Exception e){}所有的异常,
不要忽略异常:就是catch中要有代码块,不能是空的
异常的根类 :
Throwable 可抛出的生成Error错误类,出现错误就无法往回的
Exception常用方法:
printStackTrace标准错误流默认打印方式 打印出错误的追踪信息(从哪里错的一直打印到调用的位置为止)帮助你追踪错误产生的过程。
打印异常信息printStackTrace打印错误的信息到指定的文件
getMessage()只返回消息字符串 打印文字的信息
getLocalizedMessage 打印出本地错误信息
getMessage 只返回消息字符串,打印出文字错误信息等等
Java异常体系分两种(异常(Exception)和错误(Error)),
异常(Exception):可以抛出多种异常,常用的有这些……
NumberFormatException 数字格式异常 转换异常数字
ArithmeticException:算术异常
ArrayIndexOutOfBoundsException 数组索引越界
IndexOutOfBoundsException索引越界异常
Exception其它异常
Error错误类: 出现错误就无法往回的
Checked异常和Runtime异常
有一些异常必须抛,有一些不用抛
Checked异常可检测的异常,没有完善错误处理的代码根本就不会被执行!
Runtime异常运行时异常,不会显示声明抛出,如果程序需要捕获
Runtime异常,也可以使用try…catch块来实现。
- throws抛出异常和throw抛出异常
throws把异常给抛出去,在这个方法中,如果用了throws,就是在告诉调用者,这些异常不处理,给调用者去处理。;如果main方法也不知道如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方法是,打印
异常的跟踪栈信息,并中止程序运行。谁调用谁处理。只是声明抛出去,但是不处理这个异常,声明不处理当前这个方法.throw给一个权限,手动去抛出一个异常:就是那个异常是自己定义的在有些判断的情况下,需要让上层知道的时候,可以结合异常机制的时候,自己手动去抛一个异常,这个就是在那些try
catch中去自定义一些错误信息。 如果需要在程序中自行抛出异常,则应使用throw语句,throw语句可以单独使用,
throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例自定义异常类需要继承Exception
- 需要自定义哪个异常(自己定义一个类起名字)就需要继承一个java里面的异常Exception Class Demo1Exception extends Exception {
- 然后默认序列化id
- 需要提供两个构造器:一个是无参数的构造器;另一个是带个字符串参数的构造器(定义一个有参数的构造器把参数调用给super(里面是字符串的参数),不调用super就获取不了信息),主要是为了描述信息。
只需要实现以下
它的无参数构造器和有字符串参数的构造器(跟类名一致),其它需要什么就往里面加,
主方法里面就可以用自定义异常实例throw的来捕捉错误信息
try {
被扔到try块中的代码就相当于Java虚拟机会有一个监视得类去监视它。运行过程是慢的
} catch (Demo1Exception e) { 捕获自定义Demo1Exception异常
e.printStackTrace();打印追踪信息
}
public static int shang(int x, int y) throws 构造器1{
if (y < 0) {
throw new 构造器1(“自定义错误信息”);
在有些判断的情况下,需要让上层知道的时候,可以结合异常机制的时候,自己手动去抛一个异常,
}
Java中允许用户自定义异常,买单时自定义异常类必须继承Exception或者子类:
public class ExceptionDemo3 {
public static void main(String[] args)
{
//下面定义一个try catch语句捕获异常
try {
shang(4,-2);
}
catch (Demo1Exception e) {//捕获自定义异常
e.printStackTrace();
}
}
public static int shang(int x, int y) throws Demo1Exception{
if (y < 0) {
throw new Demo1Exception(“被除数小于0”);// 抛出自定义异常
}
int m = x / y;
return m;
}
}
//自定义异常类继承Exception异常基类
class Demo1Exception extends Exception {
//序列化ID
private static final long serialVersionUID = 1L;
// 1、提供一个无参构造器
public Demo1Exception() {
}
// 2、带一个字符串参数的构造器
public Demo1Exception(String msg) {
super(msg);
}
}
自定义异常的结果:
一般Java里面都是用Java自身的异常,来捕捉错误,自定义异常类很少。
try { 代码
} catch (ArrayIndexOutOfBoundsException e) { JAVA中的数组索引越界异常
e.printStackTrace();
}