`
zy19982004
  • 浏览: 654478 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:249921
社区版块
存档分类
最新评论

Java异常学习四:Thinking In Java and Effective Java关于异常的一些描述

 
阅读更多

一.Thinking In Java

  1. 发现错误的最佳时期是编译期间,然而编译期间并不能找出所有数据,余下的问题必须在运行期间解决。
  2. switch case语句里如果throw Exception的话是不需要break的。
  3. 异常处理理论上有两种基本模型。终止模型,java和c++支持的模型,将假设错误非常关键,一旦异常被抛出,就表明错误已经无法挽回,也不能继续执行;恢复模型,遇到错误不能抛出异常,而是调用方法来修正错误。
  4. 尽量不要捕获RuntimeException,但还是可以在代码中抛出RuntimeException类型的异常。
  5. 如果一个方法只申明了异常,但并没有在方法体抛出任何异常,调用此方法的方法是没有异常可以捕获的。
  6. 丢失异常:1.不使用异常链;2.从finally语句返回。
    package com.jyz.study.jdk.exception;
    
    import java.io.IOException;
    
    /**
     * 丢失异常
     * @author JoyoungZhang@gmail.com
     *
     */
    public class LostException {
    	
    	public static void test1() {
    		try{
    			throw new IOException();
    		}finally{
    			return;
    		}
    	}
    	
    	public static void test2() throws IOException {
    		try{
    			throw new IOException();
    		}finally{
    			System.out.println(1);
    		}
    	}
    	
    	public static void main(String[] args) {
    		test1();
    		try {
    			test2();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    
    
    控制台:
    1
    java.io.IOException
    	at com.jyz.study.jdk.exception.LostException.test2(LostException.java:22)
    	at com.jyz.study.jdk.exception.LostException.main(LostException.java:31)
     
  7. 异常的限制:1.父类异常大于等于子类异常,子类要么不抛,要么抛出父类异常或父类异常的子异常。2.如果一个对象声明为父类引用时,调用此对象的方法,抛出父类里声明的异常;如果一个对象声明为是自己引用时,调用此对象的方法,当然抛出自己声明的异常,跟父类无关。3.异常声明不是方法签名的一部分,方法签名由方法名字和参数个数及类型组成,所以异常声明不能作为重载的判断标准。4.构造器可以抛出任何异常,而不必理会父类构造器抛了什么异常。
  8. 在创建需要清理的对象之后,立即进入try-finally块清理此对象。
  9. 异常匹配顺序:找出最近的异常;子类的对象也可以匹配其父类的处理程序。找到匹配的后,不再继续查找。
  10. 异常的重要准则是只有在你知道如何处理的情况下才捕获异常。重要目标是把错误处理的代码同错误发生的地点相分离。举个列子service-dao两层,在dao里产生了SQLException我无需处理直接抛出,到了service层,我知道要将其转换成自己的业务异常。

二.Effective Java 

  1. 基于异常的模式:用try catch然后忽略异常的手段来达到你想要的目的。
  2. 异常应该只用于异常的情况下,它们永远不应该用于正常的控制流。对此我不赞同。、
  3. 对可恢复的情况使用受检异常,对编程错误使用运行时异常。何为可恢复的情况,是指不改变代码的基础上,这个异常情况是可以恢复的,比喻IOExcepion可能是网络的问题,解决了网络,代码就能继续运行下去了;何为错误,当然指不能恢复的啦,比喻从你控制范围之外传递进来的null引用,所以,此类异常都是程序员的问题,作为程序员,应该在代码中进行必要的检查。
  4. 异常类越少,意味着内存印迹就越小,装载这些类的时间开销也越少。
  5. 异常转译:高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释的异常。异常链就是一种特殊的异常转译形式,高层异常可以通过getCause来获得低层的异常。
  6. 异常的细节信息应该包含所有的对该异常有贡献的参数和域的值。比喻IndexOutOfBoundsException应该包含lowerBound,upperBound,Index三个参数。遗憾的是Java平台里并没有广泛的使用这种做法,而是全部清一色的简单继承了下父Exception。
  7. 失败原子性:失败的方法调用应该使对象保持在调用前的状态。如果没有size==0的判断,可能导致size域同之前的不一致。
    	public Object pop(){
    	    if(size == 0){
    		throw new EmptyStackException();
    	    }
    	    Object result = elements[--size];
    	    //...
    	}
     

二.try catch finally break continue return 

    准则 

  1. finally一般情况总会执行,无论在try块里return break continue。除了调用System.exit(0)方法,该方法终止java虚拟机进程。
  2. try块里return之前,finally会被执行。
  3. return语句会把后面的值复制到一份用来返回,如果return的是基本类型的,finally里对变量的改动将不起效果,如果return的是引用类型的,改动将可以起效果。执行顺序:将要return时调用jsr指令----->finally代码块,finally代码块最后执行ret指令----->继续return。
  4. finally里的return语句会把try块里的return语句效果给覆盖掉。finally语句里的return,break,continues,抛出异常,finally子句结尾处的ret指令永远不会执行,不会在去调用finally的地方了。

      我们需要做的是

  1. 最好把return放到方法尾而不要在try里return。
  2. 如果非要的话:不要在try块和finally块里都包含return;如果在try块里return, 则不要在finally块里操作被return的变量。

 

 

1
0
分享到:
评论

相关推荐

    Thinking in Java

    Thinking in Java,这本东东说得蛮深入的。哈哈,不过感觉effectvie Java更好些,当然这不同层次了,Thinking in Java是初入者,effective Java是进阶了

    Thinking In Java 4(完美高清中文版).pdf

    java入门经典书籍,值得一看。

    Web Development with JavaServer Pages

    Web Development with JavaServer Pages is truly an excellent and in-depth tutorial in the effective use of JSPs to build Web applications. Geared toward the Web designer or intermediate Java programmer...

    5本java学习用书

    找了5本学习java的好书和一些例子代码和大家分享,希望能够对您能有所帮助。

    java软件笔试题-MyNotebook:我大学时期的笔记本

    java软件笔试题 my notebook 我的笔记本,大部分是在大二大三的时候写的笔记,对于已经毕业的来说可能比较基础甚至naive。对面临校招和实习的同学应该会有所帮助。这里将不再更新,请移步我的博客:。 part 1:...

    java版飞机大战源码-javaGuide:后端开发必备技能

    Java: mysql: spring: 算法: docker: 大数据: 图书推荐 关于夯实 Java 编程基础,我推荐 Bruce Eckel 的《Java 编程思想》(Thinking in Java),非常有名的经典书籍。这本书的特点是,不仅仅介绍 Java 编程的...

    Java异常处理

     java语言可以说是提供了过于完善的异常处理机制,以致于后来《Thinking in java》的作者Bruce Eckel都专门对他进行了论述。java中的异常机制包括Error和Exception两个部分。他们都继承自一个共同的基类Throwable...

    程序员面试刷题的书哪个好-wiki:维基

    《Thinking in java》 《Effective java》 《深入理解Java虚拟机》 《Java并发编程的艺术》 Android 低难度 《Android4高级编程》 中难度 《Android C++高级编程 使用NDK》 《Android应用性能优化》 《Android开发...

    Scala.Functional.Programming.Patterns.178398

    Grok and perform effective functional programming in Scala About This Book Understand functional programming patterns by comparing them with the traditional object-oriented design patterns Write ...

    Pragmatic.Clojure.Applied.From.Practice.to.Practitioner.1680

    Discover how to use Clojure in the real world, and unlock the speed and power of this beautiful language on the Java Virtual Machine. Clojure Applied gives you the practical, realistic advice and ...

    Mahout in Action

    Java and IDEs 7 ■ Installing Maven 8 ■ Installing Mahout 8 ■ Installing Hadoop 9 1.5 Summary 9 PART 1 RECOMMENDATIONS...........................................11 2 Introducing recommenders 13 2.1 ...

    程序员面试刷题的书哪个好-CodeStyleGuidelines:代码风格指南

    程序员面试刷题的书哪个好 luobo-android 开发环境配置 Android Studio 插件安装 打开Settings>Plugins>Browse Repositories安装: FindBugs-IDEA Java代码的静态检查工具。安装后重启,在Settings中找到和选中...And

    学编程的步骤.txt

    10:要想学好VC,没有扎实的C++知识是不行的,以下书籍是VC程序员必须翻的烂熟的:C++Primer,Effective C++,Thinking in C++,More Effective C++ 深入浅出MFC。 11:深刻理解C++面向对象的思想! 12:编程的...

    Google C++ Style Guide(Google C++编程规范)高清PDF

    Another useful rule of thumb: it's typically not cost effective to inline functions with loops or switch statements (unless, in the common case, the loop or switch statement is never executed)....

    推荐C++书目.doc推荐C++书目.doc

    13、看《Thinking In C++》不要看《C++变成死相》; 14、一定要看《Thinking In C++》第二卷; 15、《 C++ FAQs》 (Marshall Cline, Greg Lomow) 16、《 C++ Templates》 (David Vandevoorde , Nicolai M....

    asp.net知识库

    体验.net2.0的优雅(四):Provider、策略、控制反转和依赖注入 泛型最佳实践 asp.net 2.0下嵌套masterpage页的可视化编辑 C# 2.0与泛型 动态调用对象的属性和方法——性能和灵活性兼备的方法 泛型技巧系列:用泛型...

Global site tag (gtag.js) - Google Analytics