`
iilei1982
  • 浏览: 9376 次
  • 性别: Icon_minigender_1
  • 来自: 山东泰安
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java异常处理 lyncn 原创

阅读更多
0 程序运行中,用户输入错误,磁盘满了,打印机打印中缺纸等等都会引起错误!
错误的处理与语言提供的异常处理机制相关。java的异常处理是常见编程语言中最强大,最优雅的。
1 java中的异常对象都派生于Throwable类的一个实例。
Throwable包括两个分支Error和Exception。
Exception包括两个大类,IOException和RuntimeException。
java语言规范将派生于RuntimeException或Error的所有异常称之为未检查异常(unchecked exception),其他异常为(checked exception)
2 声明已检查异常
有些只有一个异常
比如java.util.TreeSet类(jdk1.5)中
    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException {
            // Write out any hidden stuff
            s.defaultWriteObject();
           
            // Write out Comparator
            s.writeObject(m.comparator());
           
            // Write out size
            s.writeInt(m.size());
           
            // Write out all elements in the proper order.
            for (Iterator i=m.keySet().iterator(); i.hasNext(); )
              s.writeObject(i.next());
        }
如果有多个异常,中间用","分隔开来
比如java.util.TreeSet类(jdk1.5)中
            private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
            // Read in any hidden stuff
            s.defaultReadObject();
           
            // Read in Comparator
            Comparator<E> c = (Comparator<E>) s.readObject();
           
            // Create backing TreeMap and keySet view
            TreeMap<E,Object> tm;
            if (c==null)
            tm = new TreeMap<E,Object>();
            else
            tm = new TreeMap<E,Object>(c);
            m = tm;
            keySet = m.keySet();
           
            // Read in size
            int size = s.readInt();
           
            tm.readTreeSet(size, s, PRESENT);
    }
3 创建自己的异常类
        public class MyAppException extends Exception {
            public MyAppException() {
                super();
            }
       
            public MyAppException(String message) {
                super(message);
            }
       
            public MyAppException(String message, Throwable cause) {
                super(message, cause);
            }
       
            public MyAppException(Throwable cause) {
                super(cause);
            }
        }
4    抛出异常
        if(getProjectCount(projectId,conn) < 0){
                throw MyAppException("没有编号为"+projectId+"的工程");
        }
5    捕获异常
        捕获一个异常
        try{
            do sth;
        }
        catch (Exception e){
            handler for e;
        }
        捕获多个异常
        try{
            do sth;
        }
        catch (PatternSyntaxException pse){
            handler for pse;
        }
        catch (NullPointerException npe){
            handler for npe;
        }
        catch (Exception e){
            handler for e;
        }
描述更普遍的错误应该在后面
6    再次抛出
        try{
            do sth;
        }
        catch (Exception e){
            throw MyAppException("没有编号为"+projectId+"的工程",e);
        }
可以保存异常的原因,必要的时候可以把已检查异常封装为运行时异常。
7    finally子句
finally不管是否有异常都会执行,是回收资源的最好方法。
        Graphics g = image.getGraphics();
        try{
            //1
            code that might throw exception;
            //2
        }
        catch (Exception e){
            //3
            show e;
            //4
        }
        finally {
            //5
            g.dispose();
        }
        //6
情况一:代码没有抛出异常,将执行,1,2,5,6
情况二:抛出一个catch子句的异常并且catch子句没有出现异常,执行 1,3,4,5,6
情况三:抛出一个catch子句的异常并且catch子句出现异常,执行 1,3,5
情况四:抛出异常没有被catch捕获,执行1,5
需要注意的是finally中的句子不应该出现错误,当出现错误后将使原始异常丢失!!!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics