欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

第四周总结

程序员文章站 2022-03-23 22:19:40
第四周总结异常和错误​java中对于程序出现的异常情况分为两类:​1.错误​2.异常​Error:错误是系统级别的问题,比如JVM内存溢出,JVM系统错误等,这些问题是程序员无法修复的问题,程序运行时出现的是无法被程序员从业务上解决的问题,这些问题是系统级别的。错误不是我们关注的范畴。​Exception:异常通常是程序在运行期间,或者编译期间由编译器抛出的一些可以被程序员处理的代码上的问题,比如空指针异常,数组索引越界等等。ThrowableThroeable是java中错误和异...

第四周总结

异常和错误

​ java中对于程序出现的异常情况分为两类:

​ 1.错误

​ 2.异常

​ Error:错误是系统级别的问题,比如JVM内存溢出,JVM系统错误等,这些问题是程序员无法修复的问题,程序运行时出现的是无法被程序员从业务上解决的问题,这些问题是系统级别的。错误不是我们关注的范畴。

​ Exception:异常通常是程序在运行期间,或者编译期间由编译器抛出的一些可以被程序员处理的代码上的问题,比如空指针异常,数组索引越界等等。

Throwable

Throeable是java中错误和异常的*父类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WFrcG3tt-1606032064612)(E:\Java学习\Java学习\20201117\笔记\assets\1605575692122.png)]

java中所有的错误从Error类继承,并且绝大多数类名称后缀以Error结尾

java中所有的异常从Exception类继承,都是以Exception作为后缀结尾

异常概述

Exception:异常,一般在程序运行期间,或者编译期间由编译器抛出的异常信息,这些异常可以进行抛出或者捕获处理,java中异常分为两种类型:

  • 运行时异常(RuntimeException)
  • 检查异常(一般异常)

运行时异常

​ 运行时异常一般在程序运行期间,出现了对应异常情况之后由JVM抛出,并且将异常的堆栈信息输出到控制台(或日志文件),java中的所有运行时异常都是从java.lang.RuntimeException继承而来。常见的运行时异常:

异常类型 说明
java.lang.ArithmeticException 算术异常(比如被零除)
java.lang.NullPointerException 空指针异常(调用方法,属性的对象为null时)
java.lang.ArrayIndexOutOfBoundsException 数组索引越界
java.lang.ClassCastException 类型转换异常
java.util.InputMismatchException 输入的数据类型不匹配读取的类型

运行时异常是程序运行时才会产生的异常

检查异常

​ 检查异常也称之为一般异常,或者编译期异常,这种类型异常通常在编译期间由编译器提示需要进行显式的处理:

异常类型 说明
java.lang.ClassNotFoundException 类未找到异常
java.io.FileNotFoundException 文件未找到异常
java.io.IOException IO异常(输入输出异常)
java.sql.SQLException 访问数据库的异常
java.text.ParseException 解析异常

检查异常是在程序编译时产生的

异常处理

分为两类:

  1. 异常抛出(throw/throws)

  2. 异常捕获(try/catch/finally)

    java程序中一旦出现异常,则出现异常问题的所在代码行之后的代码无法执行

异常抛出

​ 异常抛出指的是将有可能出现的异常通过方法的结构向外抛出,交给下一级的调用者处理

​ 抛出异常常见的关键字:

  • throws:用于方法的声明中,抛出有可能出现的异常

    【修饰符】 返回值类型 方法名(【参数列表】) throws 异常类型名称{
    ​ //方法体
    }

  • throw:用于语句块中,抛出指定异常类型的异常对象,throw一旦执行,则一定会出现该类型异常

    方法体{
    ​ throw 异常类型对象
    }

对于存在继承关系的异常抛出问题

​ 子类对父类的方法进行重写,子类中重写父类方法中如果有异常处理,则解决方法有两种:

  • 子类方法对异常捕获
  • 在父类方法的声明上加上对应的异常类型抛出定义:父类可以抛出比子类方法抛出的范围更大的异常

父类方法未抛出任何异常情况下,子类只能抛出运行时异常

游离块和静态语句块不能抛出任何异常,以为外界无法直接调用这两种语句块

异常捕获

​ 异常的捕获即有可能出现异常的代码片段使用try语句块进行包裹,然后catch语句块将有可能产生的异常类型进行捕获,并做出处理

​ 语法结构:

try {
    //	有可能出现异常的代码片段
} catch(异常类型 变量名) {
    //	异常处理
} finally {
    //	不论是否出现异常,始终执行
}

程序执行到try语句块,在执行期间如果出现了对应catch的异常类型,则直接进入catch语句块,如果catch语句块中没有合适的异常解决方案,则由JVM进行统一处理(打印异常的堆栈信息)

