目录
一、认识异常
异常什么时候发生
学习的过程中,我们会遇到编译错误,需要注意的是,编译器能够发现的错误就是语法错误,不是异常。而在程序运行期间,由于各式各样的原因而导致的错误或不期待出现的情况,就叫做异常。
语法错误和程序异常其实都是错误的,都需要我们的处理,对于语法错误,编译器会在编译源文件的时候给出相关信息,然后我们需要根据不符合语法的部分来更改错误;异常则是程序在运行期间所发生的的问题,不一定是代码有问题,处理起来就没那么简单了,当然大多数情况还是需要从代码入手。
异常是什么
异常其实是在程序执行的过程中遇到的错误,例如9M不能被转换成一个double变量。在java中,使用类表示一种错误,自然的,对于某个具体错误,就是使用这个类的实例来表示。
java.lang.NumberFormatException来表示该字符串到数字的转换错误。当出现这种错误的时候,就会创建一个java.lang.NumberFormatException:FormatEXcetion的实例,并使用这个实例来描述这个转换错误
每种异常都使用一个java类来表示
每个具体异常都是使用对应的java类的实例来表示
程序发生了一个异常,通常称程序抛出了一个程序异常。这里所谓的抛出程序异常其实就是一个对应异常的类
java异常机制的流程
抛出异常;此步骤首先是创建能够描述异常的对象,这时算是发生了一个异常
异常传递:异常传递就是由java自行处理,关于异常传递的语法很简单,异常会传递方法给方法的调用者
异常处理:就是捕捉住异常并根据异常类型做出相应的处理
抛出异常
异常类的父类--Throwable
在java异常机制中,只有一个特殊的类继承Throwable,才会当做一个异常,才能被当做一个异常“抛出”想·
Exception:参数message就是异常错误描述信息,也就是作用类似于For input string:“9M”的一个字符串。NumberFormatException的实例时,通过调用这个构造方法将信息错误保存于异常之中。
只有继承了Throwable类的java类才能被java异常机制认为是一个异常类,才能使用java中相关的语法抛出和处理,也就是说所有的java异常类都是Throwable类的子类。
异常类型也就是异常信息的来源,同时异常类型在异常处理时也有重要的作用。应该使用一个异常类表示一种类型的异常
异常类的作用就是表示一个异常信息。除了Throwable类之外,异常类的内容大部分构造方法,并不复杂。
在代码中使用throw抛出一个异常
package com.javaeasy.throwexception;
public class Cup {
private int capacity;
public int getCapacity() {
return capacity;
}
public void setcapacity(int capacity) throws Exception {
if(capacity > 10000 || capacity < 0) {
//创建一个Exception类的实例,描述这个异常信息
Exception ex = new Exception ("杯子的容积不能超过10000或小于0,非法容积为:"+capacity);
throw ex;
}
this.capacity=capacity;
}
}
在setCapacity首先判断capacity是否在合法的数值区间内,如果不在,则创建exception类的实例,并通过构造方法将错误的信息字符串给这个实例,然后使用java中的throw关键字来将这个异常抛出
throw + 空格 +异常类的实例
所有的异常类必须包含Throwable类型,该语法的作用就是抛出一个异常,这个异常会按照java的传递规则,并最终被处理掉。
在方法声明中使用throws
方法声明+throw+空格+异常类型+方法体
构造自定义异常类
先创建两个类CapacityTooSmallException类和CapacityTooBigException类
package com.javaeasy.throwexception;
public class CapacityTooSmallException extends Exception{
public CapacityTooSmall(String message) {
super (message);//简单调用父类的构造方法
}
}
public class CapacityTooBigException extends Exception{
public CapacityTooBig(String message) {
super (message);//简单调用父类的构造方法
}
构造异常关键就是让异常类继承自适合的父类。在绝大数情况下,编程时的自定义异常类继承Exception类就可以了
构造自定义方法,通常按照编程的实际要求,在自定义异常类中提供相应的构造方法。
使用自定义异常类
使用throw和throws关键字
使用自定义的异常没有什么特殊之处
方法声明的throws语句代表这个方法可能抛出的异常类型,当然这些类型的子类也包括在内
二、异常的传递
抛出最确切的异常
方法代码内部抛出的异常类型并不等于方法抛出的异常类型。方法抛出的异常类型是由方法声明中throws语句决定的
java异常传递允许在throws语句中抛出实际的类型或者实际异常类型的父类型。当然异常实例是不会改变的。如果抛出的异常类型是实际异常的父类型,那么这就好像使用最确切的异常类型,而不是让throws语句将方法代码抛出的异常类型吃掉
java的异常传递
异常传递的语法规则是从某个方法中的某个throw语句开始,异常将从这个方法开始传递到调用这个方法的地方,并按照方法调用的顺序去继续传递。直到最初的方法也就是main()方法。
异常必须被传递出去,否则在编译源代码的时候,java编译器就会输出 一个语法错误
在程序运行的时候,如果方法的某行代码出抛出了异常,那么方法中此行之后的所有代码都不会被执行。这个规则不仅仅是对异常起作用,对于所有异常传递线路上方法都是一样的。