java基础-异常处理、日志、File类、IO流

java基础-异常处理、日志、File类、IO流,第1张

java基础-异常处理、日志、File类、IO流

文章目录

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{
    	//合法时的处理代码}
    }
    
2 日志

日志:记录程序运行过程中的信息,并可以进行永久存储。

日志技术的优势:

    可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)可以随时以开关的形式控制是否记录日志,无需修改源代码

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 File

File类概述

    File类在包javaioFile下代表 *** 作系统的文件对象(文件、文件夹)。File类提供了诸如:定位文件,获取文件本身的信息、删除文件、创建文件(文件夹)等功能。

File类常用方法:

方法名称说明createNewFile()创建一个新的空文件mkdir()只能创建一级文件夹mkdirs()可以创建多级文件夹delete()删除由此抽象路径名表示的文件或文件夹(直接删除不走回收站,如果删除的是一个文件且文件没有被占用则直接删除;默认只能删除空文件夹) 4 IO流

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 *** 作元素

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5719232.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存