异常和错误之间的区别
首先,我们需要了解异常和错误之间的区别
- Error表示系统致命的错误,程序是无法处理这些错误的,即:Error类是指与JVM相关的问题,比如:系统崩溃,虚拟机错误,内存溢出等
- Exception是指程序可以捕获并处理的异常,并且程序可能会被恢复。
异常又分为运行时异常
和编译时异常
异常继承体系 |
---|
运行时异常一般都属于程序员犯错 |
其它都是编译时异常,编译时就会报错 |
异常的处理方法
1、交给jvm处理
JVM异常处理方式 |
---|
java收到问题时有两种处理方式1.自己处理,然后继续运行(后面会介绍)2.自己没有办法处理,交给jvm来处理 |
JVM有一个默认的异常处理机制将异常处理 |
并将该异常的名称,异常信息,异常出现的位置给打印在控制台上,同时停止运行 |
例:
public static void main(String[] args) {
int a = 10 / 0;
System.out.println(a);
}
10/0违背了算法运算法则,抛出异常。
抛出的异常是一个对象,New ArithmeticException(“/by zero”) 把这个异常对象返回。 此时想把异常对象赋值给a。
a是一个int类型不能接收,main方法解决不了。交给jvm来处理,jvm就将该异常在控制台打印程序终止。
2、自己处理
自己 处理异常两种方式 |
---|
1.try…catch…finally |
2.throws |
try..catch处理异常的基本格式
try{
可能出现理异常的代码
}catch(异常类型){
}finally{
处理完异常最后做的处理
}
- Try:用来检测异常
- Catch:用来捕获异常
- Finally:释放资源
例:
public static void main(String[] args) {
try {
int a = 10 / 0;
System.out.println(a);
} catch (ArithmeticException a) {
System.out.println("除数不能为0!");
}
}
10/0;会创建一个异常对象New ArithmeticException(“/by zero”)。
赋值给a,接收不了,此时就把异常对象传给catch当中的参数a。
能够接收,就会执行catch当中的内容,程序也没有终止。
public void setAge(int age) throws {
if(age > 0 && age <= 150){
this.age = age;
}else {
// 自己手动抛出一个运行时异常
throw new RuntimeException("年龄非法");
}
}
抛出了一个编译时异常,必须得要有人处理。如果不处理,必须继续往上抛,抛给方法调用者。
此时由于setAge内部抛出了一个异常,在调用该方法时必须得要处理,如果不处理就会报错。还有一种方法自己不处理,继续往上抛出。
即:
此时自己没有去处理,又往上抛出,给了main方法。
main方法的调用者是jvm,jvm内部有一个异常处理,会把异常信息打印在控制台上,终于程序执行。
常见的异常类型
-
ArithmeticException
数学运算异常
int a = 10 / 0;
System.out.println(a);
-
ArrayIndexOutOfBoundsException
数组下标越界异常
//定义数组的长度为2 但是查找的是第三4个所以会出现数组下标越界异常
int[] a = new int[2];
System.out.println(a[3]);
-
NumberFormatException
字符串转换为数字异常
String str = "123a2";
int a = Integer.valueOf(str);
System.out.println(a);
-
ClassCastException
数据类型转换异常
// 当试图将对某个对象强制执行向下转型,但该对象又不可转换又不可转换为其子类的实例时将引发该异常
Object object = new Object();
String str = (String) object;
-
NullPointerException
空指针异常
// 当给字符串一个null才会出现空指针异常
String str = null;
if (str.equals(null)) {
System.out.println("我是空指针异常");
}
-
ClassNotFoundException
指定的类不存在
这里主要考虑一下类的名称和路径是否正确即可,通常都是程序试图通过字符串来加载某个类时可能引发 异常
-
IllegalArgumentException
方法的参数错误
举个例子:getUser(int username)方法,不允许传入空字符串或者null。但是有个调用的方法,没做检查,传入了null或者空字符串,这时候getUser方法就应该要抛出IllegalArgumentException告诉调用者:hi!这个参数不能为empty或者null。
-
IllegalAccessException
没有访问权限
当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了Package的情况下要注意这个异常.