1 异常处理
1.1 编译异常处理方式1.2 运行时异常处理方式1.3 自定义异常类 2 日志3 File4 IO流
1 异常处理异常:是程序在编译或执行的过程中可能出现的问题,注意: 语法错误不算在异常体系中。
比如:数组索引越界、空指针异常、日期格式化异常等
异常体系Throwable:
Error:系统级别问题、JVM退出等,代码无法控制
Exception:
RuntimeException及其子类:运行时异常,编译阶段不会报错,一般是程序员业务没有考虑好或编程逻辑不严谨引起的程序错误
除RuntimeException之外所有的异常:编译时异常,编译器必须处理的,目的在于提醒不要出错,如日期格式化异常
运行时异常示例:
- 数组索引越界空指针数学 *** 作 如除数不能为0类型转换 如不能将int类型转换为string类型数字转换:如要把字符串转换为数值,但字符串里面内容为“123a";
异常默认处理:
①默认会在出现异常的代码那里自动的创建一个异常对象
② 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
③虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
④直接从当前执行的异常点干掉当前程序。
⑤后续代码没有机会执行了,因为程序已经死亡。
默认处理机制并不好,因为程序会直接死亡
1.1 编译异常处理方式异常处理方式1–throws
用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理;
这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
规范格式:方法 throws Exception{}
异常处理方式2–try…catch
监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
这种方式还可以,发生异常的方法自己独立完成异常的处理,异常可以往下继续执行。(但方法调用者并不知道底层方法出现了什么问题
try{ //可能出现异常的代码 }catch(Exception e){ e.printStackTrace();//直接打印异常栈信息 } Exception可以捕获一切异常类型
异常处理方式3–前两者结合
异常抛出去给方法调用者
调用者收到异常后直接捕获处理
在开发中按照规范来说,第三种方式是最好的:底层的异常抛出去给最外层,最外层集中处理;实际应用中,只要代码能编译通过,并且功能完成,每一种异常处理方式似乎也是可以的。
1.2 运行时异常处理方式可以不处理,编译阶段不报错;但建议还是处理,只需要在最外层捕获处理即可,不需要方法抛出throws异常
1.3 自定义异常类java无法为这个世界上全部的问题提供异常类,那就需要自定义异常类;
好处:可以使用异常的机制管理业务问题,如提醒程序员注意;同时一旦出现bug,可以用异常的形式清晰指出出错的地方。
自定义异常的分类:
自定义编译时异常
定义一个异常类继承Exception
重写构造器
在出现异常的地方throws new 自定义对象抛出
假设自定义异常类为DefineException 前提:年龄不能小于0 checkage(int age) throws DefineException{ if(age < 0) throws new DefineException("年龄不合法"); }else{ //合法时的处理代码} }
自定义运行时异常
定义一个异常类继承RuntimeException
重写构造器
在出现异常的地方throws new 自定义对象抛出
假设自定义异常类为DefineRuntimeException 前提:年龄不能小于0 checkage(int age){ if(age < 0) throws new DefineException("年龄不合法"); }else{ //合法时的处理代码} }
日志:记录程序运行过程中的信息,并可以进行永久存储。
日志技术的优势:
- 可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)可以随时以开关的形式控制是否记录日志,无需修改源代码
Logback主要分为三个技术模块:
- logback-core:logback-core模块为其他两个模块奠定了基础,必须有。logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4jAPI。logback-access模块与Tomcat和Jetty等Servlet容器集成,以提供HTTP访问日志功能。
Logback开发步骤:
①在项目下新建文件夹lib,导入Logback的相关jar包到该文件夹下,并添加到项目库中去。
②必须将Logback的核心配置文件logback.xml直接拷贝到src目录下。
③在代码中获取日志的对象
④使用日志对象输出日志信息
其中logback.xml 配置输出位置(控制台、系统文件)、限制输出哪些日志级别等信息;
日志级别:TRACE < DEBUG < INFO < WARN < ERROR
3 FileFile类概述
- File类在包javaioFile下代表 *** 作系统的文件对象(文件、文件夹)。File类提供了诸如:定位文件,获取文件本身的信息、删除文件、创建文件(文件夹)等功能。
File类常用方法:
IO流概述: I 表示input,就是数据从硬盘文件读入到内存的过程,称之输入,负责读;O 表示output,是内存程序的数据从内存到写出到硬盘文件的过程,称之输出,负责写。
文件字节输入输出流 FileInputStream、FileOutputStream,常用读取api :read(),读取一个字节/字节数组,写:write(); 关闭流 close();
根据数据源创建字节输入流对象;根据目的地创建字节输出流对象。
资源释放方式:
1、try - catch - finally
finally代码块最终一定要执行的,可以在代码执行完毕的最后用于释放资源。
2、try - catch - resource
最终自动释放资源
文件字符输入流Reader
作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中。读中文字符不会出现乱码
文件字符输出流Writer与文件字符输入流Reader相似。
Buffer 缓冲流概述
作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能。
转换流
字符输入转换流:InputStreamReader ,可以把原始的字节流按照指定的编码转换成字符输入流。解决字符流不同编码编码乱码问题。
字符输出转换流:OutputStreamWriter,把原始的字节输出流转换为字符输出流
对象序列化
含义:把对象数据存入到文件中去。
作用:以内存为基准,把内存中的对象存储到磁盘文件中,称为对象序列化。使用到的流是对象字节输出流:ObjectOutputStream。
对象如果要序列化,必须要实现Serializable序列化接口
对象反序列化
含义:把磁盘中的对象数据恢复到内存的java对象中
作用:以内存为基准,把存储到硬盘文件中的对象数据恢复成内存中的对象,称为对象反序列化。使用到的流是对象字节输入流:ObjectInputStream。
serialVersionUID序列化的版本号必须与反序列化的版本号一致才不会出错。
打印流PrintStream、PrintWriter
作用:打印流可以实现方便、高效的打印数据到文件中去。
可以实现打印什么数据就是什么数据,打印Boolean的true写出去就是true。
PrintStream继承OutputStream,支持写字节;PrintWriter继承Writer,支持写字符。
System.out.println();实际上就是调用了打印流。
可以通过 System.setOut(创建打印流对象名称);把系统打印流改成我们自己的打印流。
补充:IO框架 commons-io
是apache开源基金组织提供的一组有关IO *** 作的类库,可以提高IO功能开发的效率;提供了很多有关io *** 作的类。
Stream流
作用:结合Lambda表达式,简化数组、集合的API *** 作
集合和数组供有API:stream() - > 转化为Stream流。
Stream流式思想的核心:
1、先得到集合或者数组的Stream流(就是一根传送带)
2、把元素放上去
3、用这个Stream流简化的API *** 作元素
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)