当Java中遇到异常时,会产生异常对象
使用try,catch语句来接收对象
try—catch的执行情况
1.try块中没有出现异常,catch块中的代码不执行。但要执行catch后的代码。
2.try块出现异常,并且与catch中的异常类型匹配(相同类父类),执行catch中的代码,并且执行catch后的代码。
3.try块出现异常,但与catch中的异常类型不匹配(这时其实会向上抛出,抛给虚拟机),不执行catch中的代码,程序中断。
try{
System.out.println("Please enter the total score");
int sum= scanner.nextInt();
System.out.println("Please enter the number of people");
int num= scanner.nextInt();
int result=sum/num;
System.out.println("The result is "+result);
}catch(java.util.InputMismatchException e){
System.out.println(e.toString());
System.out.println("你的输入有误");
}
结果
catch块中的处理代码
1.输出自定义信息
System.out.println("你的输入有误");
2.输出系统信息
e.printStackTrace();
System.out.println(e.toString());
e.getMessage();
3.使用throw关键字继续向上抛,但抛出去之后throw后的代码就不执行了。如果直接在throw后跟代码,会直接报错。
throw e;
catch块中语句不执行的情况
1.遇到throw
关键字,throw后的语句全部不执行。
2.遇到return
关键字,会直接退出该方法,所以也不会执行return中的语句。
3.遇到System.exit(0);
语句直接退出虚拟机,不会执行catch中的代码。
注意:
1.产生异常后,Java会生成异常对象,同时寻找匹配的catch块找到将异常对象付给catch的异常参数。
2.出现异常后try中没有执行的代码,不会执行。
finally关键字
作用:无论是否出现异常,都必须要执行的代码可以放在finally块中。
执行顺序:
1.catch块中异常类型不匹配的情况:会把finally中的代码执行完了以后,再向上抛给虚拟机。
2.遇到return
关键字,会先把finally中的代码执行完了,在进行return来结束当前方法。
3.如果遇到了System.exit(0);
,finally也不管用,直接结束虚拟机。
多重catch块
作用:同时设定多个异常的匹配对象,能够更加清楚的描述异常类型。
执行顺序:
出现异常后,Java会从上到下依次匹配异常类型。如果匹配成功就不再进行匹配。通常会把Exception这个异常的顶级类,放在最后一个catch块中,这样可以保证异常一定会被接收。但是Exception类不能放在其他异常类的前面(会直接报错),这样会导致后面的catch块是没有用的。
catch(java.util.InputMismatchException e){
// //输出自定义的信息
// System.out.println("你的输入有误");
// //输出系统信息
// e.printStackTrace();
// System.out.println(e.toString());
// e.getMessage();
}catch(java.util.IllegalFormatCodePointException e){
}catch(Exception e){
}
异常的分类
异常可以分为:运行时异常(RuntimeException)和检查时异常(ChackedException)
1.运行时异常:只有在程序运行的时候才会产生异常。可以不进行处理,如果不处理,后面的代码就不被执行。
例如:InputMismatchException
,ArithmeticException
NullPointerException
都是运行时异常。
2.检查时异常:该种异常,必须进行处理,不处理就会报错。
例如:IOException
,FileNotFoundException
一般这样的类中都会使用throw抛出异常,这样就会让调用者进行处理,也就出现了检查时异常。
使用throw自定义异常
1.定义运行时异常
throw new RuntimeException();
就是创建一个RuntimeException
的类,并且抛出。
2.定义检查时异常
throw new Exception();
定义了检查时异常就必须要在方法签名处使用throws
关键来声明该方法是有异常的,提醒方法的调用者必须进行处理。
public static void method() throws Exception
public static void main(String[] args) {
try {
method();
} catch (Exception e) {
e.printStackTrace();
}
}
throw和throws的区别
1.作用:throw是产生异常的根源,而throws只是声明了该方法有异常。
2.位置:throw是写在方法内的,throws写在方法的签名处。
3.数量:throw在产生异常时,一个throw只能跟一个类,而throws后可以跟多个类。
自定义异常类
1.创建一个如果要定义检查时异常,就继承Exception类,同时可以创建两个构造函数,定义运行时异常就继承
RuntimeException,同时可以创建两个构造函数。
public class AgeException extends Exception{
public AgeException() {
}
public AgeException(String message) {
super(message);
}
}
2.可以直接在方法中创建自定义异常类的对象并抛出。如果是检查时异常,同样需要在方法签名处使用throws
声明异常,并且调用者需要处理(和普通异常类一样)。运行时异常不需要。
public class PersonTest {
public static void main(String[] args) {
Person person=new Person(1000,"guogai");
System.out.println(person.toString());
try {
person.setAge(1000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Long Life");
}
}