一、异常分类
1、受检异常
在进行代码编写时就会给出提示的异常需要使用 try-catch-finally 处理或使用 throws 抛出。
2、非受检异常
在代码编写时不会给出提示但是在运行时可能会出现的异常。例如:空指针异常,数组脚标越界异常等
String str1 = null;
String str2 = "好好学习,天天向上!";
System.out.println(str1.equals(str2)); //编写时并没有报错,运行时会出现NullPointerException异常
二、异常处理
1、throws
throws:方法可能会抛出异常。(用在声明方法时,表示该方法可能要抛出异常)
2、throw
throw:对于非受检异常当代码运行到此处时就会出现异常,对于受检异常在编写时就会给出提示。两种异常都可以抛出或用 try-catch-finally 解决,但通常使用throws抛出(throw声明在方法内部)
//非受检异常
public void setAge(int age) throws RuntimeException{
if(age<0 || age>150) {
RuntimeException e;
throw e = new RuntimeException("年龄不合法");
}else {
this.age = age;
}
}
3、try-catch-finally
try-catch-finally:用于处理异常,当异常不被抛出时就需要使用 try-catch-finally 处理,其中 finally 部分是必须执行部分即使在 try 或 catch 中执行了return 语句也会在返回前运行finally中的语句。finally 可以有也可以没有。
将可能出现异常的部分放在try块中,对异常的处理放在catch块中。
出现异常后不再执行后面的语句,如果异常出现在try中便不再执行try块中后面的语句。
public static void main(String[] args) {
String str1 = "好好学习,天天向上!";
String str2 = null;
boolean bool;
try {
bool = str2.equals(str1); //在这会出现空指针异常
System.out.println("少睡觉,多看书!");
}catch(NullPointerException e) {
System.out.println("str2不能为空!");
return;
}finally {
str2 = "好好学习,天天向上!";
System.out.println(str1.equals(str2));
}
}
/*执行结果为:
str2不能为空!
true
*/
但是有一种特殊的情况:如果出现System.exit(0); 语句便终止程序,不会继续执行后面的代码
public static void main(String[] args) {
String str1 = "好好学习,天天向上!";
String str2 = null;
boolean bool;
try {
bool = str2.equals(str1);
System.out.println("少睡觉,多看书!");
}catch(NullPointerException e) {
System.out.println("str2不能为空!");
System.exit(0);
}finally {
str2 = "好好学习,天天向上!";
System.out.println(str1.equals(str2));
}
}
/*执行结果为:
str2不能为空!
*/
三、自定义异常
编写一个类,继承Exception,并重写一个参数的构造方法即可完成自定义受检异常类型。
编写一个类, 继承RuntimeExcepion,并重写一个参数的构造方法即可完成自定义运行时异常类型。
public class Age extends Exception{
public Age(String str) {
super(str);
}
}