【JAVA学习笔记】15 collection集合、 exception异常

2018.4.17

collection

Object数组

数组:保存大量数据采用的方式。

8大基本数据类型 byte 1字节 short 2 int 4 long 8 float 4 double 8 char 2 boolean 不计
	自定义类对象:Student Player 
	java中的类对象 String

数组局限性:

1.只能保存一种数据类型的数据。
 		2.数组的元素个数创建时是确定的,无法对当前数组进行元素个数修改。(此前是新建数组赋值过去)
 		3.数组里面保存的元素内存空间是连续的。


 			
 	问题:
 		如果我需要保存任意类型的一个数组,所有的数据类型都可以在这个数组中保存。
 		
 		用Object数据类型,因为Object是java中所有类的直接父类或者间接父类 基类/根类
  
  
        public class Demo1 {
        	public static void main(String[] args) {
        		//创建了一个数据类型的Object数组,元素个数为5
        		Object[] arr = new Object[5];
        		
        		arr[0] = "过年放假通知已经下来了,我不能告诉你们";
        		arr[1] = 8;
        		arr[2] = 0.5f;
        		arr[3] = new Demo1();//如果当你没有自定义构造方法,那么java编译器会默认提供一个无参的构造方法
        		arr[4] = true;
        		
        		System.out.println(Arrays.toString(arr));
        		
        		}
        }
结果:

    [过年放假通知已经下来了,我不能告诉你们, 8, 0.5, com.bitware.collection.Demo1@69066caf, true]

集合

重点知识:

【集合】    集合就是存储对象的【容器】
	
	
	---| Collection 集合的总【接口】,规定了很多方法,要求所有【遵从】该接口的类,全部实现。
	------|List 接口	如果【遵从】了List接口,要求实现所有List中的方法。,具有List集合的特征:
				有序(添加顺序),可重复
	------|Set	接口	如果【遵从】了Set接口,要求实现所有Set中的方法。,具有Set集合的特征:
				无序(添加顺序),不可重复


	从Collection开始学习,学习完Collection里面的方法,基本上ListSet就是在基础之上做一个
	添加操作

[背过]

add(Object o);//添加一个元素 任意类型
  			addAll(Collection c); //添加另一个集合
  		删
  			clear();//清空整个集合
  			remove(Object o);//删除该集合中指定的元素
  			removeAll(Collection c);//删除两个集合中的交集
  			
  			retainAll(Collection c);//保留两个集合中交集
  		查
  			size();//获取当前集合的有效元素个数。
  			toArray();//把当前集合中所有的元素转换成Object类型的数组返回
 

       public class Demo2 {
		public static void main(String[] args) {
			//Collection是一个接口,而接口是没有自己的类对象的,但是可以指向【遵从】改接口的类对象。(多态)
			//借助于最常用集合ArrayList来完成。
			Collection c = new ArrayList();
			
			//添加方法 add(object o)
			c.add("测试");
			c.add("天气好热");
			c.add("明天气温0-8");
		
			System.out.println(c);
			//添加方法 addAll(Collection c)
			Collection c2 = new ArrayList();
			
			c2.add("测试1");
			c2.add("卡布奇诺");
			c2.add("天气好热");
			
			//将C2添加到C中
			c.addAll(c2);
			
			System.out.println(c2);
			
		System.out.println(c);
			//clear() 清空集合中所有元素
			//c2.clear();
			//System.out.println(c2);
			
			//remove(Object o)
			//c.remove("测试");
			//System.out.println(c);
			
			//removeAll(Collcetion c)
			//c.remove(c2);
			//System.err.println(c);
			
			//retainAll(Collection c)
			c.retainAll(c2);
			System.out.println(c);
			System.out.println(c.size());
			
			System.out.println(Arrays.toString(c.toArray()));
		}
}   

结果:    
    [测试, 天气好热, 明天气温0-8]
    [测试1, 卡布奇诺, 天气好热]
    [测试, 天气好热, 明天气温0-8, 测试1, 卡布奇诺, 天气好热]
    [天气好热, 测试1, 卡布奇诺, 天气好热]
    4
    [天气好热, 测试1, 卡布奇诺, 天气好热]

【背过】

判断方法:
	isEmpty();//是否为空
	contains(Object o);//是否包含当前元素
	containsAll(Collection c);//是否包含指定集合里面的所有元素
	
	equals(Collection c); // 判断是否想相等


    public class Demo3 {
    	public static void main(String[] args) {
    		Collection c = new ArrayList();
    		
    		c.add("akm");
    		c.add("kar98k");
    		c.add("aug");
    		c.add("m164");
    		c.add("ump9");
    		
    		Collection c2 = new ArrayList();
    		
    		c2.add("akm");
    		c2.add("kar98k");
    		c2.add("aug");
    		c2.add("m164");
    		c2.add("ump9");
    		
    		//equals方法,比较这两个集合之间里面的元素是否完全相同
    		//放入的位置也会要求
    		System.out.println(c.equals(c2));
    		
    		//isEmpty方法
    		c2.clear();
    		//c2.add("p92");
    		//System.out.println(c2.isEmpty());
    		
    		//contains(object o)
    		System.out.println(c.contains("aug"));
    		System.out.println(c.contains("p92"));
    		
    		//containsAll(Collection c);判断传入的集合是否是当前集合的子集合。
    		System.out.println(c.containsAll(c2));
    		
    		
    		
    	}
    }
结果:
    true
    true
    false
    true

高级版本的参数合法性处理方式

