Java语言程序设计--处理异常 try,catch,finally,exit

 处理异常 
  java语言把程序运行中可能遇到的错误分为2类:异常:一类非致命性的,通过某种修正后程序还能继续执行。 如打开一个文件时,发现文件不存在。又比如除零溢出,数组越界等
  
另一类是致命性的:程序遇到了非常严重的不正常状态,不能简单得恢复执行,这就是错误。 比如程序运行中内存耗尽。

  1.       A异常及其处理机制

未加处理的异常示例:源代码
public class HelloWorld 
{
    public static void main(String[] args) 
    {
         int i=0;
         String getting []={    //只含有3个元素的数组
        "Hello World",
        "No,I mean it!",
         "HELLO WORLD!!"
        };
        while(i<4){
        
    }
}

输出结果:
Hello World
No,I mean it!
HELLO WORLD!!
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at HelloWorld.main(HelloWorld.java:12)

简而言之,发现错误的代码可以抛出一个异常,程序员可以捕获该异常,如果可能则处理它,然后恢复程序的执行。

     B异常分类

Java语言在所有的预设包中都定义了异常类和错误类。Exception类是所有异常类的父类,Error类是所有错误类的父类。这2个类又同时是Throwable类的子类。

Throwable在Java类库中 不需要import语句就可以使用。
   异常语句分为3类

  •           1受检异常  必须被处理

  •           2运行时异常  不需要处理

  •           3错误    不需要处理

1受检异常:是程序执行期间发生的严重事件的后果。
FileNotFoundException 程序从磁盘中读入数据,而系统找不到含有数据的文件。
ClassNotFoundException
IOException
NoSuchMethodException
WriteAbortedException
受检异常的所有类都是Exception的子类,Exception是Throwable的后代。


Resetting Index Value
e.toString()
This is always printed

2运行时异常:程序中逻辑错误的结果。
数组下标越界 ArrayIndexOutOfBounds
被o除   ArithmeticException
ClassCastException
IndexOutOfBoundsException
运行时异常的所有类都是类RuntimeException的子类,它是Throwable的后代

3错误:是标准类Error或其后代类的一个对象 Error是Throwable的后代。
一般地,错误是指发生了不正确的情况。如内存溢出。
运行时异常和错误称为不检行为
很多异常类都在包java.lang中,所以不需要引入
当有些异常类也需要引入
例如 当在程序中使用类IOException时,必须要引入语句:
import java.io.IOException
      C异常处理
      try{
      //其他的代码
      anObject.readString(...);可能抛出一个异常
      //更多的其他的代码
      }catch(IOException e){
      //响应异常的代码 可能含义下面这行:
      System.out.println(e.getMessage());
      }
      
1.不管有没有try块,块中输入操作的运行都是一样的。如果没有发生异常,则try块内的语句全部执行,然后执行catch块后的语句。
2.如果在try块内发生了IOException异常,则执行立即转到catch块。此时已经捕获了异常。
3不论是否捕获了异常,都要执行finally后面的语句。

作为一个对象,每个异常都有存取方法getMessage() 它返回抛出异常时创建的描述字符串。
catch块执行完毕,执行它后面的语句。但如果问题很严重。则catch块可以调用exit()方法来中止程序。
System.exit(0)

  1. 正确的次序 将多个具体异常放在其祖先类的前面。

catch(FileNotFoundException e)
{......}
catch(IOException e)   //处理所有其他IOException
{......}

finally实例:
try:{
   startFaucet();        //某个方法
   waterlawn();          //某个方法
}finally{
   stopFaucet();
}
stopFaucet()方法总是被执行。try后面大括号的代码称为保护代码。
如果在保护代码内执行了System.exit()方法,将不执行finally后面的语句。这是不执行finally后面语句的唯一的一种可能。

添加异常处理的示例:
public class HelloWorld 
{
    public static void main(String[] args) 
    {
         int i=0;
         String getting []={    //只含有3个元素的数组
        "Hello World",
        "No,I mean it!",
         "HELLO WORLD!!"
        };
        while(i<4){
            try{
                System.out.println(getting[i]);
            }catch(ArrayIndexOutOfBoundsException e){
                System.out.println("Resetting Index Value");
            }catch(Exception e){
                System.out.println(e.toString()); //e是错误异常类Exception类的一个实例;toString()是一个方法,它的作用是将变量由其它类型转变为字符串类型。
                                                   //这里System.out.println(e.toString())就是调用系统输入(System.Out)的println()方法,这个方法需要传入一个字符串类型的参数。
                                                       //这时,e.toString(),即把捕获的错误异常转变为字符串类型,传给println()方法,用以输入。
            }finally{
                System.out.println("This is always printed");
          
            }
    }//while循环结束
}//main主函数结束
}
   

  • 2公共异常

1ArithmeticException  int i=12/0; 整数除法中如果除数为零,则发生该异常。

2NullPointerException 如果一个对象还没有实例化 那么访问该对象或调用它的方法将导致这个异常
例如:
image im[]=new image[4];    //创建含有4个元素的数组01234,也可以理解为5个
System.out.println(im[0].toString());   //系统为其初始化都是null,所以访问im[0]会导致
NullPointerException

3NegativeArraySizeException:创建数组时,如果元素个数是负数
4ArrayIndexOutOfBoundException 数组下标越界

  • 3 抛出异常

程序员处理异常有2种方法 
1使用try块和catch块 捕获到所发生的异常类 并进行相应的处理。
2程序员不在当前方法内处理异常,而是把异常抛出到调用方法中。

在说明方法时,要使用如下格式:
     访问权限修饰符 返回值类型 方法名(参数列表) throws 异常列表 
     紧接着在关键字throws后面的是该方法内可能方式且不进行处理的所有异常列表。
     各异常列表之间以逗号隔开。例如:
     public void troubleSome() throws IOException
       


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值