首先我还是想聊一聊集合这个东西。
集合的嵌套可以用来做很多事情,我在写集合嵌套时老是无法有一个完整的结构思路,不知道是不是搬的少的缘故,套路见的有点少吗?HashMap的键值对,TreeSet的有序性等,搞起来有点无从下手的缘故,总之无法将记住的变成自己的,还是得多练啊!
public class MyTest {
public static void main(String[] args) {
//斗地主排序版
HashMap<Integer, String> pokerBox = new HashMap<>();
//创建一个索引集合
ArrayList<Integer> indexs = new ArrayList<>();
int index = 0;
//生成牌
String[] colors = {"♠", "♥", "♦", "♣"};
//数字
String[] nums = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
for (String num : nums) {
for (String color : colors) {
pokerBox.put(index, num.concat(color));
indexs.add(index);
index++;
}
}
//手动添加大小王
pokerBox.put(index, "★");
indexs.add(index);
index++;
pokerBox.put(index, "☆");
indexs.add(index);
//洗牌 洗索引集合
Collections.shuffle(indexs);
Collections.shuffle(indexs);
Collections.shuffle(indexs);
//发牌
TreeSet<Integer> 11 = new TreeSet<Integer>();
TreeSet<Integer> 22 = new TreeSet<Integer>();
TreeSet<Integer> 33 = new TreeSet<Integer>();
TreeSet<Integer> 44= new TreeSet<Integer>();
for (int i = 0; i < pokerBox.size(); i++) {
//留底牌
if (i >= indexs.size() - 3) {
底牌.add(indexs.get(i));
} else if (i % 3 == 0) {
11.add(indexs.get(i));
} else if (i % 3 == 1) {
22.add(indexs.get(i));
} else {
33.add(indexs.get(i));
}
}
//看牌
lookPoker("11", 11, pokerBox);
lookPoker("22", 22, pokerBox);
lookPoker("33", 33, pokerBox);
lookPoker("底牌", 底牌, pokerBox);
//System.out.println(pokerBox);
//System.out.println(indexs);
}
private static void lookPoker(String name, TreeSet<Integer> set, HashMap<Integer, String> pokerBox) {
System.out.println(name);
for (Integer key : set) {
String s = pokerBox.get(key);
System.out.print(s + "\t");
}
System.out.println();
}
}
如上就是集合的嵌套例子,还是多练为主吧。
Io流的异常处理
IO流的学习首先就是File类的学习了,因为IO中file的上传和下载我认为很重要?。
然后接下来就是在这个过程中的异常处理了。
异常的概述和分类
A:异常的概述: 异常就是Java程序在运行过程中出现的错误。
B:异常的继承体系
异常的基类: Throwable
严重问题: Error 不予处理,因为这种问题一般是很严重的问题,比如: 内存溢出
非严重问题: Exception
编译时异常: 非RuntimeException
运行时异常: RuntimeException
运行期异常:可以处理,也可以不处理
不处理,那就交由JVM去处理,JVM的默认处理方式,打印异常,信息,停掉JVM
try 里面一般放有可能 会出现问题的代码
A:异常处理的两种方式
a:try…catch…finally
b:throws
B:try…catch处理异常的基本格式
catch里面是try里面出现问题时才去执行的,
try {
可能出现问题的代码 ;
}catch(异常名 变量名){
针对问题的处理 ;
}finally{
释放资源;
}
注意事项:
a: try中的代码越少越好
b: catch中要做处理,哪怕是一条输出语句也可以.(不能将异常信息隐藏)
异常的话能处理就处理,有的时候抛出没法解决问题。
编译期异常
编译期异常只的是非RuntimeException异常,这个当然是需要必须解决的。
一般如下将出现的错误打印出来,那么估计有人会问,我不处理异常虚拟机也会自动抛出异常啊,但是如果你将虚拟机抛出异常它会停止程序并打印出异常,而你处理的话程序会运行下去?,当然你也可以对异常做其他处理,但现在的话就只是这样就可以了。
e.printStackTrace();
System.out.println(e.toString());
System.out.println(e.getMessage());
就像下面的异常一样
while (true) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数");
try {
int num = scanner.nextInt();
break;
} catch (InputMismatchException e) {
System.out.println("输入的类型不正确,请重写输入");
}
Throw和Throws的区别
throw 和 throws 的区别
throw 他是在方法内部进行异常的抛出
throws 是在方法声明上进行异常的抛出
throws抛出的是一些,异常的类名,可以抛出多个异常
throw 抛出的是一个异常对象
throws 是抛出多种异常的肯能性
throw 一旦抛出了异常,那么肯定是他遇到了这种异常
就像下面一样在一个方法中
private static void show() {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个整数");
int a = scanner.nextInt();
System.out.println("请输入第二个整数");
int b = scanner.nextInt();
if(b==0){
throw new ArithmeticException("你傻啊,除数为0了");
}else{
System.out.println(a/b);
}
final,finally和finalize的区别
final 可以修饰变量,类,方法
finally 用在异常处理语句中,不管try里面有没有遇到异常,那么finally里面的语句,都会执行。如果catch里面有return语句,finally的代码还会执行 ,并且是在return前执行。
finalize Obejct类中的一个方法,用来回收垃圾
自定义的异常
除了Java中自带的异常之外,还有些我们自己定义的异常。这时就需要将我们的异常纳入系统的异常体系中去
如下,即继承运行异常
public class SocreExcetion extends RuntimeException{
public SocreExcetion(String msg) {
super(msg);
}
}
Scanner scanner = new Scanner(System.in);
System.out.println("请输入");
int i = scanner.nextInt();
if (i>100||i<0){
throw new SocreExcetion("成绩不合法");
}else {
System.out.println(i);
}
//ctrl+alt+T 可以捕获异常代码
try {
System.out.println(1 / 0);
} catch (Exception e) {
e.printStackTrace();
}
//编译期异常:按alt+enter 纠错键,选择抛出还是try catch
try {
new SimpleDateFormat("yyyy-MM-dd").parse("2019-10-10");
} catch (ParseException e) {
e.printStackTrace()
首先如果编译报错则通过打印的错误找到位置,在通过ctrl+alt+T 捕获并处理.
如果有了继承关系,我们在重写父类方法时,注意异常的语法
1.父类方法有抛出异常,子类在重写父类方法时,可以抛出和父类一样的异常,也可以不抛出异常
2.父类方法没有抛出异常,子类在重写父类方法时,就不能抛出异常
3,子类不能抛出,父类没有抛出的异常
4.子类不能抛出的异常,不能比父类的大,只能跟父类的一样,或者比父类小
当然此限定在编译期异常,运行期异常会抛给虚拟机.
File类
A:File类的概述
文件和目录路径名的抽象表示形式
这个File类可以用来表示文件,也可以用来表示目录
B:构造方法
File(String pathname):根据一个路径得到File对象
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
方法
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了 注意这个方法只能创建单层目录 如果创建多层目录得一层一层创建
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来 可以创建多层目录 当然也可以创建单层目录
上面两个方法第一次创建成功返回ture,第二次重复创建返回false。
当然delete这个方法也一样,第一次删除成功返回ture,第二次就是false了,并且它只能删除空文件夹,有内容的需写程序实现。(被该命令删除的文件或命令在回收站找不到)
注意renameTo(file1);这个方法,如果我们传入的这个文件对象,跟源文件在同一个目录下,是重命名
如果如果我们传入的这个文件对象,跟源文件不在同一个目录下,剪切并重命名。
有关判断的方法
判断是否是一个文件
boolean file1 = file.isFile();
判断是否是一个目录
boolean directory = file.isDirectory();
判断文件或目录是否存在
boolean exists = file1.exists();
boolean b = file.canRead();//判断文件是否可读
boolean b1 = file.canWrite();//判断文件是否可写入
boolean hidden = file.isHidden();//判断文件是否隐藏
获取功能
public String getAbsolutePath(): 获取绝对路径(说通俗点就是在你计算机的CDEF盘中存放的路径)
public String getPath(): 获取相对路径(相对来说,它是抽象的,一般在你的虚拟机工程里)
public String getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
public File getParentFile() 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
public long getTotalSpace() 返回此抽象路径名指定的分区大小。 返回总容量 单位字节
public long getFreeSpace() 返回此抽象路径名指定的分区中未分配的字节数。返回剩余容量 单位字节
public String getName(): 获取名称
public long length(): 获取长度。字节数
public long lastModified(): 获取最后一次的修改时间,毫秒值
public String[] list(): 获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles(): 获取指定目录下的所有文件或者文件夹的File数组
String absolutePath = file.getAbsolutePath(); 获取绝对路径的字符串表现形式
File file1 = file.getAbsoluteFile(); 获取绝对路径的Flie表现形式,这种形式更加灵活
忘记回顾(日期格式转化)Date date = new Date(time);
SimpleDateFormat format = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
String format1 = format.format(date);