9.1异常概述
Java 中的异常又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类,这可以让程序具有极好的容错性且更加健壮。
在 Java 中一个异常的产生,主要有如下三种原因:
- Java 内部错误发生异常,Java 虚拟机产生的异常。
- 编写的程序代码中的错误所产生的异常,例如空指针异常、数组越界异常等。
- 通过 throw 语句手动生成的异常,一般用来告知该方法的调用者一些必要信息。
Java 通过面向对象的方法来处理异常。在一个方法的运行过程中,如果发生了异常,则这个方法会产生代表该异常的一个对象,并把它交给运行时的系统,运行时系统寻找相应的代码来处理这一异常。
我们把生成异常对象,并把它提交给运行时系统的过程称为拋出(throw)异常。运行时系统在方法的调用栈中查找,直到找到能够处理该类型异常的对象,这一个过程称为捕获(catch)异常。
public class Nineone {
public static void main(String[] args) {
// TODO Auto-generated method stub
int result =3/0;
System.out.println(result);
}
}//例题9.1
public class Nineone {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str ="lili";
System.out.println(str + "年龄是:");
int age = Integer.parselent("20L");
System.out.println(age);
}
}//例题9.2
9.2:异常的抛出与捕获
Java 的异常处理通过 5 个关键字来实现:try、catch、throw、throws 和 finally。try catch 语句用于捕获并处理异常,finally 语句用于在任何情况下(除特殊情况外)都必须执行的代码,throw 语句用于拋出异常,throws 语句用于声明可能会出现的异常。
Java 的异常处理机制提供了一种结构性和控制性的方式来处理程序执行期间发生的事件。异常处理的机制如下:
在方法中用 try catch 语句捕获并处理异常,catch 语句可以有多个,用来匹配多个异常。
对于处理不了的异常或者要转型的异常,在方法的声明处通过 throws 语句拋出异常,即由上层的调用方法来处理。
9.2.1:抛出异常
9.2.2:捕捉异常
try{
//代码块
}catch (Exceptiontype1){
catch (xceptiontype2)
}
....
finally{
//程序代码块}
处理完后9.1代码运行结果
public class Nineone {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
int result =3/0;
System.out.println(result);
}catch(ArithmeticException e) {
System.out.println("算法异常");
}
}
}//例题9.1
修改后9.2代码
1.
public class Nineone {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str ="lili";
System.out.println(str + "年龄是:");
int age = Integer.parseInt("20");
System.out.println(age);
}
}//例题9.2
2.
public class Nineone {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
String str ="lili";
System.out.println(str + "年龄是:");
int age = Integer.parseInt("20L");
System.out.println(age);
}catch (Exception e) {
System.out.println("program over");
}finally {
System.out.println("程序异常");
}
}
}//例题9.2
9.3:Java常见的异常类
红色为常见异常
常见的异常类
异常类 | 说明 |
CalssCastException | 类型转换异常 |
ClassNotFoundException | 未找到相应类异常 |
AritchmeticException | 算数异常 |
ArrayIndexOutOfBoundsException | 数组下标越界异常 |
ArrayStoreException | 数组中包含不兼容的值抛出的异常 |
SQLException | 操作数据库异常类 |
NullPointerException | 空指针异常 |
NoSuchFieldException | 字段未找到异常 |
NoSuchMethodException | 方法未找到抛出的异常 |
NumberFormatException | 字符串转换为数字抛出的异常 |
NegativeArraySizeException | 数组元素个数为负数抛出的异常 |
StringIndexOutOfBoundsException | 字符串索引超出范围抛出的异常 |
IOException | 输入输出异常 |
IllegalAcessException | 不允许访问某类异常 |
InstantiationException | 当应用程序试图使用Class类中的newInstance()方法重创建一个类得实例,而指定的类的对象无法被实例化时,抛出该异常 |
EOFException | 文件已结束异常 |
FileNotfoundException | 文件未找到异常 |
9.4: 自定义异常
定义1个exception类继承,这就是自定义异常
括号里是传入参数,super是隐藏方法,作用是调用父类的构造方法打印出错误信息
public class MyException extends Exception { //自定义异常
public MyException (String ErrowMessage) {//输出错误方法
super(ErrowMessage);//调用父类的构造方法
}
}
//例题9.4
9.5:在方法中抛出异常
throws 关键字和 throw 关键字在使用上的几点区别如下:
- throws 用来声明一个方法可能抛出的所有异常信息,表示出现异常的一种可能性,但并不一定会发生这些异常;throw 则是指拋出的一个具体的异常类型,执行 throw 则一定抛出了某种异常对象。
- 通常在一个方法(类)的声明处通过 throws 声明方法(类)可能拋出的异常信息,而在方法(类)内部通过 throw 声明一个具体的异常信息。
- throws 通常不用显示地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法; throw 则需要用户自己捕获相关的异常,而后再对其进行相关包装,最后将包装后的异常信息抛出。
public class Tran { static int avg(int number1,int number2) throws MyException {//调用抛到调用avg的地方 if(number1<0||number2<0){ //System.out.println("不可以使用负数");条件判断 throw new MyException("不可以使用负数");//抛出异常给avg } if(number1>100||number2>100){ //判断条件 throw new MyException("不可以大于100"); } return (number1+number2)/2;//求平均数,返回值 } public static void main(String[] args) {//主函数调用方法 // TODO Auto-generated method stub try { int result = avg(102,150); System.out.println(result); } catch (MyException e) { System.out.println(e); } }} //例题9.5