一、异常的分类
Throwable类有两个重要的子类:Error和Exception,Exception又分为编译期异常和运行期异常。
所有的异常都是Exception的子类,所有的异常都可以使用Exception来接收。
java中有两种异常处理机制:捕获处理异常和声明抛出异常。与异常有关的关键字有try,catch,throw,throws,finally。通过try,catch,finally关键字实现捕获处理异常;通过throw,throws关键字声明抛出异常。
二、捕获处理异常
Scanner scan=new Scanner(System.in);
System.out.println("请输入:");
try{
int n=scan.nextInt();
System.out.println(10/0);
}
catch(ArithmeticException e){
System.out.println("除0错误");
}
catch(Exception e){
System.out.println("请重新输入:");
}
finally{
System.out.println("finally");
}
try,catch,finally三个语句块应注意的问题:
1)try,catch,finally三个语句块均不可单独使用,catch语句可以有一个或多个,finally语句最多一个;
2)try,catch,finally三个代码块中变量的作用域均为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
3)即便有多个catch块,都只会匹配其中一个异常类并之心相应的catch块代码,而不会再执行别的catch块,匹配的catch语句的顺序是由上到下。
在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,也就是先匹配子类,再匹配父类。当捕获到一个异常时,剩下的catch语句就不再进行匹配。
finally语句保证在控制流转到程序的其他部分之前,finally代码块中的程序都会被执行。
通常异常处理用3个函数来获取异常的有关信息:
getCause():返回抛出异常的原因。如果cause不存在或未知,返回null;
getMessage():返回异常的消息信息;
printStackTrace():将Throwable对象的堆栈跟踪信息输出至标准错误输出流,这种方式打印异常信息是最完整的。
三、声明抛出异常
从方法中抛出的任何异常都必须使用throws子句实现。
1)throws抛出异常
如果一个方法可能会出现异常,但是没有能力处理这种异常,可以在方法声明出用throws子句来声明抛出的异常。java的JVM是的异常对象可以从调用栈向上传播,直到相应的方法捕获它为止。声明抛出异常时在方法声明中的throws子句中指明的。多个异常可以使用逗号分割。
class People{
void fun() throws Exception{
int[] arr={1,3};
System.out.println(arr[6]);
}
}
public class Test{
public static void main(String[] args){
People p=new People();
try{
p.fun();
}
catch(Exception e){
System.out.println("异常");
}
}
}
当方法名抛出异常列表中的异常时,方法将不对这些类型及其子类类型的异常做处理,而抛向调用该方法的方法,由它去处理。使用throws关键字将异常抛给调用者后,如果调用者不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的调用者。
2)throw抛出异常
java允许开发者定义自己的异常类,称之为自定义异常。要遵守规则:自定义异常类必须是Throwable的子类,而更多时候自定义的异常类都继承自Exception类。
自定义异常类:
(1) 创建一个继承 Exception 类或者其它已存在的异常类的子类。
(2) 在该类中创建一个默认的无参数构造方法,该构造方法以适当的错误消息作为输入, 调用它的超类的构造方法。
(3) 再增加一个带字符串参数的构造方法,该构造方法以适当的错误消息作为输入(还包括输入的字符串)来调用其超类相应的构造方法。
class MyException extends Exception{
public MyException() {
// TODO Auto-generated constructor stub
//System.out.println("exception occur!!!");
super.getMessage();//返回异常的消息信息
}
public MyException(String str){
System.out.println(str);
}
}
class People{
void fun() throws MyException{
People p=new People();
if(!(p instanceof People)){ //判断一个实例对象p是否属于People类
throw new MyException();
}
}
}
public class Test1{
public static void main(String[] args) {
People p=new People();
try {
p.fun();
} catch (MyException e) {
// TODO Auto-generated catch block
e.printStackTrace();//将Throwable对象的堆栈跟踪信息输出至标准错误输出流
}
}
}
throw总出现在方法体中,用来抛出一个Throwable类型的异常。创建异常类的实例对象,再通过throw语句抛出。
class People{
void fun() throws Exception{
Exception e=new Exception();
int[] arr={1};
if(arr[0]!=10){
throw e;
}
}
}
public class Test{
public static void main(String[] args){
People p=new People();
try{
p.fun();
}
catch(Exception e){
System.out.println("异常");
}
}
}