关于异常的常见面试题:

  1. 请说出final、finalize和finally的区别?

    final 是一个关键字,用于修饰类,属性和方法

    funalize是Object类中提供的一个方法,用于在jvm对对象清理时,对于当前对象执行一些最终的处理工作的。

    finally是异常中的语句块

  2. java中是否存在内存溢出的问题?

    理论上java不会存在内存溢出的问题,因为jvm提供了GC(垃圾回收:garbage collection)机制,会在适当的时候自动回收内存空间,不需要由程序员手动处理;但是如果使用第三方资源(比如:打开一个文件,打开了网络通道,打开数据库连接等)并且未及时的清理以及回收,将会导致内存泄漏。

  3. 异常处理中funally和return综合使用?

    如果try语句块中有使用return,并且try语句块中没有任何异常时,程序首先会执行finally然后再执行return;但是对于基本类型的数据,finally的赋值是不会生效的,但是finally中操作引用类型的属性可以生效

自定义异常

​ 针对以上的需求,当预定的异常无法满足所有需要时,我们可以通过对JDK的异常进行扩展,自定义异常,以满足实际项目的需求。

自定义异常的使用

​ java中创建自定义异常只需要对现有的异常类型,扩展即可,比如常见的方式为:继承Exception,声明一个无参的以及一个包含字符串类型参数的构造器即可。异常的定义通常用于标记程序运行时的异常情况,并不需要在异常中进行任何的业务逻辑处理,因此自定义异常中也无需定义任何的方法。

案例:

public class MyException extends Exception{

	public MyException() {
		super();
	}
	
	public MyException(String msg) {
		super(msg);
	}
}

常用类之BigDecimal与DecimalFormat

BigDecimal

​ java.math.BigDecimal类从java.math.Number类继承而来,用于表示精度较高的数值的封装类型,一般用于精度要求较高的程序中。

常用方法:

  • add(BigDecimal b):与另一个BigDecimal类型数据相加

  • subtract(BigDecimal b):与另一个BigDecimal执行相减运算

  • multiply(BigDecimal b):与另一个BigDecimal执行相乘运算

  • divide(BigDecimal b):与另一个BigDecimal执行相除运算

    相除运算注意事项:

    • 当两个数值相除为无限循环数时会出现算术异常,需要进行特殊处理,向上取整或者向下取整等等

NumberFormat & DecimalFormat

​ 两者都是用于进行数值格式化的类,可以对数值的显示位数进行格式化处理,以及对浮点数进行金额或百分比的格式表现;DecimalFormat是NumberFormat的子类。

​ java.text.NumberFormat是一个抽象类,内部提供了几个静态方法用于直接获取NumberFormat对象,而这些静态方法的实现通过java.text.DecimalFormat实现

NumberFormat常见方法:

  • format(double d) :将一个double值按照指定的格式转换为String

  • parse(String s):将一个String类型的数值解析为double类型

    //获取用于进行货币格式化(本地环境)的数值格式化对象
    NumberFormat fmt = NumberFormat.getCurrencyInstance();
    

​ 由于NumberFormat提供的方法可能无法满足一些个性化的格式需求,比如需要将double值转换为百分比,并保留小数点后两位,NumberFormat中提供的格式化方法getPersentInstence()只能保留整数位;因此,我们需要能够自定格式的工具,所以java中提供的java.text.DecimalFormat就能够满足需求了:

//创建一个数值格式化对象
DecimalFormat fmt = new DecimalFormat("##.##%");

常用类

Object类

​ Object类是所有java类的顶层父类(祖宗类),但是Objects是从java7开始新增的一个对于java对象进行空指针安全操作的工具类

  • Objects类是一个工具类
  • Objects对外不提供构造器,因此无法创建对象
  • Objects类中的所有方法都是static
  • 提供的是对于对象的空指针安全操作的方法

Random类

​ Math类中提供了一个random()的方法,用于随机一个从0.0~1.0之间的浮点数。

构造器:

  • Random()

常见方法:

  • nextBoolean():随机一个布尔值
  • nextDouble():随机一个0.0~1.0之间的double值
  • nextInt():随机一个int范围内的整数值
  • nextInt(int bounds):随机一个从0~bounds-1位的整数值

File类

​ File类是来自于java.io包中的一个用于处理本机操作系统中的文件,文件可以是目录也可以是一个标准文件;File类是用于在Java中实现跟本机文件系统进行关联的操作类。其中包含一些常见的文件操作:创建文件/目录,查看文件的状态,删除文件等。

构造器

