• 第八周课程总结&实验报告(六)


    实验报告(六)

    一.实验目的

    1.理解异常的基本概念;
    2.掌握异常处理方法及熟悉常见异常的捕获方法。

    二.实验要求

    1.练习捕获异常、声明异常、抛出异常的方法、熟悉try和catch子句的使用。
    2.掌握自定义异常类的方法。

    三.实验内容

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

    (1)实验代码:

    package 测试;
    
    public class 测试0 {
    
    	public static void main(String[] args) {
    		System.out.println("准备出现ArrayIndexOutOfBoundsException异常");
    		try {
    			int a[]= {1,2,3};
    			for(int i=0;i<4;i++) {
    				System.out.println(a[i]);
    			}
    		}catch(Exception e) {
    			System.out.println("数组越界: "+e);
    		}finally {
    			System.out.println("不管是否出现异常,都执行此代码");
    		}
    		System.out.println("结束");
    	}
    
    }
    
    

    (2)实验运行结果截图:

    (3)实验大致思路:

    运用try-catch-finally的格式,在try里编写会造成数组越界的语句,用catch捕获异常并输出,再用finally确定证明这个代码确实运行了.

    (4)实验中遇到的问题:

    一开始不清楚ArrayIndexOutOfBoundsException是什么,查了一下才知道是数组如果索引为负或大于等于数组大小,则该索引为非法索引.搞清楚之后就简单了,直接仿照书上编写,最初是弄了个空数组,再把索引弄成负数,但是我觉得这样没有输出不太好,就直接让索引大于数组了.

    2.自定义异常类的使用:

    车站检查危险品的设备,如果发现危险品会发出警告。编程模拟设备发现危险品。

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

    (1)实验代码:

    DangerException类:

    package 测试;
    
    public class DangerException extends Exception {
        String massage;
        public DangerException(){
            this.massage="危险物品";
        }
        public void toShow(){
            System.err.println(massage);
        }
    }
    
    

    Machine类

    package 测试;
    
    public class Machine {
        public void checkBag(Goods goods) throws DangerException{
            if(goods.isDanger){
                DangerException danger=new DangerException();
                throw danger;
            }
            else {
                System.out.println(goods.getGoods()+"不是危险物品");
            }
        }
    }
    
    

    Goods类

    package 测试;
    
    public class Goods {
    	String goods;
    	boolean isDanger;
    	public Goods(String goods) {
    		this.goods = goods;
    	}
    	public String getGoods() {
    		return goods;
    	}
    	public void setGoods(String goods) {
    		this.goods = goods;
    	}
    	public boolean isDanger() {
    		return isDanger;
    	}
    	public void setDanger(boolean isDanger) {
    		this.isDanger = isDanger;
    	}
    	
    }
    
    

    实验运行

    package 测试;
    import java.util.Scanner;
    import java.util.ArrayList;
    public class 测试0 {
    
    	public static void main(String[] args) {
    		System.out.println("请输入检查的物品:");
    		ArrayList<String> array=new ArrayList<String>();
    		array.add("枪支");
    		array.add("zhayao");
    		array.add("管制刀具");
    		array.add("毒害品");
    		array.add("腐蚀性物品");
    		array.add("放射性物品");
    		
    		 Scanner input=new Scanner(System.in);
    		 String str=input.next();
    		 Goods goods=new Goods(str);
    		 goods.setDanger(false);
    		 Machine mac=new Machine();
    		 
    		 for(int i=0;i<array.size();i++) {
    			 if(array.get(i).equals(str)) {
    				 goods.setDanger(true);
    				 break;
    			 }
    		 }
    		 
    		 try {
    			 mac.checkBag(goods);
    		 }catch(DangerException e){
    			 e.toShow();
    			 System.out.println(goods.getGoods()+"是危险物品");
    		 }
    		 	 
    	}
    
    }
    
    

    (2)实验运行结果截图:

    危险物品

    不是危险物品

    (3)实验大致思路:

    分别定义多个类,用于判断是否为危险物品的Goods类,用于抛出异常的Machine类,还有异常类DangerException类以及用于输入输出的主类 测试0 ,在主类中定义危险物品的"名单",再输入物品然后判断是否在"名单"上,通过改变goods中isDanger的属性来判断是否为危险物品,最后运行try-catch语句调用checkBag(Goods goods)的方法,如果发现危险品就在try-catch语句的catch部分处理危险品.

    (4)实验中遇到的问题:

    在写代码的时候有些混乱,对于自定义异常还是没能够很好的理解,在处理这些多个类比较容易弄杂,不过知道了一种新的用法ArrayList类,很方便的能增加"危险物品",还有就是之前异常类里输出的我用的是System.out.println,发现输出的是黑色的字,把out改成err就可以了,但是不是很清楚这是怎么回事,这类输出除了out,err应该是还有别的,但是我不知道,要学和要了解的还是太多了

    (5)写博客中遇到的问题

    写的差不多的时候提交就出现了这个问题,不过也不好改代码还有截图了,就直接把代码里的zhayao替换成拼音了(我人傻了,还有这种情况)

    第八周课程总结

    本周主要学习了异常类还有多线程

    这周学习的内容:

    1.异常的定义

    异常是导致程序中断运行的一种指令流,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失,所以在程序的设计中必须要考虑各种异常的发生,并正确的做好相应的处理,这样才能保证程序正常的执行

    2.异常处理格式

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

    3.异常类的继承结构

    在整个java的异常结构中,实际上有以下两个最常用的类:Exception、Error,这两个类全都是Throwable的子类

    • Exception:一般表示的是程序中出现的问题,可以直接使用try…catch处理。
    • Error:一般指的是JVM错误,程序中无法处理

    4.Java的异常处理机制

    在整个java的异常处理中,实际上也是按照面向对象的方式进行处理,处理的步骤如下:

    • 一旦产生异常,则首先会产生一个异常类的实例化对象;
    • 在try语句中对此异常对象进行捕捉;
    • 产生的异常对象与catch语句中的各个异常类型进行匹配,如果匹配成功,则执行catch语句中的代码。

    5.throws关键字和 throw关键字

    在定义一个方法的时候可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用处进行处理 。
    throws使用格式

    public 返回值类型 方法名称(参数列表…) throws 异常类{}
    

    与throws不同的是,可以直接使用throw抛出一个异常。抛出的时候直接抛出异常类的实例化对象即可。

    抛出异常

    public class ThrowDemo01 {
    	public static void main(String args[]){
    		try{
    			throw new Exception("自己抛出的异常!") ;
    		// 抛出异常的实例化对象
    		}catch(Exception e){							// 捕获异常
    			System.out.println(e);
    		}
    	}
    }
    
    

    6.自定义异常类

    在Java中已经提供了大量的异常类,但是这些异常类有些时候也很难满足开发者的要求,所以此时用户可以根据自己的需要定义自己的异常类,定义异常类,只需要继承Exception类即可。

    class MyException extends Exception{	// 自定义异常类,继承Exception类
    	public MyException(String msg){	// 构造方法接收异常信息
    		super(msg) ;			// 调用父类中的构造方法
    	}
    }
    public class DefaultException {
    	public static void main(String args[]) {
    		try{
    			throw new MyException("自定义异常。") ;	// 抛出异常
    		}catch(Exception e){			// 异常处理
    			System.out.println(e) ;
    		}
    	}
    }
    
    

    7.进程与线程

    • 进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程。
    • 多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。

    8.Java中线程的实现

    在Java中要想实现多线程代码有两种手段:

    • 一种是继承Thread类
    • 另一种就是实现Runnable接口

    (1).继承Thread类:
    Thread类是在java.lang包中定义的,一个类只要继承了Thread类,此类就称为多线程操作类。在Thread子类之中,必须明确的覆写Thread类中的run()方法,此方法为线程的主体。
    多线程的定义语法:

    class 类名称 extends Thread{		// 继承Thread类	
    		属性… ; 			// 类中定义属性	
    		方法… ; 			// 类中定义方法	
    		 // 覆写Thread类中的run()方法,此方法是线程的主体
    		public void run(){			
    			线程主体;
    		}
    	}
    

    (2).实现Runnable接口

    在Java中也可以通过实现Runnable接口的方式实现多线程,Runnable接口中只定义了一个抽象方法:

    public void run() ;
    

    通过Runnable接口实现多线程:

    class 类名称 implements Runnable{	// 实现Runnable接口
    		属性… ; 			// 类中定义属性	
    		方法… ; 			// 类中定义方法	
    		public void run(){            	// 覆写Runnable接口里的run()方法		线程主体 ; 
    		}
    	}
    
    

    Thread类和Runnable接口的区别:

    **实际上Thread类和Runnable接口之间在使用上也是有所区别的,如果一个类继承Thread类,则不适合于多个线程共享资源,而实现了Runnable接口,则可以方便的实现资源的共享。 **

  • 相关阅读:
    One special dictionary
    What is mobile platform?
    Linux 学习 二, 安装JDK
    Design Pattern ->Abstract Factory
    Entity Framework 使用注意:Where查询条件中用到的关联实体不需要Include
    在使用ICSharpCode.SharpZipLib进行目录压缩后,再解压缩是提示这个错误Size mismatch: 4294967295;126976 70202;126976
    在C#中利用SharpZipLib进行文件的压缩和解压缩收藏
    JavaScript中的匿名函数及函数的闭包
    让ConfigurationManager打开任意的配置文件
    C# 读取与修改配置文件
  • 原文地址:https://www.cnblogs.com/zhuwanxing/p/11696582.html
Copyright © 2020-2023  润新知