JAVA第四周

异常

  • 错误(Error)
    错误一般是系统级别的问题,如JVM内存溢出(StackOverFlowError)。程序运行时出现的无法被程序员从业务上解决的问题。
  • 异常(Exception)
    在程序运行期间,或者编译期间由编译器抛出的一些可以被程序员处理的代码问题
    如(Null Pointer Exception 空指针异常/ArrayIndexOutOfBoundsException 数组索引越界异常)。
    Throwable
    throwable是java中错误和异常的顶级父类。
    • java中的所有错误从Error类中继承,并且绝大多数类名称后缀以Error结尾
    • Java中的所有的异常从Exception类继承,都是以Exception作为后缀结尾
异常概述
  • 运行时异常(RuntimeException)
    在程序运行期间出现了异常后由JVM抛出,将异常的信息输出到控制台,jiava所有的运行异常都是从java.lang.RuntimeException继承而来。即运行时异常程序运行时才会产生的异常。
  • 检查异常
    也称为一般异常,或者编译器异常,通常通过编译期间由编译器提示需要进行显式的出现
    在这里插入图片描述
异常处理
  1. 异常抛出(throw/throws)
    public static void e1() throws 	  ClassNotFoundException  {
    	Class.forName("java.long.String");
    }
    
    • throws:用于方法的声明,抛出有可能出现的异常
    public static void main(String[] args) throws IOException  {	
    int i = 0;
    if(i == 0) {	
        throw new IOException();
    }
    System.out.println("hello");
    

}
```
- throw:用于语句块中,抛出指定类型的异常,throw一旦执行,一定会出现该类型异常。
继承关系的异常抛出
父类方法未抛出任何异常情况下,子类只能抛出运行时异常。

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

  1. 异常捕获(try/catch/finally)
    java程序中一旦出现异常,异常后面的代码无法在执行
  • try
  • catch
  • finally
try{
    //有可能出现异常的代码片段
}catch(异常类型 变量名){
    //处理异常
}finally{
    //不论是否出现异常,始终执行
}
程序执行到try语句块,在执行期间如果出现了对应catch的异常,则直接进入catch中。如果catch中没有合适的异常处理,则由JVM进行统一处理。

final、finalize和finally的区别

  • final是一个关键字用于修饰类,属性,方法
  • finalize是Object类中提供的一个方法,用于在jvm对对象清理时,对于当前对象执行一些最终的处理工作。
  • finally是异常中的语句块
    java中是否存在内存溢出问题
    理论上java不会存在内存泄漏问题,因为jvm提供了GC(垃圾回收:garbage collection)机制,会在适当的时候自动回收内存空间,不需要程序员手动处理;但是如果使用第三方资料并且未及时的清理以及回收,将会导致内存泄漏。
    异常处理中finally和return的结合使用
    如果try语句块中有使用return,并且try语句块没有任何异常时,程序首先会执行finally然后在执行return,但是对于基本类型的数据,finally的赋值时不会生效的,但是finally中操作引用类型的属性可以生效。

自定义异常
异常的定义通常用于标记程序运行时的异常情况,并不需要在异常中进行任何的业务逻辑处理,因此自定义异常中也与需定义任何的方法。

常用类之BigDecimal与DecimalFormat

BigDecimal
用于表示精度较高的数值类型的封装类型,一般用于精度要求较高的程序中。

  • java.math,BigDecimal(String s)
  • java.math.BigDecimal(double d)
  • java.math.BigDecimal(long l)
  • java.math.BigDecimal(int i)
    常用方法:
  • add(BigDecimal b):与另一个BigDecimal相加
  • subtract(BigDecimal b):相减
  • multiply(BigDecimal b):相乘
  • divide(BigDecimal b): 相除

NumberFormat&DecimalFomat
用于进行数值格式化的类,可以对数值的显示位数进行格式化处理,以及对浮点数进行金额或者百分比的格式表现;
NUmberFormat是一个抽象类。内部提供几个静态方法用于直接获取NumberFormat对象,通过这些静态方法实现。

  • format(double d):将一个double值按指定的格式转换为String
  • parse(String s): 将一个String类型的数值解析为double类型
double d = 150500.491987;
//获取用于进行货币格式化(本地环境)的数值格式化对象
NumberFormat fmt = NumberFormat.getCurrencyInstance();
//将浮点数转换为字符串类型的固定格式
String s = fmt.format(d);
System.out.println(s);//¥150,500.49

如果需要把double值转换成百分比,并保留小数点后两位,NumberFormat提供的格式化方法getPresidentInstence()只能保留整数位;\

DecimalFormat fmt = new DecimalFormat("##.##%");
System.out.println(fmt.format(0.456789)); // 45.68%
//将String类型表示的数字解析为需要的数值类型
String s = "50.67%";
//将以上字符串转换为double值   0.5067
fmt = new DecimalFormat("##.##%");
Number num = fmt.parse(s);
System.out.println(num.doubleValue()); 
Object类

Object类是所有java类的顶层父类。

  • Object类是一个工具类
  • Object对外不提供构造器,因此无法创建对象
  • Obejct类中的所有方法都是static
  • 提供的是对于对象的空指针安全操作的方法
User u1 = new User(1, "softeem", "123456");
User u2 = null;
//空指针安全的对象比较
System.out.println(Objects.equals(u1, u2));
//空指针安全的toString
System.out.println(Objects.toString(u2)); // 对象若为null则输出“null”字符串
System.out.println(Objects.toString(u2,"0")); //对象若为null则输出“0”

Random类
Math类中提供了一个random()的方法,用于随机一个0.0~1.0之间的浮点数。而Random类包括的方法有,随机整数、随机浮点数、随机布尔值。
常见方法:

  • nextBoolean():随机一个布尔值
  • nextDouble():随机一个0.1~0.1之间的double值
  • nextInt():随机一个int范围内的整数值
  • nextInt(int bounds):随机一个从0~bounds-1位的整数值
 public static void main(String[] args) {
        Random r = new Random();
        //随机布尔值
        boolean f = r.nextBoolean();
        System.out.println(f);
        //随机一个从0.0~1.0之间的浮点数
        double d = r.nextDouble();
        System.out.println(d);
        int i = r.nextInt();
        System.out.println(i);
        //随机一个5以内的整数
        i = r.nextInt(5);
        System.out.println(i);
        //随机一个5(含)~10(含)之间的整数
        i = r.nextInt(6) + 5;
        System.out.println(i);
        //随机生成指定长度的验证码,包含0-9A-Za-z之间的字符
        String code = genCode(6);
        System.out.println(code);
    }
}
File类

用汉语处理本机操作系统中的文件,文件可以时目录也可以是一个标准文件;
常用方法

  • createNewFile()创建新文件(便准文件)
  • exists()判断FIle对象是否存在
  • delete()删除File对象所表示的文件或者目录(空目录)
  • deleteOnExit()当JVM结束时删除
  • getName()获取File所指的文件或者目录的父路径
  • isFile()判断当前File所指的是否是便准文件
  • isDirectory()判断当前File所指的是否是目录
  • isHidden()判断当前File对象是否隐藏目录
  • lastModified()获取最后修改时间
  • length()获取File所表示文件大小
  • list()获取File所表示目录下所有子文件的名称数组
  • listFiles()获取File对象所表示目录下的所有子File数组
  • listFiles(FileFilter filter)通过文件过滤器将File所表示目录中符合条件的File对象过滤出来
  • listRoots()获取当前电脑可用的磁盘根
  • mkdir()创建当前File所表示的目录(一级)
  • mkdirs()创建当前File所表示的目录(多级)
  • renameTo(File file)重命名文件

常用类&正则表达式

Date

  • Date():获取当前系统时间所表示的日期对象
  • Date(long time):根据提供的时间毫秒数,构建一个日期对象(从1970年1月1日 00:00:00开始)
Date d = new Date();
//		d = new Date(120,11,1);
d = new Date(System.currentTimeMillis());
System.out.println(d);
//获取十分钟之后的日期对象  1s = 1000毫秒
d = new Date(System.currentTimeMillis() + 600000);
System.out.println(d);
  • after(Date d)
  • before(Date d)
  • CompareTo(Date d)
  • getTime()
System.out.println(d1.after(d2));//判断当前日期对象是否是参数日期对象之后的日期
System.out.println(d1.before(d2));//之前

判断2个学生的年纪,输出较大学生的信息

public static void main(String[] args) throws ParseException {
		DateFormat df = DateFormat.getDateInstance();
		Scanner sc = new Scanner(System.in);
		System.out.println("请输第一个学生的生日:");
		String s1 = sc.next();
		System.out.println("请输第二个学生的生日:");
		String s2 = sc.next();
		Student stu1 = new Student(1001, "张三", s1);
		Student stu2 = new Student(1002, "张四", s2);
		df = new SimpleDateFormat("yyyy年MM月dd日");
		Date d = df.parse(s1);
		Date d2 = df.parse(s2);
//		if(d2.after(d)) {
//			System.out.println(stu1);
//		}else {
//			System.out.println(stu2);
//		}
		Student stu = d.before(d2) ? stu1 : stu2 ;
		System.out.println(stu);
	}
日期格式化(DateFormat&simpleDateFormat)
  • getDateInstance()
  • getTimeInstance()
  • getDateTimelnstance()
  • getInstance()

simpDateFormat可以通过指定化的匹配模式来匹配不同的日期时间输出格式

Date d = new Date();
//20201120
DateFormat fmt = new SimpleDateFormat("yyyyMMdd");
time = fmt.format(d);
System.out.println(time);
//2020年11月20日 09时48分50秒
fmt = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒");
time = fmt.format(d);
System.out.println(time);
/********将String类型的日期时间转换为Date类型对象********/
String dateTime = "1999/11/11 09:10:11";
fmt = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//将字符串类型的时间根据指定的格式解析为Date对象
Date date = fmt.parse(dateTime);
System.out.println(date);

Calender
常见方法

  • get(int field)
  • set(int field,int value)
  • getActualMaximum(int field)
//以当前系统时间为基础获取日历实例  
Calendar c = Calendar.getInstance();		
System.out.println(c);
System.out.println("获取日历表示的年份:"+c.get(Calendar.YEAR)); 
System.out.println("获取当前日历表示的日期是今年的第多少天:"+c.get(Calendar.DAY_OF_YEAR));
//设置月份为12月
c.set(Calendar.MONTH, 11);
//获取当前日期所表示字段的可能最大值
int maxDay = c.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(maxDay); //31
//获取小时(24小时制)的最大值
int maxHour = c.getActualMaximum(Calendar.HOUR_OF_DAY);
System.out.println(maxHour); //23	(0~23)
//判断指定年份是否是闰年(需要将Calendar强制转换)
boolean leapYear = gc.isLeapYear(2020);
System.out.println(leapYear);

正则表达式

  • java.lang.String
  • java.util.regex.Pattern
  • Java.util.regex.Macher
String a = "13567845635";
//判断两个字符串是否完全一致
System.out.println(a.equals("13567845634"));
//判断当前String对象是否匹配给定的正则表达式( 匹配手机号格式字符串)
System.out.println(a.matches("^1\\d{10}$"));
元字符说明
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
\d匹配数字
\b匹配单词的开始或结束
^匹配字符串的开始
$匹配字符串的结束
System.out.println("!".matches("."));  //true
System.out.println(" ".matches("\\s"));//true
System.out.println("0".matches("\\d"));//true
System.out.println("abc".matches("\\babc")); //true
System.out.println("a".matches("^a")); //true
System.out.println("d".matches("d$")); //false

匹配长度

语法说明
*重复零次或更多次
+重复一次或更多次
重复零次或一次
{n}重复n次
{n,}重复n从或更多次
{n,m}重复n到m次
//匹配输入长度为4的数字要求必须以1开头
System.out.println("1234".matches("^1\\d{3}"));
// 5-11位长度数字,不能以0开始
System.out.println("12334352324".matches("^[1-9]\\d{4,10}"));
//匹配不能少于5位长度的数字
System.out.println("12387912".matches("\\d{5,}"));
//匹配不能超过6位长度的数字
System.out.println("12346".matches("\\d{0,6}"));
//匹配字母0个或多个
System.out.println("".matches("[a-zA-Z]*")); 
//匹配字母1个或多个
System.out.println("a".matches("[a-zA-Z]+"));
//匹配字母0个或1个
System.out.println("ac".matches("[a-zA-Z]?"));
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值