码迷,mamicode.com
首页 > 其他好文 > 详细

29.异常

时间:2018-01-19 18:47:45      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:运行时   sys   情况下   auto   跟踪   mes   bsp   stack   除了   

一.异常:就是程序在运行时出现不正常情况。
异常由来:问题也是现实生活中一个具体的事物,也可以通过Java类的形式进行描述,并封装成对象。
其实就是java对不正常情况进行描述后的对象体现。
对于问题的划分:
1.严重的问题:java通过error类进行描述
对于error一般不编写针对性的代码进行处理
2.非严重的问题:java通过Exception类进行描述
对于Exception可以使用针对性的处理方式进行处理
无论error或者Exception都具有一些共性内容。
比如:不正常情况的信息、引发原因等。

Throwable
  |--Exception
  |--Error

二.异常的处理
java提供了特有的语句进行处理。
try{
  需要被检测的代码;
}catch(异常类 变量){
  处理异常代码;(处理方式)
}finally{
  一定会执行的语句
}

三.对捕获到的异常对象进行常见方法操作
String getMessage

public class Exception_05 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Demo d=new Demo();
        /*int x=d.div(5,0); // java.lang.ArithmeticException
        System.out.println("x="+x);
        System.out.println("over");*/
        
        try{
            int x=d.div(5,0); 
            System.out.println("x="+x);
        }catch(Exception e){  //Exception e=new ArithmeticException();
            System.out.println("除0啦");
            System.out.println(e.getMessage()); //   / by zero
            System.out.println(e.toString());  //    java.lang.ArithmeticException: / by zero
            e.printStackTrace();   //异常名称  异常信息  异常出现的位置
                                   //其实jvm默认的异常处理机制,就是在调用printStackTrace方法,打印异常的堆栈跟踪信息。
        }
        System.out.println("over");
        
    }

}
class Demo{
    int div(int a,int b){
        return a/b;
    }
}

 

在函数上声明异常
  便于提高安全性,让调用者进行处理,不处理编译失败

public class Exception_06 {

    public static void main(String[] args)  { //throws Exception
        // TODO Auto-generated method stub
        Demo1 d=new Demo1();
        
        try{
            int x=d.div(4,0);
            System.out.println(x);
        }catch(Exception e){
            System.out.println(e.toString());
        }
        System.out.println("over");
    }
}
class Demo1{
    int div(int a,int b)throws Exception{ //在功能上通过throws的关键字声明了该功能可能会出现问题
        return a/b;
    }
}

 

对多异常的处理

1.声明异常时,建议声明更为具体的异常,这样处理得更具体
2.对方声明几个异常,就对应有几个catch块,不要定义多余的catch块。
如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面

建议在catch处理时,catch中一定要定义具体处理方式,不要简单定义一句e.printStackTrace(),
也不要简单的就书写一条输出语句。

public class Exception_07 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Demo2 d=new Demo2();
        try{
            int x=d.div(6, 0);
            System.out.println("x="+x);
        }catch(ArithmeticException a){
            System.out.println(a.toString());
            System.out.println("被0除了");
        }catch(ArrayIndexOutOfBoundsException b){
            System.out.println(b.toString());
            System.out.println("角标越界了");
        }catch(Exception e){
            System.out.println("haha:"+e.toString()); 
        }
        System.out.println("over");
    }

}
class Demo2{
    int div(int a,int b) throws ArithmeticException,ArrayIndexOutOfBoundsException{
        int [] arr=new int[a];
        System.out.println(arr[4]);
        return a/b;
    }
}

 

自定义异常
  因为项目中会出现特有的问题,而这些问题并未被java所描述并封装对象,所以对于这些特有的问题可以按照
  java对问题封装的思想,将特有的问题进行自定义的异常封装。

需求:在本程序中,对于除数是负数,也视为是错误的,无法进行运算,那么需要对这个问题进行自定义的描述

当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
要么在内部try catch处理
要么在函数上声明,让调用者处理

一般情况下,函数内出现异常,函数上需要声明

发现打印的结果中,只有异常的名称,没有异常的信息。因为自定义异常并未定义信息。

如何定义异常信息呢?
因为父类中已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息传递给super语句,那么就可以通过
getMessage()方法获取自定义的异常信息了。

throw和throws的区别:
1.throws使用在函数上,throw使用在函数内。
2.throws后面跟异常类,可以多个,用逗号隔开,throw后跟的异常对象。

public class Exception_08 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Demo3 d=new Demo3();
        try{
            int x=d.div(4, -1);
            System.out.println(x);
        }catch(FuShuException e){
            System.out.println(e.toString()); //toString()调用getMessage()方法
            System.out.println("除数出现负数了");
            System.out.println("错误的负数是:"+e.getValue());
        }
        
    }
}


class FuShuException extends Exception{
    //private String msg;
    /*FuShuException(String msg){  //构造器和方法在父类Exception中已经有了
        this.msg=msg;
        super(msg);
    }*/
    
    /*public String getMessage(){
        return msg;
    }*/
    
    private int value;
    FuShuException(String msg,int value){
        super(msg);
        this.value=value;
    }
    public int getValue(){
        return value;
    }
}
class Demo3{
    int div(int a,int b) throws FuShuException{
        if(b<0){
            throw new FuShuException("出现了除数是负数的情况",b);  //手动通过throw关键字抛出一个自定义异常对象
        }
        return a/b;
    }
}

//父类中成员变量及成员函数的情况

/*class Throwable{
    private String message;
    Throwable(String message){
        this.message=message;
    }
    public String getMessage(){
        return message;
    }
}
class Exception extends Throwable{
    Exception(String message){
        super(message);
    }
}*/

 

Exception中有一个特殊的子类异常RuntimeException运行时异常。
如果在函数内抛出异常,函数上可以不用声明,编译一样通过。
如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。

之所以不用在函数上声明,是因为不需要让调用者处理。
当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后对代码进行修正。

自定义异常时:如果该异常的发生,无法再继续进行运算,就让该自定义异常继承RuntimeException

对于异常 分两种:
  1.编译时被检测的异常
  2.编译时不被检测的异常(运行时异常,RuntimeException)

public class Exception_09 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Demo4 d=new Demo4();
        /*int x=d.div(4, 0);
        System.out.println("x="+x);*/
        
        /*Person p=new Person();
        p.checkName(null); //NullPointerException
        */
        
        int x=d.div(4,-9);
        System.out.println("x="+x);
        
        
        
        System.out.println("over");
    }

}
class Demo4{
    int div(int a,int b) { //throws ArithmeticException
        if(b==0){
            throw new ArithmeticException("被0除啦");
        }
        if(b<0){
            throw new FuShuException1("出现了除数为负啦");
        }
        return a/b;
    }
}
class Person{
    public void checkName(String name){
        /*if(name.equals("lisi")){ //可能 发生NullPointerException异常
            System.out.println("yes");
        }else{
            System.out.println("no");
        }*/
        
        if("lisi".equals(name)){ //if(name!=null && name.equals("lisi")),避免了空指针异常
            System.out.println("yes");
        }else{
            System.out.println("no");
        }
    }
}
class FuShuException1 extends RuntimeException{
    FuShuException1(String msg){
        super(msg);
    }
}

 

29.异常

标签:运行时   sys   情况下   auto   跟踪   mes   bsp   stack   除了   

原文地址:https://www.cnblogs.com/syj1993/p/8318287.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!