内容概要:
1.try-catch语句
2.exception的种类
3.可抛出异常的方法
4.自定义异常
5.Java的内置异常
在程序设计和程序运行的过程中,发生错误是不可避免的。java提供了丰富的解决之道。可以保证程序在发生错误的情况下顺利执行下去。java并非能够捕获所有的错误,我们把java能够捕获的错误称为异常(exception)
在程序设计中,一般称编译时被检测出来的错误称为语法错误,这种错误一旦产生并不会生成运行代码。而另一种错误时运行错误,他是在程序运行时代码序列中产生的一种错误,这种错误若不进行及时处理,可能会造成程序中断、数据遗失、乃至系统崩溃的问题。这种运行错误就是常说的“异常”
大部分异常是由于程序编制错误引起的。但是,也会发生无法预知的错误,特别是输入输出时,发生意料不到的异常情形很多。
eg:int a=1;int b=0; int c=a/b;程序运行时,屏幕上会出现a被0除了的异常错误。异常往往在编译时不会出现,发生异常是指生成了异常对象。
1.try-catch语句
Java的异常处理时通过try-catch语句实现的。使用try-catch语句保证程序发生异常时继续执行下去而不是终止。try-catch语句的格式如下:
try{
//可能发生异常的代码段
}
catch(exceptionType1 e ){//捕获异常
//处理第一种异常的语句
}
catch(exceptionType2 e ){//捕获异常
//处理第二种异常的语句
}
try语句用来启动Java的异常处理机制,对期内的代码进行检查,若出现异常,将在catch语句块内捕获它并进行处理。所谓捕获异常对象就是指形式参数e取得了异常对象的引用。 不同的异常的形式参数不同,对应的形式参数只能引用当前异常对象。
System.out.pritln(“开始程序”); int a=1;b=0; try{ int c=a/b;..........................................//x1,异常对象在此产生 System.out.println(c);..............................//x2 }catch(ArithemticException ae){.....................//x3 System.out.println("不能被0整除“);...............//x4 } System.out.pritln(“结束程序”);.................//x5
由于程序发生异常,x3处捕获此异常,在x4处做适当的处理,执行x5程序正常退出。x2就不会执行。若此处不是ArithmeticException类型的异常,而是其他异常类型。x3就无法捕获它进行处理了。
NullPointerException是指引用空的尚未分配内存空间的对象发生的异常。引用为null,意味着引用变量未引用任何对象,当然,其成员也必定不会存在。
Except ob=null;
ob.hi();//发生NullPointerException异常
使用多重catch语句,嵌套try语句
若想同时处理多种异常,需要重复使用多个catch语句,每个catch语句捕获一种异常。try块中抛出异常后,每个catch语句顺序检查是否与抛出的异常类型相匹配,一旦捕获到相匹配的异常,就执行catch块中的代码。当一个catch块中的语句执行完毕后,程序将跳过其他的catch语句,继续执行try-catch 语句块后面的程序。一个catch语句不能捕获另一个try声明引发的异常(除非是嵌套try语句情况),不能单独使用try语句。
try{①}
catch(ArithmeticException e){②}.......................若发生异常,顺序执行②,⑤
catch(NullPointerException e){③}.......................若发生异常,顺序执行③,⑤
catch(ArrayIndexOutOfBoundException e){④}..............若发生异常,顺序执行④,⑤
finally {⑤}
finally语句紧接在try-catch语句之后,无论try语句是否发生异常,finally语句总会被无条件的执行。finally语句可以省略,也可以用来执行一些必须的命令。
ArrayIndexOutOfBoundExceptio指数组下标越界异常
2.exception的种类
Java类库中每个包中都定义了异常类,所有这些类都是Throwable类的子类。Throwable类输入java.lang包,每个java程序运行时系统会自动导入此包,无需在使用import语句导入。Throwable类有两个子类,分别为:Exception类与Error类。Error类由系统保留,而Exception类则供应用程序使用。Error类代表内存不足等致命性的错误,Java通知不会捕获此类异常,也不会抛出这种异常。一般来说,这类异常是不可修复的,不可处理的。Exception类包含一般性异常,这类异常可以被捕获处理,使用try-catch语句。
Java的异常体系
Throwable(可抛出异常) | Error | AssertionError | |
AWTError | |||
LinkageError | |||
Exception | RuntimeException(运行时异常) | ArithmeticException:算术异常,被0除。ArrayStoreException:数组存储异常,指派给数组值错误。ArrayIndexOutOfBoundException:数组下标越界。NullPointerException:引用尚无内存空间的对象时发生。NegativeArrayException:数组长度为负值异常。IllegalArgumentException:非法参数异常。指派给形式参数值错误。SecurityException:安全性异常 | |
AWTException | |||
IOExcetpion | EOFException | ||
FileNotFoundException |
Java异常类组成:
同Java其他的类一样,Exception类有自己的方法和属性。它的构造方法有4个:
public Exception()
public Exception(String message)
public Exception(String,Throwable cause)
public Exception(Throwable cause)
其中,第二个构造方法可以接收字符串参数传入的信息,该信息通常是对该异常所对应的错误的描述;第三个构造方法中的cause参数保存出错误原因,以便以后使用Throwable.getCause()方法重获,该参数为空。Exception类常用的方法如下:
Exception类常用的方法
方法 | 描述 |
public String getMessage() | 该方法返回Exception(String message)构造方法中,参数message所定义的字符串值 |
public String toString() | 该方法返回一条包含该类类名和指出所发生问题的描述消息字符串,Throwable的所有子类均继承该方法 |
public void printStackTrace() | 该方法没有返回值,它的功能是完成一个打印操作,在当前的标准输出上打印出当前例外对象的堆栈使用轨迹 |
父引用(此处指引用常量)可以引用子类的对象,故Exception类的引用(变量)可以引用所有异常对象。换言之,Exception类型的引用可以捕获所有异常。
try{int [] a=new int[-1];}//发生NegativeArraySizeException异常
catch(Exception e){System.out.println(e);} //e可以捕获所有异常
运行结果:java.lang.NegativeArraySizeException
3.可抛出异常的方法
当我们调用某个方法时,可能会抛出异常,我们把这个方法叫做可抛出异常的方法。eg:下面的go()方法即为可抛出异常的方法。
static void go() throws NegativeArraySizeException{ int [] a=new int[-1];...................................//x1 } public static void main(String[] args){ try{go():...............................................//x2,异常对象被抛出至此 }catch(NegativeArraySizeException e){ ...................//x3 System.out.println("go()方法抛出了异常”); }}
x2调用go()方法,执行x1行时发生异常。由于go()方法是抛出异常的方法,故产生的异常将抛至方法调用处x2,异常其实是在x1发生的,但由于它被抛至x2行处,我们认为异常是在x2行处发生的。产生的异常被x3行捕获,并输出相应的信息。
我们可以将捕获的异常再次抛出,并抛出多次,只要以后能成功的捕获就可。
public class Except2 { static void go() throws NegativeArraySizeException{.................//第一次抛出 int[] a=new int[-1];..................................//异常产生处 } static void hi() throws NegativeArraySizeException{.................//第二次抛出 go();...................................................//x2 } public static void main(String[] args) { try{ hi();...................................................//x3,异常对象被抛至此 }catch(NegativeArraySizeException e){ System.out.println("捕获来自远方的异常"); }}}
可抛出异常的方法并不总是抛出异常,它是指可能抛出异常的方法。eg:
public class Except3{ static void go(int size) throws NegativeArraySizeException{ int[] a=new int[size];.............................//size为负值时,发生异常 System.out.println(a.length); } public static void main(String[] args) { try{ go(10);...................................................//x1,上面未发生异常时 }catch(NegativeArraySizeException e){ System.out.println("捕获来自远方的异常");.............//发生异常的情况 }}}
//程序并未发生异常,若x1行的10是负数,程序会产生异常。
调用可能抛出异常的方法时,必须对异常进行处理。否则,会编译出错。
public class Except4 { public static void main(String[] args) { int a=0; System.out.println("请输入字符"); try { a=System.in.read();...................................//x1 } catch (Exception e) { System.out.println("输入错误"); } System.out.println("输入的字符为:"+(char)a); } }
read()方法被定义为可抛出异常的方法,其定义如下:
public abstract in read() throws IOException;
所以必须对异常进行处理,示例中该方法也并不是总抛出异常,但必须处理以防万一。
RuntimeException异常:此类异常及时不对其捕获处理,编译仍能顺利通过,但在运行时会被系统抛出。
4.自定义异常
用户可以自定义异常类,只需继承Exception类即可。
class MyException extends Exception{
MyException(String ErrorMessage){..................//构造函数
super(ErrorMessage);.............................//父类构造函数
}}
字符串ErrorMessage即为要输出的错误信息。若想抛出自定义的异常对象,请使用“throw”关键字,其方法如下:
throw new MyException(“错误信息”);
我们很容易理解为:创建MyException异常对象,然后将其抛出,事实也如此。程序执行过程中,若满足了某种异常条件,则相应的异常对象会被创建,然后被抛出。若想抛出某种异常,一定要将所调用的方法定义为可抛出异常的方法。
void f() throws MyException{...........................//可抛出异常的方法
if(错误条件)
throw new MyException("错误信息");
}
class MyException extends Exception{
MyException(String ErrorMessage){
super(ErrorMessage);
}
}
public class Except5 { static int avg(int a,int b) throws MyException{ if(a<0||b<0)....................................//x1 throw new MyException("赋值不可");..................................//x2 else if(a>100||b>100)..................................//x3 throw new MyException("数值过大");..................................//x4 return (a+b)/2;..................................//x5 } public static void main(String[] args) { try{ System.out.println(avg(-10,20));.................//x6 }catch(MyException e){ System.out.println(e);.................//x7 }}}
结果:MyException: 赋值不可
若x1行的条件为true,程序执行x2行,产生异常对象,并将其抛至x6行处。x6行发生异常,被catch捕获,在x7处处理错误信息输出。
Exception类的父类为何名为Throwable,相信大家已经明白了一些,注意:可抛出异常对象不仅可为Exception类型,也可以为Error类型。
5.Java内置异常
Java的java.lang中定义的不受控异常的子类
异常 | 说明 |
ArithmeticException | 算术错误,如被0除 |
ArrayIndexOutOfBoundException | 数组下标出界 |
ArrayStoreException | 数组元素赋值类型不兼容 |
ClassArgumentException | 非法强制转换类型 |
IllegalArgumentException | 调用方法的参数非法 |
IllegalMonitorStateException | 非法监控操作,如等待一个未锁定的线程 |
IllegalStateException | 环境或应用状态不正确 |
IllegalThreadStateException | 请求操作与当前相册状态不兼容 |
IndexOutOfBoundException | 某项类型索引越界 |
NullPointerException | 非法使用空引用 |
NumberFormatException | 字符串到数字格式非法转换 |
SecurityException | 试图违反安全性 |
StringIndexOutOfBounds | 试图在字符串边界之外索引 |
UnsupportedOperationException | 遇到不支持的操作 |
java.lang中定义的受控异常
异常 | 说明 |
ClassNotFoundException | 找不到类 |
CloneNotSupportedException | 试图克隆一个不能实现的Cloneable接口的对象 |
IllegalAccessException | 对一个类的访问被拒绝 |
InstantiationException | 试图创建一个抽象类或者抽象接口的对象 |
InterruptedException | 一个线程被另一个线程中断 |
NoSuchFieldException | 请求的字段不存在 |
NoSuchMethodException | 请求的方法不存在 |
编程提示:
(1)不能再try块与catch块之间放置其他的代码。
(2)指定一个用逗号分开的catch参数是编译错误,catch块只能有一个参数。
(3)与某try块关联的两个catch自己捕获同一类型异常是编译错误。
(4)如方法抛出了未在throw子句中列出的受控异常,是编译错误。
(5)所有的异常类名需要以Exception结束。
问题思考
(1)运行下面代码,会出现何种结果呢?
int[] a; try{ a[10]=100; }catch(ArrayIndexOutOfBoundException ae){ System.out.println("A"); }catch(NegativeArraSizeException ne){ System.out.println("B"); }
(2)运行下面代码,会出现何种结果呢?
int[] a=new int[10]; try{ a[1]=100; }catch(ArrayIndexOutOfBoundException ae){ System.out.println("A"); }catch(Exception e){ System.out.println("B"); }
转载请注明: ITTXX.CN--分享互联网 » Java语言学习—第十一章 处理异常[Java基础]
最后更新:2018-09-28 12:30:53