java第四周总结

错误和异常

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

  • 错误(error)
  • 异常(Exception)

异常的集中常见类型

  1. 算术异常 (java.lang.ArithmeticException)
  2. 空指针异常 (java.lang.NullPointerException)
  3. 数组索引越界 (java.lang.ArrayIndexOutOfBoundsException)
  4. 输入数据类型不匹配 (java.util.InputMismatchException)

异常的处理方式

  1. 异常抛出(throw/throws)
  2. 异常捕获(try/catch/finally)

异常捕获的关键字

  • try
  • catch
  • finally

//语法结构
try{
    //有可能出现异常的代码片段
}catch(异常类型 变量名){
    //处理异常
}finally{
//finally一般用于异常捕获之后执行最终的处理工作,比如,清理资源,关闭流,关闭连接;finally中的代码无论是否出现异常,始终会执行
    //不论是否出现异常,始终执行
}

final、finalize和finally的区别?

final是一个关键字用于修饰类,属性,方法。finalize是Object类中提供的一个方法,用于在jvm对对象清理时,对于当前对象执行一些最终的处理工作的finally是异常中的语句块

自定义异常:以上所有异常都输入JDK有定义好的异常类型,但当有些异常无法满足需要时,我们可以通过JDK的异常进行扩展,自定艺异常,以满足项目的需求。

常见类值BigDecimal与DecimalFormal

  • 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

//获取整数类型的格式化对象
fmt = NumberFormat.getIntegerInstance();
System.out.println(fmt.format(d));//150,500

//获取标准的数值类型格式化对象(对于小数点最大保留后三位)
fmt = NumberFormat.getNumberInstance();
System.out.println(fmt.format(d));//150,500.492

//获取进行百分比格式化的对象
fmt = NumberFormat.getPercentInstance();
System.out.println(fmt.format(0.456789));//46%

基于BigDecimal类实现微信红包算法的功能:

实体类

package com.random;

import java.math.BigDecimal;

/**
 * 红包类
 * @author 承蒙
 *
 */
public class RedPacket {
		private int id;
		private BigDecimal money;
		
		public RedPacket() {
			// TODO Auto-generated constructor stub
		}

		public RedPacket(int id, BigDecimal money) {
			super();
			this.id = id;
			this.money = money;
		}

		public int getId() {
			return id;
		}

		public void setId(int id) {
			this.id = id;
		}

		public BigDecimal getMoney() {
			return money;
		}

		public void setMoney(BigDecimal money) {
			this.money = money;
		}

		@Override
		public String toString() {
			return "RedPacket [id=" + id + ", money=" + money + "]";
		}
		
}

发红包的业务逻辑及测试

package com.random;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Random;

import com.throwable.MyException;

public class RedPacketManage {

	static final BigDecimal MIN = new BigDecimal("0.01");

	public ArrayList<RedPacket> genRedPacket(double total, int count) throws MyException {
		ArrayList<RedPacket> packets = new ArrayList<>();
		// 计算所有红包之和的最低
		double min = MIN.multiply(new BigDecimal(count)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
		if (min > total) {
			throw new MyException("您发出的金额少于0.01");
		} else if (min == total) {
			// 平均分出总金额
			for (int i = 0; i < count; i++) {
				RedPacket rp = new RedPacket(i + 1, new BigDecimal("0.01"));
				packets.add(rp);
			}
		} else {
			BigDecimal rp = new BigDecimal(total);
			double[] bili = randomBili(count);
			// 临时变量(存储最后一次的金额)
			BigDecimal temp = new BigDecimal(0);
			// 每个红包按比例分的钱
			for (int i = 0; i < count - 1; i++) {
				BigDecimal rm = rp.multiply(new BigDecimal(bili[i])).setScale(2, BigDecimal.ROUND_HALF_EVEN);
				temp = temp.add(rm);
				packets.add(new RedPacket(i + 1, rm));
			}
			// 最后依次的金额
			BigDecimal last = rp.subtract(temp);
			packets.add(new RedPacket(count, last));
		}
		return packets;
	}

	/**
	 * 随机红包比例
	 * 
	 * @return
	 */
	public static double[] randomBili(int count) {
		double[] arr = new double[count];
		Random r = new Random();
		double total = 0.0;
		for (int j = 0; j < count; j++) {
			int i = r.nextInt(100)  + 1;
			arr[j] = i;
			total += i;
		}
		for (int i = 0; i < count ; i++) {
			arr[i] = arr[i] / total;
		}
		return arr;
	}

	public static void main(String[] args) throws MyException {
		RedPacketManage r = new RedPacketManage();
		ArrayList<RedPacket> list = r.genRedPacket(100, 5);
		for (RedPacket redPacket : list) {
			System.out.println(redPacket);
		}
	}
}

测试结果:
在这里插入图片描述

在这里插入图片描述

题目思路:

常用类Objects和Random类

	public static void main(String[] args) {
		User u = new User();
		User u1 = null;
		System.out.println(Objects.equals(u, u1));//false
		System.out.println(Objects.toString(u));//com.day03.objectdemo.User@745f
		System.out.println(Objects.hashCode(u1));//0
		System.out.println(Objects.isNull(u1));//true
		System.out.println(Objects.nonNull(u));//true
	}

随机获取几位数验证码

public static void YanZhengma(int count) {
		String s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
		Random r = new Random();
		char[] c = new char[count];
		for (int i = 0; i < count; i++) {
			 int j = r.nextInt(s.length());
			c[i] += s.charAt(j);
		}
		for (char d : c) {
			System.out.print(d);
		}
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("您要的验证码");
		int count = sc.nextInt();
		YanZhengma(count);
		
	}

文件的过滤

package com.filedemo;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

public class FileDemo {
	public static void main(String[] args) throws IOException {
		File f =  new File("C:\\Users\\承蒙\\Desktop\\好多作业");
		File[] files = f.listFiles(new FileFilter() {
			//回调函数
			@Override
			public boolean accept(File pathname) {
				return pathname.getName().endsWith(".mp3");
			}
		});
		for (File file : files) {
			System.out.println(file.getName());
		}
	}

}

所有标准文件的获取

package com.day05;

import java.io.File;
import java.util.Objects;

public class FileDemo01 {
	/**
	 * 获取目录下所有标准文件
	 * 
	 * @param dir
	 */
	public static void readFile(File dir) {
		File[] list = dir.listFiles();
		// 判断目录文件是否为空
		if (Objects.nonNull(list)) {
			// 不为空的话对所有目录进行遍历,找到标准文件
			for (File file : list) {
				// 对file继续判断。如果是目录,递归。继续遍历
				if (file.isDirectory()) {
					readFile(file);
				} else {
					// 否则,全部输出
					System.out.println(file.getName());
				}
			}
		}
	}

	public static void main(String[] args) {
		File f = new File("C:\\Users\\承蒙\\Desktop\\好多作业\\5.23考试第四题");
		readFile(f);
	}

}

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

日期类(Date)

public static void main(String[] args) {
		Date d = new Date();
		Date d1 = new Date();
		System.out.println(d);//欧美时间(Sun Nov 22 20:15:19 CST 2020)
		DateFormat df = DateFormat.getDateInstance();
		String string = df.format(d);//时间格式化
		System.out.println(string);//当前年月日(2020-11-22)
		df = DateFormat.getTimeInstance();
		System.out.println(df.format(d));//获取当前时分秒
		System.out.println(d1.compareTo(d1));//0
		df = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");//将时间格式化为某种格式
		String format = df.format(d);
		System.out.println(format);//22
		df = new SimpleDateFormat("[HH:mm:ss]");
		System.out.println(df.format(d));//2020
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值