异常及其处理方式

计算机毕竟是机器,因为其硬件或软件的限制,对于有些情况超过了计算机的处理能力,例如,除数为零出现的无穷大的商等,像这类的操作将会导致程序的中止或者系统的崩溃,这些可能引起程序非正常运行的错误,称为异常,在Java中就提供了异常类Throwable及处理这些异常的语句结构。


一、try…catch/try…catch…finally异常处理语句处理
Exception类异常的处理格式语法如下:
try{
// 有可能发生异常的代码段
}catch(异常类型1 对象1){
// 异常的处理操作
}catch(异常类型2 对象2){
// 异常的处理操作
} ...
【finally{
// 异常的统一出口,不管是否有异常,都要执行该处的语句
}】
说明:
(1)一旦产生异常,则系统会自动产生一个异常类的实例化对象;
(2)如果程序中没有try语句或在try语句之外产生的异常,则将有系统报告错误;
(3)一旦有异常产生,在try语句之中的异常产生之后的代码也将不再执行;
(4)try语句中有异常发生时,产生的异常类的实例化对象依次与catch方法的参数进行匹配,如果匹配成功,则表示由此catch进行处理,不再继续检查之后的catch语句,如果到最后都没有与之匹配的catch语句,将交由系统报告错误;因此为了准确定位异常的位置和原因,捕获更粗的异常不能放在捕获更细的异常之前;
(5)从之前的说明图中可以看出,Exception类是所有异常的父类,那么如果将catch的参数设置成Exception类型,表示将捕获所有的异常(各异常对象将发生向上转型),所以有时候会将最后一个catch语句的参数设置为Exception类,这样当前面没有与之精确配对的参数时,都将交由此catch语句处理;
(6)在进行异常捕获及处理的时候,不要使用Throwable作为捕获的类型,因为范围太大了;
例如:
public class ExceptionDemo{
public static void main(String argsp[]){
int i = 0 ;
int j = 0 ;
System.out.println("============= 计算开始 =============") ;
int temp = 0 ; // 要在外部定义
try{
i = Integer.parseInt(argsp[0]) ; // 将第一个输入参数变为int型
j = Integer.parseInt(argsp[1]) ; // 将第二个输入参数变为int型
System.out.println("********************************") ;
temp = i / j ; // 进行除法运算
System.out.println("------------------------------------------------") ;
}catch(ArithmeticException e){
System.out.println("发生了算术异常:" + e) ; // 打印异常对象,调用toString()方法
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("输入错误参数异常:" + e) ;
}catch(NumberFormatException e){
System.out.println("输入的参数不是数字异常:" + e) ;
}catch(Exception e){
//System.out.println("其他异常:" + e) ;
e.printStackTrace() ; // 打印异常信息,这种方式打印出的信息是最全的
}finally{
System.out.println("============= 计算结束 =============") ;
}
System.out.println("temp = " + temp) ;
}
};
二、Throws关键字
此关键字主要在方法的声明上使用,表示方法中不处理异常,而交给调用处处理。
例如:public static int parseInt(String s)throws NumberFormatException
如果某个方法定义的时候加了“throws 异常名称”的说明,而且该不是的异常,那么调用该方法的地方必须明确的使用try..catch进行异常的捕获处理,而不管是否真的会发生异常;
例如:
class Math{
public static int div(int i,int j) throws Exception{ // 此方法有可能出现异常
int temp = 0 ;
temp = i / j ;
return temp ;
}
};
public class WrapDemo03{
public static void main(String argsp[]){
try{//因为div()方法在声明时加了throws Exception,那么此处必须加try…catch语句处理
System.out.println(new Math().div(10,2)) ; // 此方法不管是否有异常,都需要进行处理
}catch(Exception e){
e.printStackTrace() ;
}
}
};
说明:如果在主方法上使用了thorws关键字声明的话,表示所有的异常将由JVM进行处理,实际上对于Java程序来讲,如果没有加入任何的异常处理,则默认就将由JVM进行异常的处理操作。
class Math{
public int div(int i,int j) throws Exception{ // 此方法有可能出现异常
int temp = 0 ;
temp = i / j ;
return temp ;
}
};
public class ExceptionDemo10{
public static void main(String argsp[]) throws Exception{ // 所有的异常交由JVM进行处理
System.out.println(new Math().div(10,0)) ;
}
};
三、throw关键字
throw关键字表示在程序中人为的抛出一个异常。
在程序中都会尽量的避免异常的产生,为什么还要存在throw人为的抛异常呢?
因为在设计方法的时候一般不考虑或者不直接在方法中处理异常,而是将异常交由调用方自己选择处理方式,所以在方法定义的时候加上throws关键字,而在程序try…catch语句中将捕获的异常用throw关键字直接抛出;
四、异常处理的标准格式
在实际的开发中,try、catch、finally、throw、throws五个关键字是要一起联合使用的。
例如:
class Math{
public int div(int i,int j) throws Exception{ // 此方法有可能出现异常
System.out.println("===== 计算开始 =====") ;
int temp = 0 ;
try{
temp = i / j ;
}catch(Exception e){
throw e ; // 所有异常抛出,而不直接处理
}finally{
System.out.println("===== 计算结束 =====") ;//不管是否有异常将执行该语句
}
return temp ;
}
};
public class ExceptionDemo12{
public static void main(String argsp[]){
try{
System.out.println(new Math().div(10,0)) ; // 此方法不管是否有异常,都需要进行处理
}catch(Exception e){
e.printStackTrace() ; // 打印异常信息,这种方式打印出的信息是最全的
}
}
};

五、自定义异常类
在Java中,已经提供了很多的异常类的定义,但是在开发一些个人的系统中可能需要使用一些特殊的个性化的异常类的操作,那么此时就可以通过继承Exception类的方式完成一个自定义异常类的操作。
例如:
class MyException extends Exception{ // 继承Exception,表示一个自定义异常类
public MyException(String msg){
super(msg) ; // 调用Exception中有一个参数的构造
}
};
public class ExceptionDemo14{
public static void main(String argsp[]){
try{
throw new MyException("自己定义,抛着玩的。") ;
}catch(Exception e){
e.printStackTrace() ;
}
}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值