zoukankan      html  css  js  c++  java
  • 第八周课程总结&实验报告(六)

    课程总结
    一、异常
    异常处理的格式

    try{
            //有可能出现异常的语句
    }catch(异常类 异常对象){
           //编写异常的处理语句
    }[catch(异常类 异常对象){
           //编写异常的处理语句
    }...]
    [finally{
           一定会运行盗的程序代码;
    }]
    

    二、throws与throw关键词
    在定义一个方法时可以用throws关键词声明,使用throws声明的方法表示此方法不处理,而交给方法的调用进行处理

    class Math{
             public int div(int i,int j)throws Exception{                        //本方法中可以不处理异常
                     int tem=i/j;                                                              //此处有可能产生异常
                     return temp;                                                           //返回计算结果
          }
    }
    public class ThrowsDemo{
          public static void main (String args[]){
            Math m= new Math();                                                       //实例化Math对象
            try{
                     System.out.println("除法操作:"+m.div(10,2));
           }catch(Exception e){
                e.printStackTrace();                                                      //打印异常
           }
       }
    }
    

    在上面代码中,不管是否有问题,都要使用try...catch块进行异常的捕获与处理,与rhrows关键词不同的是throw可以直接使用抛出一个异常,抛出时直接抛出异常类的实例化对象即可。

    三、多线程
    Java中线程的实现包括①继承Thread类②实现Runnable接口 Thread是不共享变量的,Runnable是共享变量的
    一个类只要继承了Thread类,此类就称为多线程操作类,所以在Thread子类中,必须明确地覆写Thread类中run()方法

    线程启动:
    Thread类

    class My Thread extends Thread{                                               //继承Thread类
         private String name;                                                               //在类中定义一个属性
         public MyThread(String name){                                             //通过构造方法设置属性内容
               this.name =name;                                                            //为name属性赋值
         }
    public void run(){                                                                         //覆写Thread类中run()方法
           for(int i=0;i<10;i++){                                                             //循环输出10次
                 System.out.println(name +“运行,i=”+i);
           }
       }
    };
    public class ThreadDemo{
           public static void main(String args[]){
                  MyThread mt1 =new MyThread("线程A");                     //实例化对象
                  MyThread mt2 =new MyThread("线程B");                     //实例化对象
                  mt1.start();                                                                     //启动多线程
                  mt2.start();                                                                     //启动多线程
             }
    }
    

    在线程启动时虽然调用的是start()方法,但实际上调用的确实run()方法的主体,那为什么在启动线程时,为什么必须通过start()方法启动,而不能直接调用run()方法呢
    首先 start()方法在Thread类中定义

    public synchronized void start(){
            if (threadStatus !=0)
                  throw new IllegalThreadStateException();
          ...
          start();
          ...
    }
    private native void start0();
    

    从中可以知道在一个类中的start()方法调用时矿难会抛出“IllegalThreadStateException”的异常,一般重复调用start()方法的时候会抛出这个异常,而实际上此处真正调用的是start()方法
    如果一个类通过继承Thread类来实现,那么只能调用异常start()方法,如果调用多次,则会抛出“IllegalThreadStateException”异常

    实现Runnable接口

    class MyThread implements Runnable{                                                 //实现Runnable接口
                   属性... ;                                                                                      //类中i定义属性
                   方法... ;                                                                                      //类中定义方法
                   public void run(){                                                                       //覆写Runnable接口中的run()方法
              -        线程主体;
              }
    }
    

    synchronized关键词 可以同步对象 ,但是在同步中如果条件矛盾会出现死锁

    实验六 Java异常
    实验目的
    理解异常的基本概念;
    掌握异常处理方法及熟悉常见异常的捕获方法。
    实验要求
    练习捕获异常、声明异常、抛出异常的方法、熟悉try和catch子句的使用。
    掌握自定义异常类的方法。

    实验内容
    编写一个类,在其main()方法中创建一个一维数组,在try字句中访问数组元素,使其产生ArrayIndexOutOfBoundsException异常。在catch子句里捕获此异常对象,并且打印“数组越界”信息,加一个finally子句,打印一条信息以证明这里确实得到了执行。
    源代码

    package test;
    
    public class Demo {
    
    	public static void main(String[] args) {
    		int a[]=null;
    		a=new int [3];
    		try {
    			for(int i=1;i<=4;i++) {
    				System.out.println(a[i]); 
    				
    		}
    			for(int i=1;i<=4;i++) {
    				a[i]=i+3; 
    			}
    			System.out.println(a[4]);
    		
    		}
    		catch(ArrayIndexOutOfBoundsException e) {
    			System.out.println("数组越界:"+e);
    		}
    		finally {
    			System.out.println("异常得到了处理");
    		}
    
    }
    }
    

    实验截图:

    自定义异常类的使用
    车站检查危险品的设备,如果发现危险品会发出警告。编程模拟设备发现危险品。
    技术方案:
    编写一个Exgeption的子类DangerException,该子类可以创建异常对象,该异常对象调用toShow()方法输出“危险物品”。编写一个Machine类,该类的方法checkBag(Goods goods)当发现参数goods是危险品时(goods的isDanger属性是true)将抛出DangerException异常。
    程序在主类的main()方法中的try-catch语句的try部分让Machine类的实例调用checkBag(Goods goods)的方法,如果发现危险品就在try-catch语句的catch部分处理危险品。

    源代码

    package yichang;
    
    import java.util.*;
    
    public class DangerException extends Exception {
    	public void toShow() {
    		System.err.print("属于危险物品");
    	}	
    }
    
    class Machine{
    	public void checkBag(boolean good)throws DangerException{
    		if(good) {
    			DangerException DE=new DangerException();
    			throw DE;
    		}
    	}
    }
    
    class Goods{
    	String name;
    	boolean IsDanger;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public boolean isIsDanger() {
    		return IsDanger;
    	}
    	public void setIsDanger(boolean isDanger) {
    		IsDanger = isDanger;
    	}
    }
    class Text {
    
    	public static void main(String[] args) {
    		Scanner input =new Scanner(System.in);
    		int flag=0;
    		String check=input.nextLine();
    		Machine m=new Machine();
    		String name[]= {"AK47","RPG","激光枪","硫酸","冰毒"};
    		Goods g=new Goods();
    		for(int i=0;i<name.length;i++) {
    			if(check.equals(name[i])) {
    				g.setIsDanger(true);
    				g.setName(name[i]);
    				flag=1;
    			}
    		}
    		if(flag==1) {
    			try {
    				m.checkBag(g.IsDanger);
    			}
    			catch(DangerException e) {
    				System.out.print(check);
    				e.toShow();
    			}
    		}
    		else {
    			System.out.println(check+"不属于危险物品");
    		}
    
    	}
    
    }
    

    实验截图:

  • 相关阅读:
    LeetCode 515. 在每个树行中找最大值(Find Largest Value in Each Tree Row)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 1022. 从根到叶的二进制数之和(Sum of Root To Leaf Binary Numbers)
    LeetCode 897. 递增顺序查找树(Increasing Order Search Tree)
    LeetCode 617. 合并二叉树(Merge Two Binary Trees)
    LeetCode 206. 反转链表(Reverse Linked List) 16
    LeetCode 104. 二叉树的最大深度(Maximum Depth of Binary Tree)
    LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15
    LeetCode 108. 将有序数组转换为二叉搜索树(Convert Sorted Array to Binary Search Tree) 14
  • 原文地址:https://www.cnblogs.com/edg4396/p/11697529.html
Copyright © 2011-2022 走看看