实验报告(六)
一.实验目的
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接口,则可以方便的实现资源的共享。 **