关闭

Java异常的处理

标签: javaexceptionstringlistclasslog4j
1390人阅读 评论(0) 收藏 举报
分类:
问题1、继承与RuntimeException是因为它是uncheck的错误类型,可以减少以后程序的代码量和使用方便。而Exception是必须check的错误类型,程序中一定要加上try,catch处理,比较繁琐。

关于LOG4J因为每个类中的catalog是不一样的。而且也不需要区别多用户的信息,应该可以满足现在的要求。

以下另:

通过自定义异常,来解决异常的覆盖问题。

并且也可以实现异常信息的自定义

文后说明了JAVA异常处理的几个注意点


自定义异常类:

通过重载getMessage方法,改写多个异常情况下异常信息输出。并且也可以在该方法中实现异常编码和异常信息的绑定:可以通过读取配置文件或者数据库,将异常编码转换为异常信息产生输出

package com.gever.jcw.test;

import java.util.List;
import java.util.ArrayList;


public class MyException extends Exception{
    List list;
    public MyException(){
        super();
        list=new ArrayList();
    }
    public MyException(ExceptionMsg msg){
        super();
        list=new ArrayList();       
        list.add(msg);
    }
    public void addException(ExceptionMsg msg){
        list.add(msg);
    }
    public List getExceptionList(){
        return list;
    }
    public String getMessage(){
        StringBuffer sb=new StringBuffer();
        if(list==null){
            sb.append("nothing Exception!/n");
        }else{
            if(list.size()>0){
                for(int i=0;i                    ExceptionMsg msg=(ExceptionMsg)list.get(i);
                    sb.append(msg.getClassname());
                    sb.append(".");
                    sb.append(msg.getMethodname());
                    sb.append(" ");
                    sb.append(msg.getLinenumber());
                    sb.append(" Line, ");
                    sb.append("wrong number ");
                    sb.append(msg.getErrnumber());
                    sb.append(":");
                    switch(msg.getErrnumber()){
                        case 101:
                            sb.append("this is 0 wrong");
                            break;
                        case 102:
                            sb.append("this is 1 wrong");
                            break;
                        case 103:
                            sb.append("this is 1 wrong");
                            break;
                        default:
                            sb.append("unknow error");
                            break;
                    }
                    sb.append("/n");
                }
            }
        }
        return sb.toString();
    }
    public void print(){
        System.out.println(this.getMessage());
    }
}

异常信息类:

package com.gever.jcw.test;

public class ExceptionMsg {
    private int errnumber=0;
    private String classname="";
    private String methodname="";
    private int linenumber=0;

    public ExceptionMsg(int errnumber,String classname,String methodname,int linenumber){
        this.errnumber=errnumber;
        this.classname=classname;
        this.methodname=methodname;
        this.linenumber=linenumber;
    }
    public int getErrnumber() {
        return errnumber;
    }

    public void setErrnumber(int errnumber) {
        this.errnumber = errnumber;
    }

    public String getClassname() {
        return classname;
    }

    public void setClassname(String classname) {
        this.classname = classname;
    }

    public String getMethodname() {
        return methodname;
    }

    public void setMethodname(String methodname) {
        this.methodname = methodname;
    }

    public int getLinenumber() {
        return linenumber;
    }

    public void setLinenumber(int linenumber) {
        this.linenumber = linenumber;
    }
}

测试类如下:

package com.gever.jcw.test;
public class TestT {
    public void test() throws MyException{
        MyException myex=new MyException();
        try{
            file://myex.addException();
            throw new MyException(new ExceptionMsg(101,this.getClass().toString(),"test",14));
        }catch(Exception e){
            myex.addException(new ExceptionMsg(102,this.getClass().toString(),"test",16));
        }finally{
            myex.addException(new ExceptionMsg(103,this.getClass().toString(),"test",18));
            throw myex;
        }

    }
    public static void main(String[] args){
        TestT test=new TestT();
        try{
            test.test();
        }catch(MyException e){
            e.print();
            e.printStackTrace();
        }
    }
}
又一注意问题:finally会在return之前执行。如果try或者catch语句中,有return,并且有finally,那么该return语句将不会执行。

 

JAVA异常处理的几个注意点:

1)使用finally防止资源泄露

2)不用从try区块中执行return语句。如果该区块后有finally区块,则finally区块将首先执行

3)将try、catch区块置于循环体之外,因为在没有起用JIT编译器的情况下,两者执行效率差异显著

4)只有在异常情况下才去使用异常。不能够预计的才能叫异常;否则都应该用判断语句来进行校验

5)在构造函数中抛出异常。这样可以避免构造出不正确的对象

6)抛出异常前,如果可能,恢复对象的有效状态。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2304859次
    • 积分:20963
    • 等级:
    • 排名:第374名
    • 原创:287篇
    • 转载:205篇
    • 译文:3篇
    • 评论:447条
    最新评论