欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

教程  Java语言学习—第十一章 处理异常[Java基础]

Java 原创 1033 0评论

内容概要:

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(可抛出异常)ErrorAssertionError
AWTError
LinkageError
ExceptionRuntimeException(运行时异常)ArithmeticException:算术异常,被0除。ArrayStoreException:数组存储异常,指派给数组值错误。ArrayIndexOutOfBoundException:数组下标越界。NullPointerException:引用尚无内存空间的对象时发生。NegativeArrayException:数组长度为负值异常。IllegalArgumentException:非法参数异常。指派给形式参数值错误。SecurityException:安全性异常
AWTException
IOExcetpionEOFException
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

赞 (1) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