- 浏览: 32326 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
kensunhu:
阐述相当完整,例子非常精彩。就是类图不见啦。
java——状态模式(state pattern) -
jay.zhong:
师兄威武!
thinking in java 学习笔记2 -
wangen2009:
...
thinking in java 学习笔记2 -
abcxo:
谢谢,你是第一位回复的人,让我觉得人生充满了希望,多谢
thinking in java 学习笔记5 初始化与清理 -
ycq__110:
加油,童鞋,前途大大的
thinking in java 学习笔记5 初始化与清理
第十二章 通过异常处理错误
在以前平时的编程中没有真正意思到异常处理的强大,只从有一个android的图片过大,内存溢出,使用了异常处理才得以解决问题,我对异常处理的一个大概可以用一句话来表达:就是让程序在错误中恢复,依然进行下去
.概念
在c语言中,只有一些约定俗称的错误处理模式,而没有同意的异常处理机制,这使得编程人员思想趋向于只要你不随便乱点,就不会出错,否则就不关我事了,对我来说,这种想法是不要得的,并不是人人都是程序员,你的应用应该是强壮的,而我个人也就非常喜欢强壮的程序,java的异常处理机制是基于c++上面的,异常处理的一个很重要的好处就是将问题处理的代码和正常程序的代码分离开,使得代码的阅读,编写与调试工作更加井井有条
.基本异常
举一个例子,比如说除法,除数不能为0,或者不能为某些值,但是你不知道怎么去解决它,可以说是你意料之外,那么这时候你就应该抛出一个异常,然后异常处理程序处理(原来的执行路径将会打断),首先要在堆上new 一个异常对象,然后在当前环境中弹出对这个对象的引用,然后就把这个引用交给异常处理程序
异常参数,标准的异常类都有两个构造器,一个是默认的,一个是接受字符串作为参数的,以便将相关信息放入异常对象的构造器中
throw,抛出异常的引用,能够抛出任意类型的throwable对象,它是异常类型的根类,错误的信息保存在异常对象内部,然后上一层环境通过这些信息来决定如何处理异常
.捕获异常
监控区域,也就是try块,
处理程序,也就是catch块,可以使用多个catch,这样就可以针对性的来解决异常
.异常处理理论模型
终止模型。很容易理解,。就是发生了错误,然后异常处理可能进行了一些错误记录,然后系统就被迫终止
恢复模型。其实我们平时用的操作系统用的就是恢复模型,因为不可能,因为我们的误操作就要重启吧,可以在while里面加try,然后知道准确而至,这种虽然好,但是耦合度高,复杂性大,因为错误是千万种的,对于大型程序来说,维护与编写,无疑是噩梦
.自定义异常
必须从已有的异常类继承
throws,这个是为方法声明异常,当方法中有抛出异常时,必须声明,否则不能通过(runtimeexception及子类可以不用)注意:不建议在异常处理中放入过多的操作,耦合度会增加
printstatictrace()方法,打印从方法调用处直到异常抛出处
.异常与记录日志
这个非常重要,为什么呢。特别来说,我平时使用软件的时候,它都会将异常记录打印在一个文件上,然后你可以选择提交,这样帮助他们修复软件,在cam360里面就是这样
可以使用java.util.logging
.异常说明
throws ,因为源码不会与程序库一起发布
技巧:可以先声明异常,占个位置,然后不抛出异常,等以后有空再不上去
.捕获所有异常
exception放在最后
fillinstacktrace()可以使抛出点重置
.重新抛出异常
有两种,第一种是把原先的异常处理了,然后再抛出,第二种是把原先的异常处理,再新建一个异常抛出(原先的异常已解决),。。。使用throw e
.异常链
防止异常被屏蔽,可使用initcause
.java标准异常
throwable类可以被用来表示任何可以作为异常被抛出的类,且分为两种类型(继承),error,exception
runtimeexception称为不受检查异常,很难控制,只有代码的时候注意点
.finally清理
恢复状态的时候需要使用,无论是return,break,continue,都会使用finally
缺陷:在finally中使用throw,原先异常丢失,在finally中return根本不会报异常
.异常的限制
这样的异常实在繁琐
可能要等到以后自己成长了,才真正能体会到
注:
android 监听应用程序异常,输出异常日志log
- <pre class="java" name="code">1--在manifest添加:
- <application android:icon="@drawable/icon" android:label="@string/login_title"
- android:theme="@style/skin"
- android:name="com.XXX.application.LauncherApplication"
- android:process="@string/process" >
- public class LauncherApplication extends Application {
- private Context context;
- @Override
- public void onCreate () {
- super.onCreate();
- AppExcepiton appException = AppExcepiton.getInstance();
- appException.init(getApplicationContext());
- }
- public class AppExcepiton implements UncaughtExceptionHandler {
- // 获取application 对象;
- private Context mContext;
- private Thread.UncaughtExceptionHandler defaultExceptionHandler;
- // 单例声明CustomException;
- private static AppExcepiton appException;
- private AppExcepiton() {
- }
- public static AppExcepiton getInstance() {
- if (appException == null) {
- appException = new AppExcepiton();
- }
- return appException;
- }
- @Override
- public void uncaughtException(Thread thread, Throwable exception) {
- // TODO Auto-generated method stub
- String path = null;
- if (defaultExceptionHandler != null) {
- String state = Environment.getExternalStorageState();
- // 判断SdCard是否存在并且是可用的
- if (Environment.MEDIA_MOUNTED.equals(state)) {
- path = Environment.getExternalStorageDirectory().getPath();
- }
- // 创建一个logcat目录
- path = path + "/eIVS/log";
- File file = new File(path);
- if (!file.exists()) {
- file.mkdir();
- }
- String time = getCurrentTime();
- String fileName = time.substring(0, 9);
- File myFile = new File(path+"/"+fileName+".log");
- String str = "\n"+time+"-->"+"["+exception.getLocalizedMessage()+"]";
- try {
- FileWriter fw = new FileWriter(myFile, true);
- fw.write(str);
- fw.flush();
- fw.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Log.e("tag", "exception >>>>>>>" + exception.getLocalizedMessage());
- // 将异常抛出,则应用会弹出异常对话框.这里先注释掉
- // defaultExceptionHandler.uncaughtException(thread, exception);
- }
- }
- /**
- * 获得当前时间
- * @return
- */
- public String getCurrentTime(){
- Time t = new Time();
- t.setToNow();
- int year = t.year;
- int month = t.month+1;
- int day = t.monthDay;
- int hour = t.hour;
- int minute = t.minute;
- int second = t.second;
- String time = year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second;
- return time;
- }
- public void init(Context context) {
- mContext = context;
- defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
- Thread.setDefaultUncaughtExceptionHandler(this);
- }
3--在一个activity中模拟异常:
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.login);
- // 初始化资源信息
- throw new RuntimeException("--------");
- // init();
- }
- /**
- * 删除超过一年的日志
- * @param path
- */
- public void deleteOldFile(final String path){
- File file = new File(path);
- file.list(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String filename) {
- // TODO Auto-generated method stub
- File file = new File(path+"/"+filename);
- Long ago = file.lastModified();
- Long now = System.currentTimeMillis();
- //如果最后一次修改时间超过一年:3153600秒
- if((now-ago) > 31536000){
- file.delete();
- }
- return false;
- }
- });
- }
- //打印 有用信息 能够指出 错误代码的行数
- <pre class="java" name="code">@Override
- public void uncaughtException(Thread thread, Throwable exception) {
- // TODO Auto-generated method stub
- StackTraceElement[] stack = exception.getCause().getStackTrace();
- String path = null;
- if (defaultExceptionHandler != null) {
- String state = Environment.getExternalStorageState();
- // 判断SdCard是否存在并且是可用的
- if (Environment.MEDIA_MOUNTED.equals(state)) {
- path = Environment.getExternalStorageDirectory().getPath();
- }
- // 创建一个logcat目录
- path = path + "/eIVS/log";
- File file = new File(path);
- if (!file.exists()) {
- file.mkdir();
- }
- //删除过期文件
- deleteOldFile(path);
- String time = getCurrentTime();
- String fileName = time.substring(0, 9);
- File myFile = new File(path+"/"+fileName+".log");
- try {
- String str = "\n"+time+"-->";
- FileOutputStream fos = new FileOutputStream(myFile,true);
- fos.write(str.getBytes());
- for (int i = 0; i < stack.length; i++) {
- fos.write(stack[i].toString().getBytes());
- }
- fos.flush();
- fos.close();
- } catch (Exception e) {
- } }
.异常的限制
发表评论
-
thinking in java 学习笔记 14 类型信息
2012-04-27 09:37 870第十四章 类型信息 ... -
thinking in java 学习笔记 13 字符串
2012-04-27 09:11 1021第十三章 字符串 String我平时进行 ... -
thinking in java 学习笔记 11持有对象
2012-04-17 23:08 2321第十一章 持有对象 因为最近太多事情忙 ... -
thinking in java 学习笔记10内部类
2012-04-07 14:52 1478第十章 内部类 ... -
thinking in java 学习笔记 9 接口
2012-04-06 17:56 954第九章 接口 不可否认,我们开始了难啃的 ... -
thinking in java 学习笔记8多态
2012-04-05 13:29 1207第八章 多态 j ... -
thinking in java 学习笔记7 复用类
2012-04-05 01:00 989第七章 复用类 对于java而言,很重 ... -
thinking in java 学习笔记6 访问控制
2012-04-04 20:05 715第六章 访问权限 ... -
thinking in java 学习笔记5 初始化与清理
2012-04-02 12:04 995第五章 初始化与清理 今天是清明长假 ... -
thinking in java 学习笔记4 控制执行流程
2012-04-01 18:01 826第四章 控制执行流程 老师说得对,第十章以 ... -
thinking in java 学习笔记3
2012-04-01 01:07 780第三章 操作符 ... -
thinking in java 学习笔记2
2012-03-29 12:36 879我想了挺久,觉得还是需要写一下笔记,在java中, ...
相关推荐
这是我经过半年的认真研读《thinking in java》这本书的读书笔记,涉及到从容器一章开始的所有后续章节的内容,只有把握我笔记中的内容我想你就差不多弄懂了<thinking in java>这本书的精华
Thinking in Java 自学笔记——第二章 一切皆对象 个人原创,不喜勿喷。
本人在自学Thinking in Java这本书时所总结归纳的一些重点,希望能帮助大家更好地理解此书
这是我看Thinking in java 做的笔记,和大家分享下,如有不明白的的地方可与我私信,或者直接问度娘。
英文版Thinking in java Thinking in Java Fourth Edition Bruce Eckel President, MindView, Inc.
Thinking in Java 自学笔记——第一章 对象导论 个人原创,不喜勿喷。
Thinking in java第三版中文版,第四版英文版以及对应的习题答案! 博文链接:https://easonfans.iteye.com/blog/456901
Thinking in Java 4th Edition Annotated Solutions Guide!
Thinking in Java 4Edition 练习题答案
Thinking in java 电子书,经典java书籍
Thinking in Java(java编程思想) 第三版+第四版(完整中文版电子书+配套习题答案) 本资料包括四部分内容: 1、Thinking in Java 3th Edition.pdf为java编程思想第三版,是中文版,pdf格式,不是扫描版,非常清晰...
Thinking In Java学习之50问 Thinking In Java学习之50问 Thinking In Java学习之50问
thinking in java thinking in java thinking in java thinking in java thinking in java
thinking in java 文档
java ,thinking in java ,源码,thinking in java 第四版源码。。欢迎使用
王者归来之--Java编程思想读书笔记 Think in java4th
Thinking in Java 习题答案, 源代码
Thinking in java 中文版 学习Java必备教材
以绝对敏锐的眼光解析thinking in java,彻底让你理解本章!
thinking in java读书笔记,内容不多,但觉得精彩,不好您可以在评论里骂我。