异常分为运行时异常和编译时异常,除了运行时异常外的所有异常都属于编译时异常。
通俗的说,编译时异常就是就是在编译时就会发生的异常,也就是会在编译时报错,例如**Thread.sleep()**函数,如果直接调用的话编译器会提示
Unhandled exception type InterruptedException
告诉我们解决方法是捕获异常或者抛出异常
而运行时异常则是可以通过编译,但不一定能成功运行,我们比较常见的有数组越界异常。
public class hello{
public static void main(String[] args) {
int[] a = new int[3];
for(int i =0; i<3; i++) {
a[i] = i;
}
System.out.println(a[3]);
}
}
上面的代码不会报错,但我们明显知道a[3]是不能访问的,如果我们点击运行,就会出现错误
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
at luoxin.hello.main(hello.java:10)
显示数组越界,这就是运行时异常。
对异常的处理有三种方式
- try…catch和finally
捕获异常,常用格式如下
try {
//可能发生异常的语句
} catch(Exception类或其子类 e) {
//对捕获的异常做处理
} finally {
//无论是否发生异常finally里中的语句都会执行
}
- throws
- throw
throws关键字可以抛出异常,我个人对抛出异常的理解就是通过抛出异常告诉编译器这个方法可能会出现异常,但是让编译器别管,(至少在编译阶段不要报错)我会在后面对异常进行处理。例如前面的sleep如果抛出异常的话编译器就能通过。
而try catch语句捕获异常则是对异常进行处理,这个应该不难理解。因为前面虽然抛出异常让编译通过了,但异常终究存在,既然存在,我们就必须对其进行处理,否则程序就会在运行时崩溃
注意:如果一个方法本来不会报错,但是被throws了的话,编译器会认为其会报错,所以throws不止可以处理类似除数不能为0的算数运算错误,还可以用来处理逻辑错误。
throw与throws都是抛出异常,与throws有所不同的是,throw用于方法体内,并且抛出的是一个一个异常类对象,而throws用于方法声明中,用来指明方法可能抛出的多种异常
对于下面的代码,编译执行不会有任何问题,但是根据常识可知人的年龄不可能为负数,所以我们可以对相应方法进行处理,在设置的年龄为负数时出现异常;
package luoxin;
public class hello{
public static void main(String[] args) {
people luoxin = new people();
luoxin.setAge(-9);
luoxin.setName("luoxin");
System.out.print(luoxin.getName()+"的年龄是"+luoxin.getAge());
}
}
class people {
private String name;
private int age;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
修改后:
package luoxin;
public class hello{
public static void main(String[] args) throws Exception {
people luoxin = new people();
try {
luoxin.setAge(-9);
luoxin.setName("luoxin");
System.out.print(luoxin.getName()+"的年龄是"+luoxin.getAge());
} catch(Exception e) {
e.printStackTrace();
}
}
}
class people {
private String name;
private int age;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) throws Exception{
if(age<0) {
throw new Exception("年龄不能为负数!\n");
} else {
this.age = age;
}
}
public void setName(String name) {
this.name = name;
}
}
个人理解,欢迎指正