1. 异常分类与体系结构
Java异常以Throwable为基类,分为Error和Exception两大分支:
Error:表示程序无法处理的严重系统级错误(如OutOfMemoryError),通常由JVM抛出,无法通过代码修复。
Exception:程序可处理的异常,进一步分为:
检查型异常(Checked Exception):编译时必须处理(如IOException),否则无法通过编译。
运行时异常(Unchecked Exception):由程序逻辑错误引起(如NullPointerException),编译时可不处理。
2. 异常处理机制
核心关键字:try-catch-finally用于捕获和处理异常;throw主动抛出异常;throws声明方法可能抛出的异常类型。
执行流程:
try监控代码块,异常发生时JVM创建异常对象并跳转至匹配的catch块。
finally块无论是否发生异常都会执行,常用于资源释放(如关闭文件流)。
底层原理:JVM通过异常处理表(Exception Table)记录try-catch范围,异常发生时按类型匹配处理逻辑。
3. 实践
精准捕获:避免笼统捕获Exception,优先按具体异常类型分多个catch块处理。
资源管理:使用try-with-resources(Java 7+)或finally确保资源释放,避免内存泄漏。
异常信息处理:避免空catch块,记录异常日志(e.printStackTrace()或日志框架)并考虑用户友好提示。
4. 自定义异常
创建方式:继承Exception(检查型)或RuntimeException(非检查型),添加带参构造器传递异常信息。
应用场景:封装业务逻辑错误(如登录失败InvalidCredentialsException),增强代码可读性和错误定位能力。
5. IO流分类
按方向:
输入流:从外部读取数据(InputStream、Reader)。
输出流:向外部写入数据(OutputStream、Writer)。
按数据类型:
字节流:处理二进制数据(如图片、视频),核心类为InputStream/OutputStream。
字符流:处理文本数据(如日志文件),核心类为Reader/Writer,支持字符编码转换。
2. 常用类与使用场景
字节流:
FileInputStream/FileOutputStream:文件读写。
BufferedInputStream/BufferedOutputStream:通过缓冲区提升读写效率。
字符流:
FileReader/FileWriter:文本文件读写。
BufferedReader/BufferedWriter:支持按行读写(readLine()方法)。
转换流:InputStreamReader(字节→字符输入)、OutputStreamWriter(字符→字节输出),解决编码问题。
3. 高级流与缓冲区机制
缓冲区作用:减少直接IO操作次数,提升性能(默认缓冲区大小通常为8KB)。
其他高级流:
数据流:DataInputStream/DataOutputStream处理基本数据类型序列化。
对象流:ObjectInputStream/ObjectOutputStream实现对象序列化(需实现Serializable接口)。
打印流:PrintStream/PrintWriter提供格式化输出功能(如System.out)。
4. IO实践
资源关闭:使用try-with-resources自动管理资源,避免手动关闭遗漏。
性能优化:优先使用缓冲流处理大文件;字符流处理文本时指定统一编码(如UTF-8)。
异常处理:IO操作需捕获IOException,并在读写失败时提供回退机制(如重试或备份)。