异常
一、异常是什么?
Java 中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类。
在程序中,错误可能产生于程序员没有预料到的各种情况,或者超出程序员可控范围的环境,例如用户的坏数据、试图打开一个不存在的文件等。为了能够及时有效地处理程序中的运行错误,Java 专门引入了异常类。
二、异常的体系结构
Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常, 这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。下面将详细讲述这些异常之间的区别与联系:
1、Error与Exception
Error是程序无法处理的错误,它是由JVM产生和抛出的,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。
2、运行时异常和非运行时异常
运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
三.异常处理
3.1 try-catch
如果一段代码可能会抛出异常—编译器检测或程序员认为会,就需要将这些代码放在try catch块中,如下代码示例;这很好理解:try指“尝试”执行可能出现异常的代码,如果成功,则乎略备用方案,即(B)区的代码;但如失败,代码会catch(捕获)到一个异常对象,放弃(A)计划,开始执行(B)计划!
import java.util.Scanner;
/**
* 演示除数为0的情况
* @author pactera
*
*/
public class TestException {
public static void main(String[] args) {
try{//放的是可能会出现异常的代码
Scanner input = new Scanner(System.in);
System.out.println("请输入被除数:");
int num1 = input.nextInt();
System.out.println("请输入除数:");
int num2 = input.nextInt();
System.out.println("计算结果如下:");
System.out.println(num1+"/"+num2+"="+(num1/num2));
System.out.println("========程序结束!!!!=============");
}catch(ArithmeticException e){ //catch是捕获异常,并进行处理
//需要注意,我们这个catch捕获的只能是ArithmeticException异常或者其子类异常,对其他异常不捕获
e.printStackTrace();//可以在控制台打印详细的异常信息,在开发阶段使用,便于调试代码
//异常的处理,我们简单输出一句话,但是在真实的项目中,不能只是输出一句话,而是要做相应的处理
System.out.println("你丫的没读过小学吗?不知道除数不能为0吗");
}
System.out.println("============程序结束!!!!==================");
}
}
需要注意的是:
1.try catch块中变量做用域:try块中定义的变量符合我们前面所讲的变量做用范围的规则,即变量只能在限定自己最近的一对大括号内使用;即try catch块内一对大括号中定义的变量不能在后面的代码块内使用;
2.方法返回值:如果方法有定义的返回值,这个方法就有可以在正常执行时有一个返回值,或在catch到异常时有个返回值—不能仅仅只在try块中return一个返回值。
3.要注意的是,并不是所有的异常都强制需要try catch,在java中,异常分为强制检测和非强制检测二种:
4.非强制检测在编译时,不需要try catch,但如因程序员编码时逻辑错误,在运行时就会抛出,如下代码:
3.2 try-catch-finally
对于上面的代码,我们再来做一点改进,我想让上面的代码的”程序结束”这句话不管是否发生异常,而且不管是否catch到相同的异常,我都要输出,这是很有必要的,那这些必须关闭的资源应该放在那里呢?放在try中,不行吧,如果出现异常,那try中的代码就不会执行了,如果放在catch中,那如果ctach捕获的异常不一样,那也不会执行,所以java就给我们准备了这样一个东西,这就是finally块,finally块表示程序不管是否发生异常,总会执行.现在我们把上面的代码进行优化:
import java.util.InputMismatchException;
import java.util.Scanner;
/**
* 演示除数为0的情况
*
* @author pactera
*
*/
public class TestException {
public static void main(String[] args) {
try {// 放的是可能会出现异常的代码
Scanner input = new Scanner(System.in);
System.out.println("请输入被除数:");
int num1 = input.nextInt();
System.out.println("请输入除数:");
int num2 = input.nextInt();
System.out.println("计算结果如下:");
System.out.println(num1 + "/" + num2 + "=" + (num1 / num2));
System.out.println("======代码正常执行完==========");
} catch (ArithmeticException e) { // catch是捕获异常,并进行处理
// 需要注意,我们这个catch捕获的只能是ArithmeticException异常或者其子类异常,对其他异常不捕获
e.printStackTrace();// 可以在控制台打印详细的异常信息,在开发阶段使用,便于调试代码
// 异常的处理,我们简单输出一句话,但是在真实的项目中,不能只是输出一句话,而是要做相应的处理
System.out.println("你丫的没读过小学吗?不知道除数不能为0吗");
} catch (InputMismatchException e) {
System.out.println("你丫不知道什么是数字吗,乱输个啥");
} catch (Exception e) { // Exception是所有异常类的父类,所以要写在最后
System.out.println("哎,我也不知道怎么办了");
} finally {//不管是否异常都会执行
System.out.println("================程序结束!!!!=====================");
}
}
}
3.3 throw 与throws
throw表示抛出异常,语法是:
throw new 异常类型([异常信息]);
比如说: throw new Exception(“抛个异常玩玩”);
throws表示用来声明方法可能会抛出那些异常: 语法是:
throws 异常类型1,异常类型2…
代码演示:
//定义一个除法的方法,并声明异常
public int division(int num1 ,int num2) throws ArithmeticException{
if(num2 == 0){
//抛出异常,如果抛出异常,则抛出异常后面的代码不会执行
throw new ArithmeticException("除数不能为0");
}
return num1/num2;
}
四.自定义异常
4.1 创建异常类
创建自定义异常,需要继承Exception 或其子类。习惯上包装一下父类的构造方法。
public class MyException extends Exception {
public MyException() {
super();
}
public MyException(String msg) {
super(msg);
}
public MyException(Throwable cause) {
super(cause);
}
public MyException(String msg, Throwable cause) {
super(msg, cause);
}
}
4.2使用自定义异常类
public String[] createArray(int length) throws MyException {
if (length < 0) {
throw new MyException("数组长度小于0,不合法");
}
return new String[length];
}
五.总结
以上就是我对异常学习的内容,异常学起来相对比较简单,在今后的学习中更要努力,锲而不舍,金石可镂。