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

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

2011-07-15 14:35 257人阅读 评论(0) 收藏 举报

[java] view plaincopy

1--在manifest添加:

[java] view plaincopy

android:theme="@style/skin"

android:name="com.XXX.application.LauncherApplication"

android:process="@string/process">

[java] view plaincopy

[java] view plaincopy

publicclassLauncherApplicationextendsApplication {

privateContext context;

@Override

publicvoidonCreate () {

super.onCreate();

AppExcepiton appException = AppExcepiton.getInstance();

appException.init(getApplicationContext());

}

2—

[java] view plaincopy

publicclassAppExcepitonimplementsUncaughtExceptionHandler {

// 获取application 对象;

privateContext mContext;

privateThread.UncaughtExceptionHandler defaultExceptionHandler;

// 单例声明CustomException;

privatestaticAppExcepiton appException;

privateAppExcepiton() {

}

publicstaticAppExcepiton getInstance() {

if(appException ==null) {

appException = newAppExcepiton();

}

returnappException;

}

@Override

publicvoiduncaughtException(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 = newFile(path);

if(!file.exists()) {

file.mkdir();

}

String time = getCurrentTime();

String fileName = time.substring(0,9);

File myFile = newFile(path+"/"+fileName+".log");

String str = "\n"+time+"-->"+"["+exception.getLocalizedMessage()+"]";

try{

FileWriter fw = newFileWriter(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

*/

publicString getCurrentTime(){

Time t = newTime();

t.setToNow();

intyear = t.year;

intmonth = t.month+1;

intday =  t.monthDay;

inthour = t.hour;

intminute = t.minute;

intsecond =  t.second;

String time = year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second;

returntime;

}

publicvoidinit(Context context) {

mContext = context;

defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();

Thread.setDefaultUncaughtExceptionHandler(this);

}

3--在一个activity中模拟异常:

[java] view plaincopy

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.login);

// 初始化资源信息

thrownewRuntimeException("--------");

//  init();

}

[java] view plaincopy

/**

* 删除超过一年的日志

* @param path

*/

publicvoiddeleteOldFile(finalString path){

File file = newFile(path);

file.list(newFilenameFilter() {

@Override

publicbooleanaccept(File dir, String filename) {

// TODO Auto-generated method stub

File file = newFile(path+"/"+filename);

Long ago = file.lastModified();

Long now = System.currentTimeMillis();

//如果最后一次修改时间超过一年:3153600秒

if((now-ago) >31536000){

file.delete();

}

returnfalse;

}

});

}

[java] view plaincopy

//打印 有用信息 能够指出 错误代码的行数

[java] view plaincopy

@Override

publicvoiduncaughtException(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 = newFile(path);

if(!file.exists()) {

file.mkdir();

}

//删除过期文件

deleteOldFile(path);

String time = getCurrentTime();

String fileName = time.substring(0,9);

File myFile = newFile(path+"/"+fileName+".log");

try{

String str = "\n"+time+"-->";

FileOutputStream fos = newFileOutputStream(myFile,true);

fos.write(str.getBytes());

for(inti =0; i

fos.write(stack[i].toString().getBytes());

}

fos.flush();

fos.close();

} catch(Exception e) {

}  }

.异常的限制

java异常错误的是,java 异常 错误处理相关推荐

  1. Effective Java之对可恢复的情况使用受检异常,对编程错误使用运行时异常(五十八)

    java将所有的错误封装为一个对象,其根本父类为Throwable, Throwable有两个子类:Error和Exception. 异常分成三种结构 1.错误:Error是Throwable 的子类 ...

  2. java jsp公共异常页面_Java如何创建JSP错误页面以处理异常?

    在此示例中,您将学习如何在JSP页面中处理异常.JSP具有用于错误处理的内置机制,这是一个特殊页面,可用于处理Web应用程序中的每个错误.要将页面定义为错误页面,我们使用page指令,isErrorP ...

  3. java异常(机制和捕捉(常见异常类))详解 +练习题

    Java 中的异常处理机制 1.什么是异常 异常:程序在运行过程中产生的不正常情况. 程序在运行的时候,发生了一些不被预期的事件,从而没有按照我们编写的代码执行,这就是异常. 异常是Java中的错误, ...

  4. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  5. java 异常 理解_java中的异常理解

    java异常是java提供的用于处理程序中错误的一种机制. 所谓错误是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在). 设计良好地程序应该在程序异常发生时提 ...

  6. java try catch嵌套_解析Java中未被捕获的异常以及try语句的嵌套使用

    Java未被捕获的异常 在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式. class Exc0 { public st ...

  7. 启动一个java项目http状态 500 - 内部服务器错误_Java web服务器假死分析

    问题现象: 服务端端口开着,客户端可以telnet 服务器上的端口,但访问服务时没有任何返回. 服务器环境 :Java 8 + linux CentOS release 6.5. 用apache ab ...

  8. Java 程序员排行前 10 的错误,你有没有中?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 风一样的码农 来源| cnblogs.com/ ...

  9. java基础之Object类和异常

    Object类和异常 1. Object类是所有类的父类(超类, 基类,上帝类); 里面有两个常用的方法: 1> public String toString();// 默认输出对象的地址值的字 ...

最新文章

  1. 自动驾驶汽车视觉- 图像特征提取与匹配技术
  2. 通过源码分析Android 的消息处理机制
  3. mysql zip 安装 启动_window的zip版mysql安装启动
  4. js正则相关知识点专题
  5. 2.42死锁的处理策略一预防死锁
  6. 基于城市交通监控大数据的行程时间估计
  7. Python 列表(List)
  8. 【图像处理基础知识(python+openCV)】——目标检测
  9. 我和2035年有个约计算机论文,我和2035有个约
  10. JAXB处理java对象与xml格式之间的转换
  11. 高度固定 宽度裁剪_ffmpeg 视频裁剪
  12. 肖维勒准则matlab_肖维勒准则.PPT
  13. python毕业设计作品基于django框架 教室图书馆座位预约系统毕设成品(7)中期检查报告
  14. caffe框架学习(layer)
  15. qq飞车找不到服务器了,QQ飞车体验服务器专区
  16. Android进阶之路 - 毛玻璃遮罩层
  17. 一年有50万主播入驻淘宝,宇宙的尽头是编制,直播的尽头是淘宝?
  18. 二叉树前序遍历、中序遍历、后序遍历、层序遍历的直观理解
  19. H5 页面适配所有 iPhone 和安卓机型的六个技巧
  20. 打一个人电话显示无法接通服务器,为什么给别人打电话一直是暂时无法接通是什么意思...

热门文章

  1. viewer 获取当前显示的图片信息_通过这个 Runtime 统计信息可视化库学到了什么?...
  2. Linux LVM管理
  3. ecs mysql 安装_CentOS8 安装MySQL8(ECS系列二)
  4. mysql数据库字段字符转数字批量语句_MySQL数据库批量替换指定字段字符串SQL语句命令...
  5. mysql5.7.29下载与安装并设置密码
  6. SpringBoot配置文件映射到JavaBean
  7. Android开发笔记(一百七十六)借助FileProvider发送彩信
  8. Android开发笔记(五十四)数据共享接口ContentProvider
  9. ubuntu python3.7修改默认pip版本_详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本 安装python3后使用pip和pip3的区别...
  10. 推荐常用的小程序Ui框架