`
abcxo
  • 浏览: 33441 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

thinking in java 学习笔记 12 通过异常处理错误

阅读更多

 第十二章 通过异常处理错误

 

 

在以前平时的编程中没有真正意思到异常处理的强大,只从有一个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

 257人阅读 评论(0) 收藏 举报
[java] view plaincopy
  1. <pre class="java" name="code">1--在manifest添加:  
[java] view plaincopy
  1. <application android:icon="@drawable/icon" android:label="@string/login_title"  
  2.   android:theme="@style/skin"  
  3.   android:name="com.XXX.application.LauncherApplication"  
  4.   android:process="@string/process" >  
[java] view plaincopy
  1.    
[java] view plaincopy
  1. public class LauncherApplication extends Application {  
  2.     private Context context;  
  3.       
  4.     @Override  
  5.     public void onCreate () {  
  6.         super.onCreate();  
  7.   
  8.         AppExcepiton appException = AppExcepiton.getInstance();   
  9.           
  10.         appException.init(getApplicationContext());   
  11.   
  12.           
  13.   
  14. }  
2—
[java] view plaincopy
  1. public class AppExcepiton implements UncaughtExceptionHandler {  
  2.   
  3.     // 获取application 对象;  
  4.     private Context mContext;  
  5.   
  6.     private Thread.UncaughtExceptionHandler defaultExceptionHandler;  
  7.     // 单例声明CustomException;  
  8.     private static AppExcepiton appException;  
  9.   
  10.     private AppExcepiton() {  
  11.     }  
  12.   
  13.     public static AppExcepiton getInstance() {  
  14.         if (appException == null) {  
  15.             appException = new AppExcepiton();  
  16.         }  
  17.         return appException;  
  18.     }  
  19.   
  20.     @Override  
  21.     public void uncaughtException(Thread thread, Throwable exception) {  
  22.         // TODO Auto-generated method stub  
  23.         String path = null;  
  24.         if (defaultExceptionHandler != null) {  
  25.             String state = Environment.getExternalStorageState();  
  26.             // 判断SdCard是否存在并且是可用的  
  27.             if (Environment.MEDIA_MOUNTED.equals(state)) {  
  28.                 path = Environment.getExternalStorageDirectory().getPath();  
  29.             }  
  30.             // 创建一个logcat目录  
  31.             path = path + "/eIVS/log";  
  32.             File file = new File(path);  
  33.             if (!file.exists()) {  
  34.                 file.mkdir();  
  35.             }  
  36.             String time = getCurrentTime();  
  37.             String fileName = time.substring(09);  
  38.             File myFile = new File(path+"/"+fileName+".log");  
  39.             String str = "\n"+time+"-->"+"["+exception.getLocalizedMessage()+"]";  
  40.             try {  
  41.                 FileWriter fw = new FileWriter(myFile, true);  
  42.                 fw.write(str);  
  43.                 fw.flush();  
  44.                 fw.close();  
  45.             } catch (IOException e) {  
  46.                 // TODO Auto-generated catch block  
  47.                 e.printStackTrace();  
  48.             }  
  49.               
  50.             Log.e("tag""exception >>>>>>>" + exception.getLocalizedMessage());  
  51.             // 将异常抛出,则应用会弹出异常对话框.这里先注释掉  
  52.             // defaultExceptionHandler.uncaughtException(thread, exception);  
  53.   
  54.         }  
  55.     }  
  56.     /** 
  57.      * 获得当前时间 
  58.      * @return 
  59.      */  
  60.     public String getCurrentTime(){  
  61.         Time t = new Time();  
  62.         t.setToNow();  
  63.         int year = t.year;  
  64.         int month = t.month+1;  
  65.         int day =  t.monthDay;  
  66.         int hour = t.hour;  
  67.         int minute = t.minute;  
  68.         int second =  t.second;  
  69.         String time = year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second;  
  70.         return time;  
  71.           
  72.     }  
  73.     public void init(Context context) {  
  74.         mContext = context;  
  75.         defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();  
  76.         Thread.setDefaultUncaughtExceptionHandler(this);  
  77.     }  

3--在一个activity中模拟异常:
[java] view plaincopy
  1. public void onCreate(Bundle savedInstanceState) {  
  2.   super.onCreate(savedInstanceState);  
  3.   setContentView(R.layout.login);  
  4.   // 初始化资源信息  
  5.   throw new RuntimeException("--------");  
  6. //  init();  
  7.    
  8.  }  
[java] view plaincopy
  1. /** 
  2.   * 删除超过一年的日志 
  3.   * @param path 
  4.   */  
  5.  public void deleteOldFile(final String path){  
  6.   File file = new File(path);  
  7.   file.list(new FilenameFilter() {  
  8.      
  9.    @Override  
  10.    public boolean accept(File dir, String filename) {  
  11.     // TODO Auto-generated method stub  
  12.     File file = new File(path+"/"+filename);  
  13.     Long ago = file.lastModified();  
  14.     Long now = System.currentTimeMillis();  
  15.     //如果最后一次修改时间超过一年:3153600秒  
  16.     if((now-ago) > 31536000){  
  17.      file.delete();  
  18.     }  
  19.     return false;  
  20.    }  
  21.   });  
  22.     
  23.  }  
[java] view plaincopy
  1. //打印 有用信息 能够指出 错误代码的行数  
[java] view plaincopy
  1. <pre class="java" name="code">@Override  
  2.     public void uncaughtException(Thread thread, Throwable exception) {  
  3.         // TODO Auto-generated method stub  
  4.         StackTraceElement[] stack = exception.getCause().getStackTrace();    
  5.         String path = null;  
  6.         if (defaultExceptionHandler != null) {  
  7.             String state = Environment.getExternalStorageState();  
  8.             // 判断SdCard是否存在并且是可用的  
  9.             if (Environment.MEDIA_MOUNTED.equals(state)) {  
  10.                 path = Environment.getExternalStorageDirectory().getPath();  
  11.             }  
  12.             // 创建一个logcat目录  
  13.             path = path + "/eIVS/log";  
  14.             File file = new File(path);  
  15.             if (!file.exists()) {  
  16.                 file.mkdir();  
  17.             }  
  18.             //删除过期文件  
  19.             deleteOldFile(path);  
  20.             String time = getCurrentTime();  
  21.             String fileName = time.substring(09);  
  22.             File myFile = new File(path+"/"+fileName+".log");  
  23.              try {    
  24.                  String str = "\n"+time+"-->";  
  25.                  FileOutputStream fos = new FileOutputStream(myFile,true);  
  26.                  fos.write(str.getBytes());  
  27.                  for (int i = 0; i < stack.length; i++) {    
  28.                      fos.write(stack[i].toString().getBytes());    
  29.                  }    
  30.    
  31.                  fos.flush();    
  32.                  fos.close();    
  33.    
  34.                  } catch (Exception e) {    
  35.    
  36.              }  }  

 

 

.异常的限制

 

 

 

 

0
0
分享到:
评论

相关推荐

    王者归来之Thinking in java读书笔记

    《王者归来之Thinking in Java读书笔记》是对Bruce Eckel的经典之作《Thinking in Java》第四版的深度学习与总结。这本书是Java程序员的必备参考书,它深入浅出地阐述了Java语言的核心概念和技术,旨在帮助读者理解...

    Thinking in Java 自学笔记——第一章 对象导论

    Thinking in Java 自学笔记——第一章 对象导论 本章节总结了面向对象程序设计(Object-oriented Programming, OOP)的基本概念和原则,以帮助读者更好地理解 Java 编程语言。以下是对标题、描述、标签和部分内容的...

    thinking in java 读书笔记(五)

    《Thinking in Java》是Bruce Eckel的经典之作,它深入浅出地讲解了Java语言的核心概念和技术,对于初学者和有经验的开发者来说都是极好的学习资源。这篇读书笔记主要聚焦在第五部分的内容,可能涵盖了类、对象、...

    Thinking in java读书笔记.docx

    这些只是《Thinking in Java》中的一部分内容,全书还包括类、接口、多态性、异常处理、集合框架、并发编程等多个主题,是Java学习者的宝贵资源。理解和掌握这些基础知识是成为一名熟练Java程序员的关键步骤。

    中文版Thinking in Java 4th编程思想(笔记)

    《中文版Thinking in Java 4th编程思想》是学习Java编程的重要参考资料,它深入浅出地介绍了面向对象编程的核心概念。下面将详细解读其中的主要知识点。 1. **对象导论** - **万物皆对象**:Java编程的核心是对象...

    恒生电子JAVA笔试试题-Thinking-In-Java-Notes:ThinkinginJava学习笔记

    通过异常处理错误 字符串 类型信息 泛型 数组 容器深入研究 Java I/O系统 枚举类型 注解 并发 图形化用户界面 目标重点学习章节 5#初始化与清理 8#多态 9#接口 11#持有对象 14#类型信息 15#泛型 17#容器深入研究 18#...

    java离线文档系列.7z

    "java学习笔记.chm"可能是个人或集体在学习Java过程中的经验总结,包含了解决问题的技巧和实践案例,这将提供一个更实用的学习视角,帮助读者避免常见错误,提高学习效率。 "Java五百篇.chm"可能是一个包含500个...

    java编程思想笔记

    《Java编程思想笔记》是基于 Bruce Eckel 的经典著作 "Thinking in Java" 所做的学习总结,这本书深入浅出地介绍了Java语言的核心概念和技术。在本文中,我们将围绕Java编程的一些关键知识点进行深入探讨,包括但不...

    Thingking in java

    3. **异常处理**:学习如何使用try-catch-finally语句块来处理程序运行时可能出现的错误。 4. **集合框架**:包括ArrayList、LinkedList、HashSet、HashMap等数据结构的使用,以及接口和抽象类的概念。 5. **输入/...

    hsp 2021零基础学Java 【软件 资料 代码 笔记】

    5. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误,提高程序的健壮性。 6. **包**:包是Java的命名空间,用于组织类和接口,防止命名冲突,并提供访问控制。 7. **...

    study_ThinkinginJava_

    3. **异常处理**:Java的异常处理机制帮助程序在遇到错误时能优雅地处理,而不是直接崩溃。理解何时抛出异常,如何捕获并处理异常是编写健壮代码的关键。 4. **集合框架**:Java集合框架包括List、Set、Map等接口...

    Java Object-Oriented Programming.ppt

    9. **异常处理与线程**:第九周介绍异常处理,学习如何捕获和处理运行时错误。同时,会讲解多线程编程,理解并发执行的概念。 10. **Java I/O与网络编程**:第十周,学生将学习Java的输入/输出流系统,以及如何进行...

    thinkinjava源码-ThinkingInJava:《Java编程思想4th》学习笔记Notesandsourcecodesaboutt

    7. **异常处理**:Java的异常处理机制使用try-catch-finally语句块来捕获和处理运行时错误,确保程序的健壮性。 8. **集合框架**:Java集合框架包括List、Set、Queue和Map等接口及其实现,如ArrayList、LinkedList...

    LearningProcessForJava:Java的学习过程

    3. **异常处理**:学习如何捕获和处理程序运行时可能出现的错误。 4. **数组与集合框架**:掌握不同类型的数组,以及ArrayList、LinkedList、HashMap等集合类的使用。 5. **IO流**:理解输入输出操作,包括文件读写...

    学习c++的50条忠告(初学者必看)

    - 推荐学习《Thinking in C++》,这本书对于理解面向对象编程非常有帮助。 - **建议**:同时参考《The C++ Programming Language》和《Inside The C++ Object Model》,这两本书对深入理解C++标准库和对象模型非常...

    前辈的c++50个建议

    掌握好异常处理机制,可以在程序出现错误时及时恢复状态。 ### 37. 定期回顾自己写的代码 定期审视自己过去的代码,看看是否有改进的空间。这样可以帮助你不断提高代码质量。 ### 38. 学习时要有系统规划 制定...

    给C++初学者的忠告

    通过阅读《Thinking in C++》加深理解 - **解释**:这本书是C++学习的经典教材之一,能够帮助读者建立面向对象的思维方式,深入理解C++的核心概念。 - **建议**:利用这本书来系统地学习C++的基础知识,并通过书中...

Global site tag (gtag.js) - Google Analytics