错误和异常
java中对于程序出现的异常情况分为两种类别:
- 错误(error)
- 异常(Exception)
异常的集中常见类型
- 算术异常 (java.lang.ArithmeticException)
- 空指针异常 (java.lang.NullPointerException)
- 数组索引越界 (java.lang.ArrayIndexOutOfBoundsException)
- 输入数据类型不匹配 (java.util.InputMismatchException)
异常的处理方式
- 异常抛出(throw/throws)
- 异常捕获(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
}