Map集合/异常/IO流

一;Map接口:有以下几个子实现类: HashMap  Hashtable  TreeMap

(1)   HashMap<k,v>:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键;底层数据结构是哈希表,特点:元素唯一,无序,元素唯一靠的是重写了equals()方法和hashcode()方法

K - 此映射所维护的键的类型

V - 所映射值的类型

(2)   HashMap()集合中的方法:

添加功能:

put():第一次采用put 放置数据的时候 返回的是null; 第二次放置键相同的数据 会返回上一次的值-----键相同,值覆盖.

获取功能:

Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合

V get(Object key):根据键获取值

Set<K> keySet():获取集合中所有键的集合

Collection<V> values():获取集合中所有值的集合

判断功能:

boolean containsKey(Object key):判断集合是否包含指定的键

boolean containsValue(Object value):判断集合是否包含指定的值

boolean isEmpty():判断集合是否为空

删除功能:

void clear():移除所有的键值对元素

V remove(Object key):根据键删除键值对元素,(v—该键对应的值)并把值返回

#HashMap集合中方法的综合应用:

package HashMapText;

import java.util.HashMap;

import java.util.Set;

public class HashMapText_02 {

    public static void main(String[] args) {

       HashMap<String,String> hm=new HashMap<String,String>();//创建HashMap集合,并指明泛型

      

       hm.put("孙悟空", "72");//调用HashMap集合的put()方法,向集合中添加元素

       hm.put("杨戬", "有三只眼");

       hm.put("哪吒", "三头六臂");

      

       System.out.println("集合是否为空:" + hm.isEmpty());//对该集合进行判空操作

       System.out.println("删除该键处指定的值:" + hm.remove("孙悟空"));//调用V remove(Object key):根据键删除键值对元素,(v—该键对应的值)并把值返回

       System.out.println("该集合是否含有该键:" + hm.containsKey("哪吒"));//判断集合是否有指定的键

       System.out.println("该集合是否有这个值:" + hm.containsValue("没有"));//判断集合是否有指定的值

       hm.clear();//删除该集合中的所有元素

       System.out.println("删除该集合后的所有元素有:");

       //遍历该集合:

       Set<String> keySet = hm.keySet();//获取该集合的键集合

       for(String k:keySet){

           System.out.println(k + "---" + hm.get(k));

       }

    }

}

 

(3)   HashMap集合的两种遍历方法:

方式一:

1. 先获取该集合的键集合;列:---Set<Integer> k=hm.keySet();(该方法返回Set集合)

