第九章异常处理总结

文章介绍了Java中的异常处理机制,包括异常概述,如ArithmeticException示例,以及异常的抛出和捕捉,强调了try-catch语句块在处理异常中的作用。此外,还提到了自定义异常的创建和使用,以及异常处理的原则。
摘要由CSDN通过智能技术生成

9.1异常概述

在程序中,异常可能由程序员没有预料到的各种情况产生,也可能由超出了程序员可控制范围的环境因素产生,如用户的坏数据,试图打开一个根本不存在的文件等。在Java中,,这种在程序运行时可能出现一些错误称为异常。异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指冷流。

【9.1】0可以作为除数么?

在项目中创建Baulk类,在主方法中定义int型变量,将0作为除数的算术表达式赋值给该变量。

代码如下:

 

运行结果:

 程序运行的结果报告发生了算术异常ArithmeticException(根据给出的错误可知,发生错误是因为在算术表达式“3/0”中,0作为除数出现),系统不再执行下去,提前结束。这种情况就是所说的异常。有许多异常的例子,如数组溢出等。Java语言是以一门面向对象的编程语言,因此异常在Java语言中也是作为类的实例的形式出现。当某一个方法中发生错误时,这个方法会创建一个对象,并且把它传递给正在运行的系统。这个对象就是异常对象。通过异常处理机制,可以将非正常情况下的处理代码与程序逻辑分离,即在编写代码主流程的同时在其他地方处理异常。

修改之后代码如下:

 运行结果:

运行结果出现算术异常,则说明代码则修改好了。

不强制要求处理

           —— RuntimeException 

                ——IQException

                ——SQLException

Exception                ——IterrupetedExcption

                ——DataFormatException

                ——TimoutException

9.2异常的抛出与捕捉

在Java中,如果某个方法抛出异常,既可以在当前方法中进行捕捉,而后处理该异常,也可以将异常向上抛出,交由方法调用者来处理。

9.2.1抛出异常

 异常抛出后,如果不做出任何处理,程序就会被终止。例如,将一个字符串转换为整型,可以通过Integer类的parseInt ()方法来实现。 如果该字符串不是数字形式,parseInt()方法就会抛出异常,程序将在出现异常的位置终止,不再执行下面的语句。

【9.2】控制台输出"lili年龄是:20L"

代码如下:

 运行结果如下:

 从图9.2中可以看出,本来例报出的是NumberFormatException(字符串转换数字)异常。提示信息”lili年龄是”已经输出,可知该句代码之前并没有异常,而变量age没有输出,可知程序在执行类型转换代码时已经终止。

9.2.2捕捉异常

Java语言的异常捕获结构由try,catch和finally3部分组成。其中,try语句块存放的是可能发生异常的Java语句:catch语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块。语句如下:

try{

//代码块

}catch(Exception1 e){

}catch(Exception2 e){

//处理异常Exception e

}.......

finally{

//代码块

}

通过异常处理器的语法可知,异常处理器大致分为try-catch语句块和finally语句块。

1.try-catch语句

【9.3】捕获9.2中主方法中使用try-catch语句块将可能出现异常语句进行异常处理。

代码如下:

 运行结果如下:

从图9.3看出,程序任然输出最后的提示信息,没有因为异常而终止。在例题9.3中,将可能出现异常的代码用try-catch语句块进行处理,当try语句块的语句发生异常时,程序就会跳转到catch语句块中执行,执行完catch语句块的程序代码后,将继续执行catch语句块后的其他代码,而不会执行try语句块中发生异常语句后面的代码。由此可知,Java的异常处理是结构化的,不会因为一个异常影响整个程序的执行。

误区:

有时为了编程简单会忽略catch语句后的代码,这样try-catch语句就成为了一种摆设,一旦程序在运行过程中出现了异常,就会异常最终运行结果与期望的不一致,而错误发生的原因很难查找。

因此要养成良好的编程习惯,最好在catch语句块中写入处理异常的代码。

2.finally语句块 

完整的异常处理语句一定要含finally语句,无论程序中有无异常发生,并且无论之前的try-catch语句块是否顺利执行完毕,都会执行finally语句。但是,以下4种特殊情况下,finally块不会被执行:

<在finaly 语句块中

<在前面的代码中使用了System..exit()退出程序。

<程序所在的线程死亡。

<关闭CPU。

9.3Java常见的异常类

 

9.4自定义异常

使用Java内置的异常类可以描述在编程时出现的大部分异常类情况。除此之外,用户只需维承Execption类即可自定义异常类。在程序中使用自定义异常类,大体可分为以下步骤:

(1)创建自定义异常类。

(2)在方法中通过throw关键字抛出异常对象。

(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理,否则方法的声明通过throw关键字指名要给出调用者的异常,继续进行下一步操作。

【9.4】如何自定义异常

代码如下:

字符串ErrorMxception是要输出的错误信息。若想抛出用户定义的异常对象,要使用thorw关键字

【9.5】自定义异常的抛出与捕捉

代码如下:

 

 运行结果如下:

在该类中创建一个带有int参数的方法avg(),该方法用来检查参数。在try 语句块处理可能出现异常的代码然后调用抛出。

9.5在主方法中抛出异常

9.5.1使用throw关键字抛出异常

throw关键字通常被应用在声明方法时,用来指定方法可能被抛出的异常。多个异常可使用逗号分隔。

【9.6】指明异常源起何处

代码如下:

 运行结果如下:

使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。

说明如果是Error类,RuntimeException类或它们的子类,可以不使用throw语句来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。

9.5.2使用throw关键字抛出异常

 throw关键字通常用于方法体中,并且抛出一个异常对象。程序在执行到throw语句立即终止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中要抛出的异常;如果要捕捉throw 抛出的异常,则必须使用try-catch语句块。

throw通常用来抛出用户自定义异常。下面实例介绍throw的用法。

【9.7】创建自定义异常

代码如下:

运行结果如下;

 

 【9.8】使用throw关键字捕捉自定义异常

使用throw关键字捕捉异常。

代码如下:

abstract class Dog{//抽象类
 String color;
 public abstract void call();//抽象方法
 public abstract void move();//抽象方法
}

public class Demo {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Dog wenin = new Dog() {
   //匿名内部类
   public void move(){
    System.out.println("四腿狂奔");
   }
   public void call() {
    System.out.println("汪汪汪");
   }
  };
  wenin.color = "灰色";
  wenin.move();
  wenin.call();
 }

 

运行结果如下:

上面的实例使用了多个catch语句来捕捉异常。如果调用quotient(3,1)方法,将发生MyException异常,程序跳转到catch(MyExceptione)语句块中执行;如果调用quotient(5,0)方法,会发生Arithmeti-cException异常,程序跳转到catch(ArithmeticException e)语句块中执行;如还有其他异常发生,将使用catch(Exception e)捕捉异常。由于Exception是所有异常类的父类,如果将catch(Exception e)语句块放在其他两个语句块的前面,后面的语句块将永远得不到执行,也就没有什么意义了,所以catch语句的顺序不可调换。

使用匿名类时应该遵循以下原则
1、匿名类不能写构造方法。
2、匿名类不能定义静态的成员。
3、如果匿名类创建的对象没有赋值给任何应用变量,会导致该对象用完一次就会被Java虚拟机销毁。  

异常的使用原则

Java异常强制用户去考虑程序的强健性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应的处理。编写代码处理某个方法可能出现的异常时,可遵循以下几条原则:1、在当前方法声明中使用try-catch语句捕获异常。2、一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类。3、如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值