java异常

一、异常的分类

Throwable类有两个重要的子类:Error和Exception,Exception又分为编译期异常和运行期异常。

所有的异常都是Exception的子类,所有的异常都可以使用Exception来接收。

java中有两种异常处理机制:捕获处理异常和声明抛出异常。与异常有关的关键字有try,catch,throw,throws,finally。通过try,catch,finally关键字实现捕获处理异常;通过throw,throws关键字声明抛出异常。

 

二、捕获处理异常

Scanner scan=new Scanner(System.in);

System.out.println("请输入:");

try{

    int n=scan.nextInt();     

    System.out.println(10/0);

}

catch(ArithmeticException e){    

     System.out.println("除0错误");

}

catch(Exception e){             

    System.out.println("请重新输入:");

}

finally{

     System.out.println("finally");

}

 try,catch,finally三个语句块应注意的问题:

1)try,catch,finally三个语句块均不可单独使用,catch语句可以有一个或多个,finally语句最多一个;

2)try,catch,finally三个代码块中变量的作用域均为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。

3)即便有多个catch块,都只会匹配其中一个异常类并之心相应的catch块代码,而不会再执行别的catch块,匹配的catch语句的顺序是由上到下。

在安排catch语句的顺序时,首先应该捕获最特殊的异常,然后再逐渐一般化,也就是先匹配子类,再匹配父类。当捕获到一个异常时,剩下的catch语句就不再进行匹配。

finally语句保证在控制流转到程序的其他部分之前,finally代码块中的程序都会被执行。

通常异常处理用3个函数来获取异常的有关信息:

getCause():返回抛出异常的原因。如果cause不存在或未知,返回null;

getMessage():返回异常的消息信息;

printStackTrace():将Throwable对象的堆栈跟踪信息输出至标准错误输出流,这种方式打印异常信息是最完整的。

三、声明抛出异常

从方法中抛出的任何异常都必须使用throws子句实现。

1)throws抛出异常

如果一个方法可能会出现异常,但是没有能力处理这种异常,可以在方法声明出用throws子句来声明抛出的异常。java的JVM是的异常对象可以从调用栈向上传播,直到相应的方法捕获它为止。声明抛出异常时在方法声明中的throws子句中指明的。多个异常可以使用逗号分割。

class People{

    void fun() throws Exception{

         int[] arr={1,3};

         System.out.println(arr[6]);

     }

}

public class Test{

    public static void main(String[] args){

        People p=new People();

           try{

               p.fun();

            }

            catch(Exception e){

               System.out.println("异常");

       }

    }

}

 当方法名抛出异常列表中的异常时,方法将不对这些类型及其子类类型的异常做处理,而抛向调用该方法的方法,由它去处理。使用throws关键字将异常抛给调用者后,如果调用者不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的调用者。

2)throw抛出异常

java允许开发者定义自己的异常类,称之为自定义异常。要遵守规则:自定义异常类必须是Throwable的子类,而更多时候自定义的异常类都继承自Exception类。

自定义异常类:

(1) 创建一个继承 Exception 类或者其它已存在的异常类的子类。

(2) 在该类中创建一个默认的无参数构造方法,该构造方法以适当的错误消息作为输入, 调用它的超类的构造方法。

(3) 再增加一个带字符串参数的构造方法,该构造方法以适当的错误消息作为输入(还包括输入的字符串)来调用其超类相应的构造方法。

class MyException extends Exception{

      public MyException() {

        // TODO Auto-generated constructor stub

         //System.out.println("exception occur!!!");

         super.getMessage();//返回异常的消息信息

   }

      public MyException(String str){

         System.out.println(str);

   }

}

     class People{

          void fun() throws MyException{

             People p=new People();

             if(!(p instanceof People)){        //判断一个实例对象p是否属于People类

             throw new MyException();

    }

  }

}

public class Test1{

      public static void main(String[] args) {

           People p=new People();

           try {

             p.fun();

            } catch (MyException e) {

           // TODO Auto-generated catch block

              e.printStackTrace();//将Throwable对象的堆栈跟踪信息输出至标准错误输出流

     }

   }

}

throw总出现在方法体中,用来抛出一个Throwable类型的异常。创建异常类的实例对象,再通过throw语句抛出。

class People{

    void fun() throws Exception{

         Exception e=new Exception();

         int[] arr={1};

         if(arr[0]!=10){

            throw e;

           }

     }

}

public class Test{

    public static void main(String[] args){

        People p=new People();

           try{

               p.fun();

            }

            catch(Exception e){

               System.out.println("异常");

       }

    }

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值