try-catch使用的注意事项
	1.在没有捕获异常的情况下,程序中一旦发生了异常,程序就会在发生异常的地方停下来,不会继续执行后面的代码。
	 		
	2.一旦异常被Try-catch结构捕获,那么java虚拟机就会认为当前代码中不存在异常,可以继续运作。

	3.try-catch语句块里面,如果出现了多种异常,这里可以加上多个catch语句块,对不同的异常做区别对待。
	
	4.try-catch语句块中,如果存在大范围的异常,通常会放到整个catch语句块最后一个,如果放到前面
	可能会导致之后的catch捕获无效。放到最后的这样的异常处理模块,是当前整个代码的异常的最终处理方案。
	
	eg:到医院看病,看病,发烧按照感冒发烧处理,不能到了医院就做手术。

            public class Demo3 {
            	public static void main(String[] args) {
            	
            			test(1,0,null);
            		
            }
            	public static void test(int num1, int num2,int [] arr){
            		int ret = 0;
            		
            		try {
            			ret = num1 / num2;
            			arr[0] = 5;
            		}catch(ArithmeticException e) {//算术异常
            			e.printStackTrace();
            		}catch(NullPointerException e) {//指针异常
            			e.printStackTrace();
            		}catch(Exception e) {//放到最后的所有异常的最终处理方法
            			e.printStackTrace();
            		}
            		System.out.println("这条代码会允许吗??");
            	}
            	
            }
    结果:
        java.lang.ArithmeticException: / by zero
        	at com.bitware.exception.Demo3.test(Demo3.java:27)
        	at com.bitware.exception.Demo3.main(Demo3.java:20)
        这条代码会允许吗??

java异常处理 抛出异常。

使用关键字 throwthrows
     
     throw是用来在方法中用来抛出异常的关键字
     		格式:throw new 异常类型();
     
    一旦在代码中有抛出异常,要求在方法声明之后添加throws,表示当前抛出的异常有哪些?
 		方法(参数) throws 异常类型。

使用抛出异常的注意事项:

1.如果在代码中存在throw new 异常类型();该语句,那么这条语句之后的代码是不会执行的。
 	2.如果代码中存在多种异常需要抛出,不能把异常写到同一个代码块中,否则只能处理一个异常,
 	剩下的异常都会变成unreachable code.
 	3.不同的异常分情况抛出,需要使用if-else if结构,在不同的if块中,抛出不同的异常。
 	4.如果代码中出现了多种异常,需要在函数之后声明,不同的声明用逗号隔开即可。

捕获异常和抛出异常:

捕获在哪里都可以,但是抛出异常一旦涉及到用户层面的,一定不能抛出,必须捕获。

        public class Demo4 {
        	public static void main(String[] args)
        			throws NullPointerException,ArithmeticException{
        		//如果调用一个存在抛出异常的方法,通常有两种处理方式,
        		//第一种处理当前异常。
        /*		try {
        		testThrow(null, 1, 2);
        		}catch(NullPointerException e) {
        			e.printStackTrace();
        		}catch(ArithmeticException e) {
        			e.printStackTrace();
        		}
        */		
        		//第二种方式:继续往外抛
        		testThrow(null, 1, 2);
        		
        		
        	}
        	/**
        	 * 
        	 * @param arr
        	 * @exception NullPointerException
        	 */
        	public static void testThrow(int[] arr,int num1, int num2) throws NullPointerException,ArithmeticException {
        		//参数合法性判断
        		if(null == arr || arr.length == 0) {
        			//之前的处理方案,打印错误,停止函数。
        			//System.out.println("");
        			//return;
        			throw new NullPointerException("测试一下throw");//戛然而止 跳出去让外面处理
        			
        			//System.out.println(""); unreachable code.
        			
        		}else if (0 == num2) {
        			throw new ArithmeticException();
        		}
        		int ret = num1 / num2;
        		arr[1] = 0;
        		
        		
        	}
        }
  结果:
    Exception in thread "main" java.lang.NullPointerException: 测试一下throw
	at com.bitware.exception.Demo4.testThrow(Demo4.java:56)
	at com.bitware.exception.Demo4.main(Demo4.java:41)

自定义异常类

class 自定义异常类名 extends Exception {

	public 自定义异常类名(String message) {
			super(message);
	}
}

    class NoGirlFriendException extends Exception {
    	
    	//String message 是当前异常的详细信息,用来传递给Exception的构造方法,保存改异常信息
    	public NoGirlFriendException(String message) {
    		super(message);
    	}
    }
    
    public class Demo5 {
    	public static void main(String[] args) throws NoGirlFriendException {
    		//第一种try catch
    		try {
    			buyOneFreeOne(false);
    		} catch (NoGirlFriendException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		//第二种 声明后throws.
    		buyOneFreeOne(true);
    	}
    	//要在函数方法声明的末尾添加该异常,用 throws关键字。
    	public static void buyOneFreeOne(boolean isLonely) throws NoGirlFriendException {
    		if(isLonely) {
    			//直接创建自定义异常的匿名类对象,通过throw关键字抛出
    			throw new NoGirlFriendException("不用了谢谢,没有女票");
    		}
    		System.out.println("买一送一来一份。");
    	}
    }
结果:
    买一送一来一份。
    Exception in thread "main" com.bitware.exception.NoGirlFriendException: 不用了谢谢,没有女票
	at com.bitware.exception.Demo5.buyOneFreeOne(Demo5.java:40)
	at com.bitware.exception.Demo5.main(Demo5.java:34)

猜你喜欢

转载自blog.csdn.net/u013182992/article/details/80453142