2. 遍历该键集合,间接获取该集合中键所对应的每个值;列---for(Integer i:k){

System.out.println(i + “---“ + hm.get(i));

      方式二:

1. 先获取该键值对的集合;例---Set<Entry<Integer,String>> s=hm.EntrySet();(该方法返回Set集合);

2. 用增强for循环进行遍历该键值对集合,并通过getkey()和getvalue()方法分别获取键和值

#HashMap集合的两种遍历方法:

package HashMapText;

import java.util.HashMap;

import java.util.Map.Entry;

import java.util.Set;

 

public class HashMap_Text01 {

    public static void main(String[] args) {

       HashMap<Integer,String> hm=new HashMap<Integer,String>();//创建HashMap集合对象,并指明泛型

      

       hm.put(2, "美队");

       hm.put(1, "超人");//向集合中添加元素,因为该键的类型为Integer类型,其底层实现了Comparable接口,会自动进行比较,所以结果中的元素是唯一的

       hm.put(4, "绿巨人");

       hm.put(3, "钢铁侠");

      

      

       //遍历HashMap集合元素,第一种遍历方法

//     Set<Integer> k=hm.keySet();//调用hashMap集合的KeySet()方法,获取键集合.

//     for(Integer key:k){

//         System.out.println(key + "---" + hm.get(key));

//     }

       //第二种遍历方法

       Set<Entry<Integer, String>> set = hm.entrySet();//调用hashMap集合的entrySet()方法,该方法返回Set集合的键值对集合

       for(Entry<Integer, String> en:set){

           System.out.println(en.getKey()+ "---" + en.getValue());

       }  

    }

}


#HashMap集合中的键为自定义类时:Map集合中的数据结构只跟键有关,与值无关,当键为自定义类时,为了保证最后遍历出的元素具有唯一性,在该类中需要重写equals()方法和hashcode()方法,为了能让自定义类中的元素以字符串的形式打印出来,该类需要重写toString()方法.

package HashMapText;

import java.util.HashMap;

import java.util.Set;

public class HashMapText_03 {

    public static void main(String[] args) {

       HashMap<Student,String> hm=new HashMap<Student,String>();//创建HashMap集合对象,该键的类型为Student

      

       hm.put(new Student(22,"上官完成"), "三好学生");//向该集合中添加元素

       hm.put(new Student(50,"王抢"), "该生很差");

       hm.put(new Student(26,"欧阳长风"), "优等生");

       hm.put(new Student(25,"欧阳长风"), "优等生");

       hm.put(new Student(50,"王抢"), "该生很差");//添加相同元素

      

       //遍历该集合

       Set<Student> keySet = hm.keySet();//获取键集合

       for(Student s:keySet){

           System.out.println(s + "---" + hm.get(s));

       }

    }

}

class Student{

    private int age;

    private String name;

   

    public Student() {

       super();

       // TODO Auto-generatedconstructor stub

    }

 

    public Student(int age, String name) {

       super();

       this.age = age;

       this.name = name;

    }

 

    public int getAge() {

       return age;

    }

 

    public void setAge(int age) {

       this.age = age;

    }

 

    public String getName() {

       return name;

    }

 

    public void setName(String name) {

       this.name = name;

    }

 

    @Override

    public int hashCode() {//因为将HashMap集合的键定义为自定义类,想要保证集合中元素的唯一性,在该类中就需要重写equals()方法和hashcode()方法

       final int prime = 31;

       int result = 1;

       result = prime * result + age;

       result = prime * result + ((name == null) ? 0 : name.hashCode());

       return result;

    }

 

    @Override

    public boolean equals(Object obj) {

       if (this == obj)

           return true;

       if (obj == null)

           return false;

       if (getClass() != obj.getClass())

           return false;

       Student other = (Student) obj;

       if (age != other.age)

           return false;

       if (name == null) {

           if (other.name != null)

              return false;

        } else if (!name.equals(other.name))

           return false;

       return true;

    }

 

    @Override

    public String toString() {//重写该方法,才能以字符串形式打印出Student类中的元素

       return "Student[age=" + age + ",name=" + name + "]";

    }

}

 

(4)   LinkedHashMap集合:底层数据结构是链表和哈希表,元素有序且唯一,元素的唯一性由哈希表保证,哈希表底层会重写equals()方法和hashcode()方法;有序性由链表结构保证;(注:这里的有序是指存的顺序和取得顺序一致)

#LinkedHashMap集合遍历集合元素:

package LinkedHashMapText;

import java.util.LinkedHashMap;

import java.util.Set;

public class LinkedHashMapText_01 {

    public static void main(String[] args) {

       LinkedHashMap<Integer,String> lhm=newLinkedHashMap<Integer,String> ();//创建LinkedHashMap集合对象,

      

       lhm.put(3, "钢铁侠");

       lhm.put(2, "美国队长");

       lhm.put(1, "蜘蛛侠");

       lhm.put(2, "美国队长");//添加相同元素

       lhm.put(4, "美国队长副本");

      

       Set<Integer> keySet = lhm.keySet();//获取键集合

       for(Integer k:keySet){//遍历该集合

           System.out.println(k + "---" + lhm.get(k));//该集合链表结构可以保证元素存的顺序和取得顺序一致

       }

    }

 

}


(5)   TreeMap集合:数据结构是红黑树,特点:元素唯一,而且还能对元素进行排序,排序方式有自然排序和比较器排序

#TreeMap集合遍历元素:

package TreeMapText;

import java.util.Set;

import java.util.TreeMap;

public class TreeMapText_01 {

    public static void main(String[] args) {

       TreeMap<Integer,String> tm=new TreeMap<Integer,String>();//创建TreeMap集合的对象,TreeMap集合底层实现了Comparable接口,该接口存在方法Cmparato()方法,所以会进行排序

      

       tm.put(3, "钢铁侠");

       tm.put(2, "美国队长");

       tm.put(1, "蜘蛛侠");

       tm.put(2, "美国队长");//添加相同元素

       tm.put(4, "美国队长副本");

   

       Set<Integer> keySet = tm.keySet();//获取键集合

       for(Integer k:keySet){

           System.out.println(k + "---" + tm.get(k));

       }

    }

}



#TreeMap集合遍历自定义对象元素:

package TreeMapText;

import java.util.Set;

import java.util.TreeMap;

public class TreeMapText_02 {

    public static void main(String[] args) {

       TreeMap<Girl,String> tm=new TreeMap<Girl,String>();//创建TreeMap集合对象

      

       tm.put(new Girl(18,"高圆圆"), "气质女神");

       tm.put(new Girl(20,"王祖贤"), "完美女神");

       tm.put(new Girl(23,"朱茵"), "不老女神");

       tm.put(new Girl(26, "张敏"),"冷酷女神");

       tm.put(new Girl(20,"林青霞"), "东方不败");

      

       Set<Girl> keySet = tm.keySet();//获取键集合

       for(Girl k:keySet){

           System.out.println(k + "---" + tm.get(k));

       }

    }

}

class Girl implements Comparable<Girl>{

       private int age;

       private String name;

       public Girl(int age, String name) {

           super();

           this.age = age;

           this.name = name;

       }

       public Girl() {

           super();

           // TODO Auto-generatedconstructor stub

       }

       public int getAge() {

           return age;

       }

       public void setAge(int age) {

           this.age = age;

       }

       public String getName() {

           return name;

       }

       public void setName(String name) {

           this.name = name;

       }

       @Override

       public String toString() {

           return "Girl[age=" + age + ",name=" + name + "]";

       }

       public int compareTo(Girl g) {//重写该接口的Comparato()方法

           // TODO Auto-generatedmethod stub

           int num1=g.age-this.age;

           int num2=num1==0?this.name.compareTo(g.name):num1;

           return num2;

       }

}


二:集合的嵌套遍历:

(1)HashMap集合的嵌套遍历:先获取大集合的键集,再根据键获取大集合中的每个键对应的值,然后用大集合获取值的这个对象调用keySet()方法,获取小集合的每个键,再用增强for()循环遍历该集合中的元素

#HashMap集合的嵌套遍历:

package HashMapText;

import java.util.HashMap;

import java.util.Set;

/**

 * 需求:HashMap集合遍历出

 * 古希腊神话故事:

 *     宙斯--宇宙之神

 *     波塞冬--海洋之神

 *     阿瑞斯--战神

 * 中国神话故事:

 *     如来--boss

 *     玉皇老头--二把手

 *     孙悟空--斗战圣佛

 * */

public class HashMapText_04 {

    public static void main(String[] args) {

       HashMap<String,String> hm1=new HashMap<String,String>();//创建封装古希腊神话故事的集合

      

       hm1.put("宙斯", "宇宙之神");

       hm1.put("波塞冬", "海洋之神");

       hm1.put("阿瑞斯", "战神");

      

       HashMap<String,String> hm2=new HashMap<String,String>();//创建封装中国神话故事的集合

      

       hm2.put("如来","boss");

       hm2.put("玉皇老头", "二把手");

       hm2.put("孙悟空","斗战圣佛");

      

       HashMap<String,HashMap<String,String>> hm=newHashMap<String,HashMap<String,String>>();//创建封装神话故事的集合

      

       hm.put("古希腊神话故事:", hm1);

       hm.put("中国神话故事:", hm2);

      

       //获取大集合的键集合

       Set<String> keySet = hm.keySet();

       for(String key:keySet){

           HashMap<String, String> hashMap = hm.get(key);//通过大集合的键获取对应的值

           Set<String> keySet2 = hashMap.keySet();//获取先集合的键

           for(String key2:keySet2){

              System.out.println(key2 + "---" + hashMap.get(key2));//获取小集合的每个键对应的值

             

           }

           System.out.println( "----------------------");

       }

      

    }

}



(2)ArrayList集合与HashMap集合的嵌套遍历:

(3)packageArrayListAndHashMapText;

(4)import java.util.ArrayList;

(5)import java.util.HashMap;

(6)import java.util.Set;

(7)/**

(8) * 需求:使用ArrayList集合和HashMap集合嵌套遍历这些元素

(9) * 音乐才子:

(10)      *     马克西姆

(11)      *     赵雷

(12)      * 艺术家

(13)      *     梵高

(14)      *     徐悲鸿

(15)      *

(16)      * */

(17)     public classArrayListAndHashMapText_01 {

(18)         public static void main(String[]args) {

(19)            ArrayList<String>al1=new ArrayList<String>();//创建第一个ArrayList集合,来封装音乐才子

(20)            al1.add("马克西姆");

(21)            al1.add("赵雷");

(22)           

(23)            ArrayList<String>al2=new ArrayList<String>();//创建第二个ArrayList集合,来封装艺术家

(24)            al2.add("梵高");

(25)            al2.add("徐悲鸿");

(26)           

(27)            HashMap<String,ArrayList<String>>hm=new HashMap<String,ArrayList<String>>();//将音乐才子与艺术家封装在HashMap集合中

(28)            hm.put("音乐才子", al1);

(29)            hm.put("艺术家", al2);

(30)           

(31)            //遍历该集合中的元素:

(32)            Set<String>keySet = hm.keySet();

(33)            for(String k:keySet){

(34)                System.out.println(k);

(35)                ArrayList<String>list = hm.get(k);//获取该HashMap集合中键所对应的值

(36)                for(String s:list){

(37)                   System.out.println("\t" + s);

(38)                }

(39)                System.out.println("----------------");

(40)            }

(41)         }

(42)     }


三:集合工具类 Collections

(1)    成员方法:

public static <T> voidsort(List<T> list):  根据元素的自然顺序对指定列表按升序进行排序。

public static <T> int binarySearch(List<?>list,T key): 二分查找;使用二分搜索法搜索指定列表,以获得指定对象。(前提是该集合中的元素是有序的)

public static <T> T max(Collection<?> coll): 根据元素的自然顺序,返回给定 collection 的最大元素。

public static void reverse(List<?> list): 反转指定列表中元素的顺序。

public static void shuffle(List<?> list): 使用默认随机源对指定列表进行置换。

#Colllections集合成员方法的应用:

package ArrayList_Demo;

import java.util.ArrayList;

import java.util.Collections;

public class ArrayListText_03 {

    public static void main(String[] args) {

      ArrayList<Integer> al=new ArrayList<Integer>();//创建ArrayList集合对象,并指定泛型

      

       al.add(20);

       al.add(18);

       al.add(26);

       al.add(23);

       al.add(19);//向集合中添加元素

      

       Collections.sort(al);//调用Collections工具类的sort()方法对,集合中的元素进行排序

       int indexof=Collections.binarySearch(al, 20);//对已经排好序的集合元素进行二分查找

       System.out.println("该数对应的索引为:" + indexof);

      

       Collections.shuffle(al);//将集合中的元素打乱

       int max=Collections.max(al);//返回该集合中的最大值

       int min=Collections.min(al);//返回该集合中的最小数\

       System.out.println("集合中的最大值为:" + max);

       System.out.println("集合中的最小值为:" + min);

    }

}


#用HashMap集合统计字符串中每个字母出现的次数:

package HashMapText;

/**

 * 需求:键盘录入一串字符串,统计字符串中字母出现的次数

 * */

import java.util.HashMap;

import java.util.Scanner;

import java.util.Set;

public class HashMaoText_05 {

    public static void main(String[] args) {

       HashMap<Character,Integer> hm=new HashMap<Character,Integer>();//先创建HashMap集合,并指明泛型

      

       Scanner Sc=new Scanner(System.in);

       System.out.println("请用户输入一个字符串:");

       String Str=Sc.nextLine();

      

       char []ch=Str.toCharArray();//将字符串转换为字节数组

       for(char key:ch){//遍历该字节数组,实质是遍历HashMap集合中的键集

           Integer in = hm.get(key);//通过上述的键集获取对应的Integer

           if(in==null){

              hm.put(key, 1);//HashMap集合的put()方法在第一次添加元素时,Value返回Null,

           }

           else{

              in++;

              hm.put(key, in);//put()方法第二次添加元素时,键相同,值覆盖

           }

       }

      

       StringBuilder sb=new StringBuilder();//创建字符串缓冲区对象

       Set<Character> keySet = hm.keySet();//获取该集合的键集

       for(Character k:keySet){

           sb.append(k).append("(").append(hm.get(k)).append(")");//通过StringBuilderappend()方法将键及其对应的值添加到缓冲区中

       }

      

       System.out.println("字符串中每个字母出现的次数为:" +sb.toString());//StringBuilder类型转换为String类型进行输出

    }

}


#用ArrayList集合实现斗地主的发牌,洗牌,看牌;显示输出玩家手中的牌:

package ArrayListGame;

import java.util.ArrayList;

import java.util.Collections;

/**

 * 需求:实现斗地主的发牌,看牌游戏:

 * 1.先创建一个ArrayList集合来封装54张牌

 * 2.在定义两个数组,一个存放花色字符串,另一个数组存放数字字符串

 * 3.通过增强for()循环的嵌套来将每张牌都封装在牌盒子集合中,在调用集合的添加功能,额外添加两张大小王

 * 4.然后调用Collections工具类的shuffle()方法将集合中的元素打乱

 * 5.再创建3个游戏用户集合,和封装底牌的集合

 * 6.根据牌盒子存放牌的索引下标,判断给谁发牌

 * 7.定义一个方法,功能实现看牌,用增强for()循环遍历每个用户手里的牌

 *

 * */

public class ArrayListGameText_01 {

    public static void main(String[] args) {

       ArrayList<String> Poker=new ArrayList<String> ();//创建牌盒子集合对象

      

       String[] StrColor={"红桃","黑桃","梅花","方块"};//定义花色数组

       String[] StrNumber={"A","2","3","4","5","6","7","8","8","9","10","J","Q","K"};//定义数字数组

      

       for(String Color:StrColor){

           for(String Number:StrNumber){

              Poker.add(Color + Number);//获取52张常规牌

           }

       }

      

       Poker.add("大鬼");

       Poker.add("小鬼");//向该集合中添加大小王

      

       Collections.shuffle(Poker);

       Collections.shuffle(Poker);

       Collections.shuffle(Poker);//将该牌盒子中的顺序打乱,实现三次洗牌

      

       ArrayList<String> play1=new ArrayList<String>();//创建玩家一集合

       ArrayList<String> play2=new ArrayList<String>();//创建玩家二集合

       ArrayList<String> play3=new ArrayList<String>();//创建玩家三集合

       ArrayList<String> publicPoker=newArrayList<String>();//创建封装底牌的集合

      

       for(int i=0;i<Poker.size();i++){

           if(i>=Poker.size()-3){

              publicPoker.add(Poker.get(i));//调用arraylist集合的get()方法,该方法根据对应的索引,返回该索引对应的值

           }

           else if(i%3==0){

              play1.add(Poker.get(i));//给玩家一发牌

           }else if(i%3==1){

              play2.add(Poker.get(i));//给玩家二发牌

           }else if(i%3==2){

              play3.add(Poker.get(i));//给玩家三发牌

           }

       }

       ShowPoker("play1",play1);

       ShowPoker("play2",play2);

       ShowPoker("play3",play3);

       ShowPoker("publicPoker",publicPoker);

   

    }

    public static void ShowPoker(String Str,ArrayList<String> PokerPlay){

       System.out.println(Str);

       for(String StrPoker:PokerPlay){

           System.out.print(StrPoker + ",");

       }

       System.out.println();

    }

}


四:异常类Throwable:两个具体的子类:Error和Exception

(1)  Error:Error(错误)表示运行应用程序中较严重问题

(2)  Exception异常分类:

1. 运行时期异常(RuntimeException):严谨导致的问题(列:NullPointerException:空指针异常!解决方案:需要个对象进行非空判断,来防止该问题的出现!)

出现的原因:可能由于我们代码的逻辑不够

2. 编译时期异常: 只要不是RuntimeException中的异常都属于编译时期异常;比如:IOException(IO流中的),ParseException(解析异常)

出现的原因:要么语法有问题,要么使用sun公司提供的一些方法中,原本会抛出异常。调用的时候必须处理。

(3)  处理异常:

1.方式一:标准格式:try...catch...finally:捕获异常!

变形格式有:try...catch

            Try...catch...catch

            Try...finally...(多线程,lock锁)

经常会使用格式:try{可能有错误的语句}catch(异常类名,变量名){输出语句处理,或者是调用printStackTrace()方法};

2.多线程处理:

A,分别try..catch…

B,try{可能有问题的代码}

catch(异常类名,变量名){处理语句}

catch(异常类名,变量名){处理语句}

………………

catch(异常类名,变量名){处理语句}

#针对多个异常进行处理,如果第一个异常为大异常,那么后面的异常就可以不用写了。防止出错。

C,针对多个异常进行处理,JDK7.0以后给出了又一种新方式:

Try{可能出现问题的语句}

catch(异常类名1 |异常类名2 …变量名){处理异常}

#注意:上述多个异常类名之间都是平级关系

              这种格式在开发中,虽然有多个异常,但是针对具体的异常应该给出具体的解决方案;

(4)    异常的第二种处理方式:

throws:抛出异常; 在方法声明上抛出异常,由于,编译时期异常,调用者必须要处理; 实际开发中,尽量的不要在main()方法抛出异常,在子方法中可以抛出异常,

#,throw和throws的区别?

Throw:后面跟的是异常对象(匿名对象)只能跟具体的一个异常类对象。Throw在方法中的语句中抛catch语句结束

Throws:后面跟的是异常类名,可以跟多个异常类名,中间用逗号隔开,throws表示在方法声明上抛出异常的可能性,由调用者去处理。

#对于多个异常,分别Try...catch(){...}

package ExceptionText_01;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

public class ExceptionText01 {

    public static void main(String[] args) {

       String Str="2017-11-22";//定义字符串格式的日期

       SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");//创建SimpleDateFormat对象

       try {

           Date date=sdf.parse(Str);

       } catch (ParseException e) {

           // TODO Auto-generatedcatch block

           System.out.println("调用SimpleDateFormatparse()方法,本身就会抛出异常:");

           //e.printStackTrace();

       }

       int []arr={12,5,3,9,8,11};

       //想获得下标为6的元素

       try {

           System.out.println(arr[6]);

       } catch (ArrayIndexOutOfBoundsException e) {

           // TODO Auto-generatedcatch block

           System.out.println("数组下标越界异常:");

           e.printStackTrace();

       }

    }

}


#多个异常Try..catch(){}catch(){}:

package ExceptionText_01;

public class ExceptionText02 {

    public static void main(String[] args) {

       int []arr={26,12,3,4};

       int a=6;

       int b=0;

    try {

           int d=arr[4];

           System.out.println(d);

           int c=a/b;

           System.out.println(c);

       } catch (ArithmeticException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

           System.out.println("该异常是除数不能为0");

       } catch(ArrayIndexOutOfBoundsException e2){

           System.out.println("该异常是数组下标越界异常");

       }

       System.out.println("over!");

    }

}


#注意:针对多个异常进行处理,如果第一个异常为大异常,也就是异常的父类,那么后面就可以不用再写了;

#多个异常的try...catch(){}用法:

package ExceptionText_01;

/**

 * 注意:catch()中的异常类名之间都是平级关系

 * */

public class ExceptionText03 {

    public static void main(String[] args) {

       int []arr={12,32,6,9};

       int a=6;

       int b=0;

       try {

           int c=a/b;

           System.out.println(c);

           int d=arr[4];

           System.out.println(d);

       } catch (ArithmeticException | ArrayIndexOutOfBoundsException e){

           // TODO Auto-generatedcatch block

           e.printStackTrace();

           System.out.println("分别是数组越界和除数不能为0的异常:");

       }

       System.out.println("over!");

    }

}


5. 捕获异常的标准格式:   try...catch...finally

用法:finally经常用在数据库和Io流中,用来释放资源,finally中的代码一定会执行,finally中的代码只有在一种情况下不会执行:JVM退出,调用system.exit(0);

#面试题:final,final,finally三者的区别?

Final:可以修饰类,该类不能被继承,

        修饰成员方法:该方法不能被重写

        修饰成员变量:变量为一个常量

Finalize:表示通过gc回收器回收不用的对象或者是变量,System.gc():实质是调用的是重写了Object类中的finalize()方法,表示回收没有更多引用对象或者变量等.

Finally:不能单独使用,会在try...catch(){…}finally语句一块使用

#面试题:

如果catch里面有return语句,那么finally里面的语句是否会执行?如果会,是在return语句之前还是在return语句之后?

会执行,且会在return语句之前执行,因为return语句形成了返回路径,所以在执行完finally中的语句之后,会回到catch语句中的return语句;

#package ExceptionText_01;

public class ExceptionText04 {

    public static void main(String[] args) {

       System.out.println(show());

    }

    public static int show(){

       int a=10;

       try {

           System.out.println(a/0);

           a=20;

       } catch (Exception e) {

           // TODO Auto-generatedcatch block

           System.out.println("这里出现了除数不能为0的异常:");

           a=30;

           return a;//这里的return语句形成了方法返回路径

       }

       finally{

           a=40;

       }

       return a;

    }


#自定义一个异常类:

测试类:

package ExceptionText_02;

import java.util.Scanner;

/**

 * 需求:自定义一个异常类,该类继承自Exception或者RuntimeException

 * 1.创建测视类,用键盘录入一个分数,

 * 2.自定义一个异常类(MyException),继承自Exception,

 * 3,定义一个具体类,该类提供一个方法,用来判断分数的有效性

 *

 * */

public class ExceptionText01 {

    public static void main(String[] args) {

       Scanner Sc=new Scanner(System.in);

       System.out.println("请输入一个分数:");

        intscore=Sc.nextInt();

       

        Stuudent s=new Stuudent();

        try {

           s.check(score);

       } catch (MyExceptionDemmo e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

           System.out.println("该方法会抛出异常;");

       }

        System.out.println("over!");

    }

}

 

自定义异常类:

package ExceptionText_02;

public class MyExceptionDemmo extends Exception {

    public MyExceptionDemmo() {

       super();

       // TODO Auto-generatedconstructor stub

    }

 

    public MyExceptionDemmo(String arg0, Throwable arg1, boolean arg2,

           boolean arg3) {

       super(arg0, arg1, arg2, arg3);

       // TODO Auto-generatedconstructor stub

    }

 

    public MyExceptionDemmo(String arg0, Throwable arg1) {

       super(arg0, arg1);

       // TODO Auto-generatedconstructor stub

    }

 

    public MyExceptionDemmo(String arg0) {

       super(arg0);

       // TODO Auto-generatedconstructor stub

    }

 

    public MyExceptionDemmo(Throwable arg0) {

       super(arg0);

       // TODO Auto-generatedconstructor stub

    }

   

}


具体类:

package ExceptionText_02;

 

public class Stuudent {

    public static int check(int a)throws MyExceptionDemmo{

       if(a<0 || a>100){

           throw new MyExceptionDemmo("分数应该在0-100之间;");

       }else{

           return a;

       }

    }

 

}


异常中的注意事项:

1.  子类在重写父类方法的时候,如果父类的该方法有抛出异常,那么子类在重写该方法的时候,不能比父类中该方法的异常大,至少应该持平.

2.  如果子类在继承父类时,父类的该方法没有抛出异常,那么子类在重写父类的方法时,不能抛出异常,只能捕获异常;

五,File类;

(1) file:文件和目录路径名的抽象表示形式。

(2) 常用的构造方法: public File(Stringpathname): 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。(开发中经常使用该构造方法)

(3) public File(File parent,Stringchild): 根据 parent 抽象路径名和 child 路径名字符串创建一个新File 实例。

(4) public File(Stringparent,String child):  根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

(5) public boolean mkdir():创建此抽象路径名指定的目录。

(6) public boolean createNewFile():该方法用来创建文件; 如果已经有这个文件了,不在创建,并且该方法本身就会编译时期异常IOException

(7) public boolean mkdirs():创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。(创建文件夹,文件夹不存在,才开始创建)

注意:调用者需要弄清楚自己想要创建的是文件夹还是文件;

       如果给定的路径名不带盘符,则默认会建在当前项目下面;

#File类成员方法的综合应用:

package FileText;

import java.io.File;

import java.io.IOException;

public class FileText_01 {

    public static void main(String[] args) throws IOException {

//     //方式一:调用File类的public File(String pathname)方法;通过给定一字符串类型的路径名来表示当前的这个文件和文件夹

//     File file=new File("e:\\JAVA\\FileDemo_01");

//     System.out.println("创建目录mkdir:" +file.mkdir());

      

//     //方法二:调用File类的public File(File parent,String child)方法;

//     File file2=newFile("e:\\JAVA\\FileDemo_01","file.txt");

//     System.out.println("在当前目录下面创建文件夹:" + file2.mkdirs());

      

       //方法三:调用File类的(3)   public File(File parent,String child)方法

//     File file3=new File("e:\\JAVA\\filedemo_02");

//     File file4=new File(file3,"a.txt");

//     System.out.println("在当前文件下创建文件夹:" + file4.mkdirs());

      

       //创建文件

       File file5=new File("e:\\JAVA\\demo");

       System.out.println("创建文件夹:" + file5.mkdirs());//创建文件夹,

       File file6=new File("e:\\JAVA\\demo\\a.txt");

       System.out.println("创建文件:" + file6.createNewFile());//创建文件,前提是的有该文件的文件夹路径

    }

}


(8) File类的删除功能

public boolean delete()删除此抽象路径名表示的文件或目录;不能删除带有文件或者文件夹的目录

注意事项: 删除的方法不能删除带有目录或者文件的文件夹删除多个目录,必须逐一删除!

#File类的删除功能综合应用:

package FileText;

import java.io.File;

import java.io.IOException;

public class FileText_03 {

    public static void main(String[] args) throws IOException {

       File file1=new File("a\\b\\c");

       System.out.println("在当前项目下创建嵌套文件夹:" + file1.mkdirs());

       File file2=new File("a\\b\\c\\a.txt");

       System.out.println("在文件夹中创建a.txt文件:" +file2.createNewFile());

      

       //需求:现在要删除这个文件及文件夹

       System.out.println(file2.delete());

       //然后删除a\\b\\下的c文件夹

       File file3=new File("a\\b\\c");//每次删除只能逐一删除,删除前要获取当前项目在的文件夹路径

       System.out.println(file3.delete());

       //再删除a\\下的b

       File file4=new File("a\\b");

       System.out.println(file4.delete());

      

       File file5=new File("a");

       System.out.println(file5.delete());

    }

}

 

(9) File类的重命名功能:

publicboolean renameTo(File dest): 重新命名此抽象路径名表示的文件。

注意:1. 当两个抽象路径一致,那么只是重命名

        2.当抽象路径不一致,该方法将剪切并改名

#File类的renameTo()方法应用:

package FileText;

import java.io.File;

import java.io.IOException;

 

public class FileText_02 {

    public static void main(String[] args) throws IOException {

//     System.out.println("先获取当前项目下的1.jpg");

//     File file1=new File("1.jpg");

//     File file2=new File("2.jpg");

//     file1.renameTo(file2);

       //当抽象路径不一样时,renameTo()功能是剪切并修改

       System.out.println("先获取当前项目下的2.jpg");

       File file3=new File("2.jpg");

       File file4=new File("e:\\JAVA\\demo\\3.jpg");

       file3.renameTo(file4);//将当前项目下的2.jpg文件拷贝到e盘下,并改名

      

    }

}


(10) File类中的获取功能:

               publicFile getAbsolutePath():获取当前文件或者文件夹绝对路径

               publicString getPath():获取相对路径

              public long length()返回由此抽象路径名表示的文件的长度

       public long lastModified()返回此抽象路径名表示的文件最后一次被修改的时间

               publicString getName():获取名称

#File类中获取功能的应用:

package FileText;

import java.io.File;

import java.io.IOException;

public class FileText_04 {

    public static void main(String[] args) throws IOException {

       File file=new File("file.txt");

       System.out.println("创建当前项目下的文件:" + file.createNewFile());

      

       System.out.println("获取当前文件的绝对路径:" + file.getAbsolutePath());

       System.out.println("获取当前文件的相对路径:" + file.getPath());

       System.out.println("获取当前文件的长度:" + file.length());

       System.out.println("返回该文件最后一次被修改的时间:" + file.lastModified());

    }

}


(11) File类中的判断功能:

        publicboolean isDirectory():判断是否是文件夹          

       public boolean isFile():判断是否是一个标准文件       

    publicboolean canRead():判断是否可读

           public boolean canWriter():判断是否可写

       public boolean isHidden():判断是否是隐藏文件

       public boolean isAbsolute():判断次路径名是否是绝对路径

#File类的判断功能综合应用:

package FileText;

import java.io.File;

import java.io.IOException;

public class FileText_05 {

    public static void main(String[] args) throws IOException {

       File file=new File("b.txt");

       System.out.println("创建当前项目下的文件:" + file.createNewFile());

      

       //需求:使用File类的判断功能

       System.out.println("判断该文件是否为文件夹:" + file.isDirectory());

       System.out.println("判断该文件是否为文件:" + file.isFile());

       System.out.println("判断该文件是否为隐藏文件:" + file.isHidden());

       System.out.println("判断该文件是否可写文件:" + file.canWrite());

       System.out.println("判断该文件是否为可读文件:" + file.canRead());

       System.out.println("判断该文件是否是绝对路径:" + file.isAbsolute());

      

    }

}


(12)File类的高级获取功能:

publicString[] list(): 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。

publicFile[] listFiles():返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。

#File高级获取功能的应用:

package FileText;

import java.io.File;

public class FileText_06 {

    public static void main(String[] args) {

       File file=new File("e:\\JAVA");//e盘下的文件封装

       //方式一:通过File类的List()方法获取该盘下的文件及目录

       String[] Str=file.list();//giant方法返回String类型的数组

       if(Str!=null){//对该数组进行非空判断

           for(String s:Str){

              System.out.println(s);

           }

       }

       System.out.println("---------------------------------");

       //方式二:通过File类的listFiles()方法,获取该盘下的文件及目录

       File[] listFiles = file.listFiles();

       if(listFiles!=null){

           for(File f:listFiles){

              System.out.println(f.toString());

           }

       }

    }

}


#获取e盘下以.jpg结尾的文件:

package FileText;

/**

 * 需求:获取e盘的JAVA文件下后缀为.Jpg结束的文件

 * 1.先创建FIle类的对象,通过它的构造方法public File(String pathname)e盘封装

 * 2.再调用File类的list()方法,e盘的文件及目录文件封装在String类型的数组中

 * 3.对该数组进行非空判断

 * 4.用增强for()循环获取每一个元素

 * 5.在调用判断功能,判断这些元素是否为文件

 * 6.在调用String类的endswith()方法

 * 7.输出以.jpg结尾的文件

 *

 * */

import java.io.File;

 

public class FileText_07 {

    public static void main(String[] args) {

       File file=new File("e:\\JAVA");

   

       File[] listFiles = file.listFiles();

      

       if(listFiles!=null){

           for(File s:listFiles){

              if(s.isFile()){

                  if(s.getName().endsWith(".jpg")){

                     System.out.println(s);

                  }

              }

             

           }

       }

    }

}

 

六:IO流

(1)  设备和设备之间的数据传输; 设备和设备指的是:硬盘和内存之间的数据传输

(2)  IO流的分类:

按流的方向分: 输入流:读数据的

                 输出流:写数据的

             按数据类型分:

                             字节流: 字节输入流:InputStream

                                    字节输出流:OutputStream

                             字符流: 字符输入流:Reader

                          字符输出流:Writer

(3)  OutputStream: 字节输出流,该类是抽象类,不能实例化,创建对象时,可以采用抽象类多态的形式: OutputStream os = newFileOutputStream("os.txt");或者直接创建其子类的对象FileOutputStream fos = newFileOutputStream("fos.txt") ;

(4)  开发步骤: 1创建文件输出流对象(FileOutputStream fos = newFileOutputStream("fos.txt") ;)

             2写数据(fos.write("hello,io,i'mcoming...".getBytes()) ;)

         3关闭资源(fos.close() ;)

(5)  输出流中写数据的方法:

public abstract void write(int b):将指定的字节写入到输出流中

public void write(byte[] b):将指定的字节数组写入到输出流中

public void write(byte[] b, int off,int len):将字节数组的一部分写入到输出流中

 

#IO流的字节输出流综合应用:

测试类:

package IOText;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

 

public class IOText_01 {

    public static void main(String[] args) {

       FileOutputStream fos = null;

       try {

           fos = new FileOutputStream("c.txt");

       } catch (FileNotFoundException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }

      

       try {

           fos.write("You are mySunshine!".getBytes());//写数据,写完后调用getBytes()方法,将字符串类型转换为字节数组类型

       } catch (IOException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }

      

       try {

           fos.close();//释放流资源,释放时候不能进行写数据,否则会出错

       } catch (IOException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }

    }

}


结果: You are mySunshine!


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值