一、异常概述
在程序中,错误可能产生于程序员没有预料到的各种情况,或者是因为超出了程序员控制之外的环境因素,如用户的坏数据、试图打开一个根本不存在的文件等。在Java中这种在程序运行时可能出现的一些错误称为异常。
二、处理程序异常错误
1、错误
异常产生后,如果不做任何处理,程序就会被终止。例如,将一个字符串转换为整型,可以通过Integer类的parseInt()方法来实现。
回顾:Integer.parseInt(String)的作用就是将String字符类型数据转换为Integer整型数据。
public class Demo1{
public static void main(String[] args) {
String str="papapap";
System.out.println(str);
int i=Integer.parseInt("lalal");
System.out.println(i);
}
}
以上代码运行异常报错:
报错报出NumberFormatException(字符串转为数字)
2、捕获异常
Java语言的异常捕获结构由try、catch和finally 3部分组成。
try语句:块存放的是可能发生异常的Java语句;
catch语句:catch程序块在try语句块之后,用来激发被捕获的异常;
finally语句:finally语句块是异常处理结构的最后执行部分,无论try块中的代码如何退出,都将执行finally块。
try {
//程序代码块
}catch(Exceptiontype01 e) {
//Exceptiontype01的处理
}catch(Exceptiontype02 e) {
//Exceptiontype02的处理
}
.......
finally {
//程序代码块
}
(1)try-catch语句块
public class Demo1{
public static void main(String[] args) {
try {
String str="papapap";
System.out.println(str);
int i=Integer.parseInt("lalal");
System.out.println(i);
}catch(Exception e){
e.printStackTrace();
}
System.out.println("aaaaaaaa");
}
}
(2)finally语句块
无论try-catch语句是否顺利完成都会执行 finally语句。
以下4中状况finally语句不会被执行:
- 在finally语句发现异常,
- 在前面的代码中使用System.exit()退出程序
- 程序所在的线程死亡
-
关闭CPU
三、 Java常见异常
四、自定义异常
用户只需继承Exception类即可自定义异常类。在程序中使用自定义异常类,大体可分为以下几个步骤:
(1)创建自定义的异常类。
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常。
继承Exception类自定义异常类
public class Demo1 extends Exception{ //创建自定义异常,继承Excption类
public MyException(String ErrorMessage) { //构造方法
super(ErrorMessage); //父类构造方法
}
}
五、在方法中抛出异常
1、使用throws声明抛出异常
throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可使用逗号分隔。
package bao;
public class Demo1 {
static void pap() throws NegativeArraySizeException{
//定义方法抛出NegativeArraySizeException异常
int []arr=new int[-3];
}
public static void main(String[] args) {
try {
pap();
}catch(NegativeArraySizeException e) {
System.out.println("pap()抛出异常!");
}
}
}
/*输出结果:
pap()抛出异常!
*/
2、使用throw语句抛出异常
throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,它后面的语句都不执行。
public class Demo1 extends Exception{ //自定义异常类
String maagss; //定义String类型变量
public Demo1(String Errormessagr) { //父类方法
maagss=Errormessagr;
}
public String getMessage() { //覆盖getMessage()方法
return maagss;
}
}
使用throw关键字捕捉异常。(与上面代码结合)
package bao;
public class Demo1 { //创建类
static int quotient(int x,int y) throws MyException{ //定义方法抛出异常
if(y<0) { //判断参数是否小于0
throw new MyException("除数不能是负数"); //异常信息
}
return x/y; //返回值
}
public static void main(String args[]) { //主方法
try { //try语句包括的可能发生的异常语句
int res=quotient(3,-1); //调用quotient()
}catch(MyException e) { //处理自定义异常
System.out.println(e.getMessage()); //处理异常信息
}catch(ArithmeticException e) { //处理ArithmeticMyException异常
System.out.println("除数不能为0"); //输出提示信息
}catch(Exception e) { //处理其他异常
System.out.println("程序发生了其他的异常"); //处理异常信息
}
}
}
/*输出结果:
pap()抛出异常!
*/
六、运行时异常
RuntimeException异常是程序运行过程中产生的异常。Java类库中的每个包中都定义了异常类,所有这些类都是Throwable类的子类。Throwable类派生了两个子类,分别是Exception和Error类。Error类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类错误比较严重。Exception类称为非致命性类,可以通过捕捉处理使程序继续执行。Exception类又根据错误发生的原因分为RuntimeException异常和RuntimeException之外的异常
RuntimeException异常的种类
七、异常的使用原则
在程序中使用异常,可以捕获程序中的错误,但是异常的使用也要遵循一定的规则,下面是异常类的几项使用原则。
- 不要过多的使用异常,这样会增加系统的负担。
- 在方法中使用try-catch捕获异常时,要对异常作出处理。
- try-catch语句块的范围不要太大,这样不利于对异常的分析。
- 一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或子异常。