暮色苍然

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

实验六 Java异常

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

 

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

实验代码:

 1 package defult;
 2 
 3 public class arry {
 4 
 5     public static void main(String[] args) {
 6         int arry[]=null;
 7         arry=new int[9];
 8         try {
 9             for(int i=0;i<=10;i++) {
10                 arry[i]=i;
11             }
12         }
13         catch(Exception e) {
14             System.out.println("数组越界");
15         }finally {
16             System.out.println("操作执行");
17         }
18     }
19 }

实验结果:

 

 

本题没有什么难度,因此没有错误截图

 

  • 自定义异常类的使用

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

技术方案:

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

实验代码:

 1 package dangerchecksimulator;
 2 import java.util.*;
 3 
 4 class DangerException extends Exception{  //继承Exception类
 5     public void toShow() {
 6         System.err.println("是危险物品");  //显示处理结果
 7     }
 8 }
 9 class Goods{
10     String name;    //声明name,用于储存待检查物品的名字
11     boolean isDanger;  //用于储存物品的危险属性
12     
13     public void setName(String name) {  //获得待处理物品的名字
14         this.name=name;
15     }
16     public String getName() {
17         return name;
18     }
19     public void setDanger(boolean danger) {  //获得危险属性
20         this.isDanger=danger;
21     }
22     public boolean getDanger() {
23         return isDanger;
24     }
25 }
26 class Machine{
27     
28     public void checkBag(boolean good) throws DangerException{  //检查并抛出错误
29         if(good) {
30             DangerException dgexception=new DangerException();   //新建错误
31             throw dgexception;    //抛出错误至DangerException类
32         }
33     }
34 }
35 public class Text1 {
36 
37     public static void main(String[] args) {
38         Scanner input=new Scanner(System.in);   
39         int flag=0;
40         String check=input.nextLine();  //输入待检查物品的名字
41         Machine machine=new Machine();
42         String name[]= {"汽油","枪支","管制刀具","炸弹","煤气罐"};  //声明危险物品名单
43         Goods good=new Goods();   //实例化Goods
44         for(int i=0;i<name.length;i++) {
45             if(check.equals(name[i])) {
46                 good.setDanger(true);   //将危险属性改为true
47                 good.setName(name[i]);  //将待处理物品的名字传到Goods类
48                 flag=1;   //更改判定点
49             }    
50         }
51         if(flag==1) {
52             try {
53                 machine.checkBag(good.isDanger);
54             }
55             catch(DangerException e){
56                 System.out.print(check);
57                 e.toShow();
58             }
59         }
60         else {
61             System.out.println(check+"不是危险物品");  //通过检查
62         }
63     }
64 }

实验结果:

 

2-1,检查出危险物品

 

 

2-2,未检查出危险物品

 

本题相较上一题而言难度提升了不少,我在编写代码之前思路一直都不清晰,所以我参考了同班的大佬的思路,同时也增加了一些自己的想法。以下附上该大佬的代码链接https://www.cnblogs.com/neir/p/11693359.html

 

第八周学习总结:

本周主要学习了以下几个重要的知识点:1,异常的捕获及处理  2,多线程

 

一,异常

   

1,异常的基本概念

       异常是导致程序中断运行的一种指令流,如果不对异常进行正确的处理,可能会导致程序的中断执行。

 

2,异常的处理方式

   异常通常有三种处理方式:①立刻处理  ②延后处理  ③不处理

   ①,②种方式都可以一定程度上的解决异常,而第③种则是在一些异常低概率出现的情况下进行的一种处理方式。有时如果异常出现的概率很低,且该异常处理起来极其麻烦,那么为了效率我们可以不对该异常进行处理。有时不处理异常也不失为一种有效的解决问题的方式。

 

3,在程序中使用异常处理

   ①异常处理格式:

  

 1      try{
 2 
 3        //有可能出现异常的语句
 4 
 5        }catch(异常类 异常对象){
 6 
 7            //编写异常的处理语句
 8 
 9 }finally{
10 
11     //一定会运行的程序代码
12 
13 }

 

 

try用于捕获可能出现的异常代码,catch用于找到匹配的异常类型进行相应的处理。finally可作为异常的统一出口。注意,finally是可以省略的。

 

一个catch语句只能处理一种与之相配的异常处理类,因此我们可以直接使用所有异常类的父类Exception类作为异常处理类,这样就可以用一个catch处理所有类型的异常了。

 

4,throws和throw关键字

   ①throws关键字

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

       throws使用格式

     

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

 

    ②throw关键字

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

 

5,Exception类和RuntimeException类 

    (1)Exception在程序中必须使用try...catch进行处理

    (2)RuntimeException类可以不使用try...catch进行处理,但如果有异常产生,则异常将由JVM进行处理。

   

6,自定义异常类

  

   我们定义自己的异常类时只需要让自定义的异常类成为Exception   RuntimeException类的子类即可。

 

 

二,多线程

       (1)线程与进程

      

 

 

 

(2)java中线程的实现

       ①继承Thread类

    

 1  class 类名称 extends Thread{
 2 
 3        属性...
 4 
 5        方法...
 6 
 7        public void run(){
 8 
 9             线程主体;
10 
11         }
12 }

 

注意:我们要想正确地启动线程,是不能直接调用run()方法的,而是直接调用从Thread类中继承而来的start()方法。

 

  (3)同步与死锁

          如果一个多线程的程序是通过Runable接口实现的,则意味着类中的属性将被多个线程共享。因此,如果多个线程要操作同一资源时,就有可能出现资源同步的问题。

          所谓同步,是指多个操作在同一个时间段内只能有一个线程进行,其他线程要等待此线程完成之后才可以继续执行。

         

       ①使用synchronized关键字实现同步

       

1   synchronized(同步对象){
2       需要同步的代码;
3 }

 

使用同步代码块时必须指定一个需要同步的对象,但一般都将当前对象(this)设置为同步对象。

②死锁

  所谓死锁,就是两个线程都在等待彼此先完成,造成程序的停滞状态。一般程序的死锁是在程序运行时出现。

通常多个线程共享同一资源时需要同步,但过多的同步操作则有可能会带来死锁问题。

 

posted on 2019-10-18 18:51  暮色苍然  阅读(343)  评论(0编辑  收藏  举报