Java中的异常处理 public static void main(String[] args) { try{ System.out.println(c
1.异常的概念
首先我们在讲解异常的时候先回想一下我们以前写过是代码:
package com.bittech.sthrow;
/**
* Author:WSChase
* Created:2018/11/28
*/
public class Throw1 {
//计算两个数的除法
public static void main(String[] args) {
int a=10;
int b=5;
System.out.printf("a/b="+a/b);
}
}
在这个程序中我们是做两个数的除法,那么我们知道的是此时两个已知的数中 除数不为0,但是在正常情况下,如果是用户输入两个数做除法,这个时候很有可能就会出现除数为0的情况,这个时候我们用到的解决方法就是用if判断,如果出现这种情况那么就不执行运算,否则进行运算。
将这个处理问题的方法,就叫做抛异常。我们的异常就是在你编写的代码在执行的时候可能会出现的隐患问题,这个时候我们就需要对异常进行处理。
2.异常的分类
这两类异常都是继承Exception异常的,它们一个叫做检查异常、一个叫做运行时异常。
3.异常带来的问题
如果一个程序中有异常,那么这个程序执行到会出现异常的地方就会中断。
(1)正常情况
package com.bittech.sthrow;
/**
* Author:WSChase
* Created:2018/11/28
*/
public class Throw1 {
//计算两个数的除法
public static void main(String[] args) {
System.out.println("计算开始");
System.out.println(10/2);
System.out.println("计算结束");
}
}
如果没有出现异常那么这个程序将会正常进行。
(2)异常情况
package com.bittech.sthrow;
/**
* Author:WSChase
* Created:2018/11/28
*/
public class Throw1 {
//计算两个数的除法
public static void main(String[] args) {
System.out.println("计算开始");
System.out.println(10/0);
System.out.println("计算结束");
}
}
当我们的除数为0的时候就会出现异常,这个时候程序就会中断。
4.处理异常
异常处理的语法格式如下:
try{
可能出现异常的语句;
}[catch(异常类 对象){
}...]
[finally {
异常的出口
}]
这个格式可以组合为三种处理异常的形式:
(1)try…catch
(2)try…finally
(3)try…catch…finally
(1)
package com.bittech.sthrow;
/**
* Author:WSChase
* Created:2018/11/28
*/
public class Throw1 {
//计算两个数的除法
public static void main(String[] args) {
System.out.println("计算开始");
try{
System.out.println(10/0);
}catch (ArithmeticException e){
System.out.println(e.getMessage());
System.out.println("除数不能为0");
}
System.out.println("计算结束");
}
}
使用第一种情况就是将异常抛出并且使用了catch捕获。
(2)
package com.bittech.sthrow;
/**
* Author:WSChase
* Created:2018/11/28
*/
public class Throw1 {
//计算两个数的除法
public static void main(String[] args) {
System.out.println("计算开始");
try{
System.out.println(10/0);
}
finally {
System.out.println("异常处理结束");
}
System.out.println("计算结束");
}
}
(3)
package com.bittech.sthrow;
/**
* Author:WSChase
* Created:2018/11/28
*/
public class Throw1 {
//计算两个数的除法
public static void main(String[] args) {
System.out.println("计算开始");
try{
System.out.println(10/0);
}catch (ArithmeticException e){
System.out.println(e.getMessage());
System.out.println("除数不能为0");
}
finally {
System.out.println("异常处理结束");
}
System.out.println("计算结束");
}
}
对于上面结果我们总结以下几点:
1.catch中的异常的对象是虚拟机实例化的
2.获取异常的信息:e.getMessage();–>这是个字符串,赋值给字符串打印
3.finall{} 都会执行除去:
(1)如果在finall块执行之前调用System.exit(),VM停止
(2)未知错误(如:断电,硬件损坏)
(3)finall块在return之后执行(所以注意:在finally块里面不要加入return语句,否则会改变原来return的语句)
5.获取异常信息
public static void main(String[] args) {
System.out.println("计算开始");
try {
System.out.println("计算中:" + 10 / 0);
} catch (ArithmeticException e) {
e.printStackTrace();//获取异常信息
}
System.out.println("计算结束");
}
6.多个catch语句
public static void main(String[] args) {
//采用初始化参数进行数学运算
System.out.println("1.计算开始");
try {
Integer x = Integer.parseInt(args[0]);//字符串转化为整数
Integer y = Integer.parseInt(args[1]);
System.out.println("2.进行计算:" + x / y);
} catch (ArithmeticException e) {
e.printStackTrace();
} finally {
System.out.println("不管是否产生异常都会执行这个语句");
}
System.out.println("计算结束");
}
}
对于上面的运算是通过初始化参数进行数学运算的,这个运算中可能会出现很多的异常:
没有输入初始化参数、输入的不是数字、除数为0。
下面我们对这多个异常进行处理:
public static void main(String[] args) {
//采用初始化参数进行数学运算
System.out.println("1.计算开始");
try {
Integer x = Integer.parseInt(args[0]);//字符串转化为整数
Integer y = Integer.parseInt(args[1]);
System.out.println("2.进行计算:" + x / y);
} catch (ArithmeticException e) {//除数为0
e.printStackTrace();
} catch (NumberFormatException e){//输入的不是数字
e.printStackTrace();
}catch (ArrayIndexOutOfBoundsException e){//数组下标越界(没有给参数)
e.printStackTrace();
}
finally {
System.out.println("不管是否产生异常都会执行这个语句");
}
System.out.println("计算结束");
}
}
(1)输入一个参数(数组下标越界)
(2)输入的不是数字
(3)除数为0
上面是对于多个异常出现时候的处理方法,可以将catch放在一起。
我们之所以有异常处理是因为,之前我们处理这些问题的时候都是用if else处理的,但是如果用这条件判断去处理的话就会存在一个问题就是不管你有没有出现异常在程序执行的时候都会去加载条件判断中的语句,这样的就会降低效率,所以我们才有异常,但是并不是说所有的情况都需要异常,这个需要根据实际情况判断。
7.throws关键字–>修饰方法
我们在方法定义中也可能会出现异常,这个时候我们可以告诉调用者这个方法可能产生异常,可以使用throws进行声明。这个时候在这个方法中我们不需要对异常进行处理,只是将异常抛出去了。
public static void main(String[] args) {
try{
System.out.println(calculate(10,0));//调用存在异常的这个方法,那么就需要处理这个异常
}catch(Exception e){
e.printStackTrace();
}
}
public static int calculate(int x,int y) throws Exception{//在这个方法中只进行了抛出异常
return x/y;
}
}
8.throw关键字
throw关键字是直接编写在语句中的抛异常。
public static void main(String[] args) {
try{
throw new Exception("抛出异常");
}catch(Exception e){
e.printStackTrace();
}
}
}
throw是人工进行抛出异常,通过我们自己产生异常对象。
对上面的throws和throw进行总结:
注意1:throws抛异常,不处理那么就是谁调用这个方法设就处理,如果调用这个方法的时候还是不处理
那么就是main方法处理,当我们的main方法也不处理继续throw的时候,就有虚拟机处理,它的处理方式就是关闭程序。
注意2:写异常的时候,我们遵循一个原则:从子类到父类
注意3:解释Exception和RuntimeException的区别并列举几个常见的RuntimeException:(面试考点)
- 使用Exception是RuntimeException的父类,使用Exception定义的异常中的IOException(检查异常)都要求必须使用异常处理
(不管是在哪进行处理),而使用RuntimeException(运行时异常)定义的异常可以由用户选择性的来进行异常处理,不使用try{}catch(){}
也可以运行。 - 常见的RuntimeException:ClassCastException、NullPointerException、MysqlException等。