目录
三、RuntimeException和Exception的区别
一、什么是异常,如何处理异常
程序在运行过程中,都有可能存在大量的未知问题,就以下面这段代码为例,输入两个数做除法运算,但是当除数为0时会产生异常。
package test;
import java.util.Scanner;
public class Except {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();
int j=sc.nextInt();
int temp=i/j;
System.out.println("计算结果"+temp);
System.out.println("**************");
System.out.println("结束");
}
}
从运行结果可以看,如果不对异常进行处理的话,一旦出现异常,程序就会立刻退出,所以后面的两条语句就没有执行。
这就需要我们对异常进行处理,在Java中,异常处理有着自己的格式
try{
//有可能出现的异常语句
}catch(异常类 异常对象){
//编写异常的处理语句
}[catch(异常类 异常对象){
//编写异常的处理语句
}catch(异常类 异常对象){
//编写异常的处理语句
}...]
[finally{
//一定会运行到的代码
}] //finally可以省略
对上述代码进行异常捕捉
package test;
import java.util.Scanner;
public class Except {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();
int j=sc.nextInt();
try {
int temp=i/j;
System.out.println("计算结果"+temp);
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("**************");
System.out.println("结束");
}
}
从程序运行结果可以清楚的发现,因为程序中加入了异常处理的代码,所以当有异常发生之后,整个程序也不会因为异常发生而中断执行。
二、throws与throw关键字
1、throws关键字
在定义一个方法的时候可以使用throws关键字,使用throws声明的方法表示此方法不处理异常,而交给方法的调用处处理
使用格式
public 返回值类型 方法名称(参数列表...)throws 异常类 {}
例如
package test;
import java.util.Scanner;
class Math{
public int div(int i,int j)throws Exception{ //本方法中可以不处理异常
int temp=i/j; //此处有可能产生异常
return temp; //返回计算结果
}
}
public class Except {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("开始计算");
Math m=new Math(); //实例化Math对象
try { //因为有throws,不管是否有异常,都必须处理
int num=m.div(10, 0);
System.out.println(num);
}catch(Exception e) {
e.printStackTrace(); //打印异常
}
System.out.println("**************");
System.out.println("结束");
}
}
运行结果如下:
在上述代码中,不管是否有问题,都要使用try...catch块进行异常的捕捉与处理,既然throws是在方法处定义的,那么主方法上也可以使用throws关键字,但是主方法为程序的起点,所以主方法抛出异常时,只能将异常抛给JVM进行处理。就好比一个公司,部门事情处理不了就要报给经理,经理处理不了就要报给董事长,到董事长也就到头了,那么Java的“头”就是JVM了。所以如果主方法出现异常,程序将无法执行
2、throw关键字
与throws关键字不同的是,可以直接使用throw关键字抛出一个异常,抛出时直接抛出异常类的实例化对象即可。
package test;
import java.util.Scanner;
public class Except {
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
try {
throw new Exception("抛出异常");
}catch(Exception e) {
e.printStackTrace();
}
}
}
上述代码并不难以理解,因为异常产生时肯定会由系统产生一个异常类的实例化对象,只是此时异常类的实例化对象是手工产生的而已, 程序执行结果:
问:为什么要有throw关键字,在开发中,代码肯定是不产生异常才是最好的,那为什么要提供一个throw让用户自己产生异常,这不是不合理的吗?
答:抛出自己的异常。实际上,Java中所有的异常也是使用throw抛出的,只不过这部分代码已经被Java隐藏起来,大家感受不到而已。
三、RuntimeException和Exception的区别
常见面试题分析:请解释一下RuntimeException和Exception的区别,请举例常见的RuntimeException
(1)RuntimeException是Exception的子类
(2)Exception定义了必须处理的异常,而RuntimeException定义了异常可以选择性的进行处理
(3)常见的RuntimeException:NumberFormatException、ClassCastException、NullPointerException、ArithmeticException、ArrayIndexOutOfBoundsException