File(File parent, String child)使用父目录所表示的File对象,结合子文件名构建新的File对象
File(String pathname)` 根据提供的文件路径构建一个File对象

常用方法

  • createNewFile() 创建新文件(标准文件)
  • exists() 判断File对象是否存在
  • delete() 删除File对象所表示的文件或者目录(空目录)
  • deleteOnExit() 当JVM结束时删除
  • getName() 获取File对象所表示的文件名称
  • getParent() 获取File所指的文件或者目录的父路径
  • isFile() 判断当前File所指的是否是标准文件
  • isDirectory() 判断当前File所指的是否是目录
  • isHidden() 判断当前File对象是否是隐藏目录
  • lastModified() 获取最后修改时间
  • length() 获取File所表示文件大小(目录为4096)
  • list() 获取File所表示目录下所有子文件的名称数组
  • listFiles() 获取File对象所表示目录下的所有子File数组
  • listFiles(FileFilter filter) 通过文件过滤器将File所表示目录中符合条件的File对象过滤出来
  • listRoots() 获取当前电脑可用的磁盘根
  • mkdir() 创建当前File所表示的目录(一级)
  • mkdirs() 创建当前File所表示的目录(多级)
  • renameTo(File file) 重命名文件
/**
	 * 	读取指定目录中的所有子文件
	 * @param dir	原目录
	 */
	public static void readDir(File dir) {
		//	获取目录下所有的文件对象(数组)
		File[] files = dir.listFiles();
		//	判断数组对象是否为null
		if (Objects.nonNull(files)) {
			//	遍历所有的File对象
			for (File file : files) {
				//	如果是目录,则递归遍历
				if (file.isDirectory()) {
					readDir(file);
				} else {
					System.out.println(file.getName());
				}
			}
		}
		
	}
	
	public static void main(String[] args) {
		//	原目录
		File dir = new File("D:\\下载");
		//	读取
		readDir(dir);
		
	}

常用类(日期类&正则表达式)

日期处理类

java中提供了丰富用于日期时间处理的工具类:

  • java.util.Date(jdk1.0)
  • java.util.Calendar(jdk1.1)
  • java.time.LocalDate(jdk8)
  • java.time.LocalTime(jdk8)
  • java.time.LocalDateTime(jdk8)

Date类

java.util.Date是一个传统的java用于处理日期时间的类,由于版本更新,内部有很多构造器包括方法均已标记为过时,取而代之的是java.util.Calendar类;

常用构造器

  • Date():获取当前系统时间所表示的日期对象
  • Date(long time):根据提供的时间毫秒数,构建一个日期对象(从1970年1月1日 00:00:00开始)

常用方法

  • after(Date d)
  • before(Date d)
  • compareTo(Date d)
  • getTime()

日期格式化(DateFormat & SimpleDateFormat)

DateFormat类来自java.text包下的用于进行日期时间格式化处理的类,是一个抽象类,内部提供了一系列用于获取格式化对象的静态方法:

  • getDateInstance()
  • getTimeInstance()
  • getDateTimeInstance()
  • getInstance()

SimpleDateFormat

​ DateFormat中提供的静态方法可以用户获取各种丰富的格式化对象,但是针对一些需求DateFormat并不能完全满足

​ DateFormat中getInstance()源码得知,内部使用了一个子类SimpleDateFormat实现,SimpleDateFormat可以通过定制化的匹配模式来匹配不同的日期时间输出格式:

Calendar

从JDK1.1开始java.util.Date中的很多方法和构造器标记为过时,同时jdk新增了对应的替代方案:java.util.Calendar,是一个抽象类,有一个直接子类:java.util.GregorianCalendar对其继承,并且实现其中的抽象方法,常见的Calendar实例获取方式为直接使用内部提供的静态方法getInstance()

具体使用如下:

//以当前系统时间为基础获取日历实例  +8
Calendar c = Calendar.getInstance();		
System.out.println(c);

正则表达式

正则表达式( Regular expression)是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子。正则表达式最早源自于perl语言(脚本语言);正则表达式的功能十分强大,可以用于进行文本的匹配,检索,替换;常见于一些网络爬虫。

java中对于正则表达式的处理主要由一下三个类实现:

  • java.lang.String
  • java.util.regex.Pattern
  • java.util.regex.Macher

匹配元字符

元字符 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

匹配长度

语法 说明
* 重复零次或更多次
+ 重复一次或更多次
重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

Pattern&Matcher

String content = "adfasdffdiu1353457839417812341023u901223423418712312317823sdfsd";
//手机号正则表达式
String regex = "1\\d{10}"; 
//编译正则表达式获取匹配模式对象
Pattern p = Pattern.compile(regex);
//对指定的输入内容进行匹配并且获取匹配器
Matcher m = p.matcher(content);
//直接匹配
//System.out.println(m.matches());
//搜索是否存在匹配的组
while(m.find()) {	
    //取出当前匹配到的组
    String s = m.group();
    System.out.println(s);
}

本文地址:https://blog.csdn.net/qq_43572321/article/details/109955946