Java 异常、断言和日志
一.处理错误 :
1. ①用户输入错误 ②设备错误 ③物理限制 ④代码错误 这几类错误
1.1 异常分类 由程序错误导致的异常属于RuntimeException; 程序本身没问题,但由于像I/O错误这类问题导致的异常属于其他异常;
RuntimeException异常包含几种情况(①错误的类型转换 ②数组访问越界 ③访问null指针)异常检测:
检测数组下标是否越界来避免ArrayIndexOutOfBoundsException 异常
通过在使用变量之前检测是否为null来杜绝NullPointerException 异常
1.2 声明受查异常 遇到下面4种情况应该抛出(throw)异常
1)调用一个抛出受查异常的方法,例如,FileInputStream 构造器
2)程序运行过程发现错误,并且利用 throw 语句抛出一个受查异常
3)程序出现错误,例如,a[-1]=0会抛出一个 ArrayIndexOutOfBoundsException 这样的非受查异常。
4)Java虚拟机和运行时库出现的内部错误
对于可能被他人使用的Java方法,应该在方法的首部声明这个方法可能抛出的异常
class MyAnimation{ public Image loadImage(String s) throw IOException} 注意,不需要声明从Error继承的错误,也不应该声明从RuntimeException 继承的那些非受查异常。
1.3 如何抛出异常
在异常的类已经存在时,抛出异常的步骤:①找到一个合适的异常类 ②创建这个类的一个对象 ③将对象抛出
{throw new EOFException();}或{EOFException e = new EOFException(); throw e;} 设抛出 EOFException 异常。
1.4创建异常类
创建自己的异常类,首先定义一个派生于Exception的类,或者派生 Exception 子类的类,定义的类应该包含两个构造器,一个是默认的构造器,另一个是带有详细描述信息的构造器。
二.捕获异常
2.1 捕获异常
要想捕获一个异常,必须设置try/catch 语句块
try { code more code } catch (ExceptionType e) { handler for this type }
捕获那些知道如何处理的异常,将不知道怎么处理的异常继续传递
2.2 捕获多个异常
在一个 try 语句块可以捕获多个异常类型,实现方式:为每个异常类型使用一个单独的catch子句
2.3 再次抛出异常与异常链
在catch(){ }捕获了异常后再次抛出异常 如ServletException ,throw new ServletException("database error:" + e.getMessage());
2.4 finally 字句
finally子句可以恰当地关闭一个文件,解耦合ry/catch和try/finally语句块,不论有无抛出异常,异常是否被catch捕获或不是被catch捕获。
2.5 带资源的try语句
try(Scanner in = new Scanner(new FileInputStream("/usr/share/dict/words","UTF-8")) { while (in.hasNext()) System.out.println(in.next()); }
这个块正常退出,或者出现一个异常时,都会调用in.close(),就好像使用了finally块一样。
2.6 分析堆栈轨迹元素
当Java程序正常终止,而没有捕获异常时,这个列表就会显示出来。可以调用Throwable 类的printStackTrace 方法访问堆栈轨迹的文本描述信息,或者使用更灵活的getStackTrace方法
三.使用异常机制的技巧
①异常处理不能代替简单的测试:只在异常情况下使用异常机制。
②不要过分地细化异常:将整个任务包装在try语句块中,当任何一个操作出现问题时,整个任务都可以取消。
③利用异常层次结构:不要为逻辑错误抛出这些已检查异常,同时要将捕获的异常转换为另一种更加适合的异常。
④不要压制异常:对于需要通告异常的方法,我们可以改用捕捉的方法将其强行关闭,出现异常时,将会无提示地忽略这个异常,如果觉得这个异常很重要,应该对其进行正确的控制。
四.使用断言
4.1 断言的概念
断言机制允许在测试期间向代码中插入一些检查语句。当代码发布时,这些插入的检测语句将会被自动地移走。
Java中引入关键字assert。两种形态:①assert 条件; ②assert 条件:表达式;
如果结果为false,则抛出一个AssertionError异常,第二种形式中,表达式会传入AssertionError构造器,并转换成一个消息字符串。
4.2 启用和禁用断言
默认情况下断言被禁用,可以在运行程序时用-enableassertions 或 -ea 选项启用: java enableassertions MyApp
4.3 使用断言完成参数检查
①断言失败会导致程序中止,对程序来说是致命的 ②断言检察官只用于开发个测试阶段
五.记录日志 commons-logging 和 Log4j 略
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战