实验六 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)设置为同步对象。
②死锁
所谓死锁,就是两个线程都在等待彼此先完成,造成程序的停滞状态。一般程序的死锁是在程序运行时出现。
通常多个线程共享同一资源时需要同步,但过多的同步操作则有可能会带来死锁问题。