一、 实验目的
1. 掌握常用的集合类,能够较为熟练的查阅Java提供的常见的类,并进行程序设计。
二、实验内容与要求
(1). 编写Java应用程序,根据用户输入的5个日期(每行一个日期),计算相邻两个日期之间间隔的时数,共4个结果(时数)。注:用户输入的日期格式为“××××年××月××日××时”。在报告中附上程序截图、完整的运行结果截图和简要文字说明。(40分)
(2). 某车站有检查危险品的机器(machine),如果发现危险品会发出警告。编程Java应用程序来模拟该机器发现危险品时发出警告的情景。具体:(i) 编写一个Exception的子类DException,该子类可以创建异常对象,该异常对象调用toShow()方法输出“属于危险品”;(ii) 编写一个Machine类,该类的方法checkBag(Goods goods)如果发现参数goods是危险品(goods的isDange属性是true)就抛出DException异常;(iii) 程序在主类的main()方法中的try-catch语句的try部分让Machine类的实例调用checkBag(Goods goods)方法,如果发现危险品就在try-catch语句的catch部分处理危险品。在报告中附上程序截图、完整的运行结果截图和简要文字说明。(40分)
三、实验过程及结果
1. 编写Java应用程序,根据用户输入的5个日期(每行一个日期),计算相邻两个日期之间间隔的时数,共4个结果(天数)。注:用户输入的日期格式为“××××年××月××日××时”。
package date;
import java.util.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Compute {
static public void main(String []args) throws ParseException{
ArrayList<String> list = new ArrayList<String>();//创建List类型的数组列表对象list,list元素均为String类型
Scanner in = new Scanner(System.in);
System.out.println("请输入日期个数:");
int n = in.nextInt();//从键盘获取日期个数n
String []str = new String[n];//创建一个长度为n的String数组str
for(int i = 0; i < n; i ++) {
System.out.printf("请输入第%d个日期(格式为:xxxx年xx月xx日xx时):\n", i + 1);
str[i] = in.next();
list.add(str[i]);//将str数组的元素添加进list
}
for(int i = 0; i < n - 1; i ++) {
test(list.get(i), list.get(i + 1));//list.get()获取列表元素,调用test()函数计算并输出相邻日期的间隔时数与天数
}
test(list.get(n - 2), list.get(n - 1));
in.close();
}
public static void test(String date1, String date2) throws ParseException{
DateFormat df = DateFormat.getDateInstance(); //DateFormat抽象类不能实例化,用getDateInstance()得到格式化对象
df= new SimpleDateFormat("yyyy年MM月dd日hh时");//获得格式化日期
Date date_1 = df.parse(date1);
Date date_2 = df.parse(date2);//parse()将字符串类型的日期解析为Date类型
long time1 = date_1.getTime();
long time2 = date_2.getTime();//getTime()返回Date对象中的时间值,单位为毫秒
long time3 = Math.abs(time1-time2);//计算两个时间值(单位为毫秒)的差的绝对值
int hour = getHour(time3);//调用getHour()方法转化为小时数
System.out.println(date1 + "与" + date2 + "间隔" + hour + "小时");
int day = getDay(time3);//调用getDay()方法转化为天数
System.out.println(date1 + "与" + date2 + "间隔" + day + "天");
System.out.println();
}
//将时间(毫秒)转化为小时数
private static int getHour(long time){
int hour = (int)(time/1000/60/60);
return hour;
}
//将时间(毫秒)转化为天数
private static int getDay(long time){
int day = (int)(time/1000/60/60/24);
return day;
}
}
2. 某车站有检查危险品的机器(machine),如果发现危险品会发出警告。编程Java应用程序来模拟该机器发现危险品时发出警告的情景。具体:(i) 编写一个Exception的子类DException,该子类可以创建异常对象,该异常对象调用toShow()方法输出“属于危险品”;(ii) 编写一个Machine类,该类的方法checkBag(Goods goods)如果发现参数goods是危险品(goods的isDange属性是true)就抛出DException异常;(iii) 程序在主类的main()方法中的try-catch语句的try部分让Machine类的实例调用checkBag(Goods goods)方法,如果发现危险品就在try-catch语句的catch部分处理危险品。
package exception;
class Goods{ //定义Goods类
public boolean isDange; //定义商品危险属性isDange
public Goods(boolean isDange){ //带参构造方法
this.isDange = isDange;
}
}
class DException extends Exception{ //自定义异常类
private static final long serialVersionUID = 1L;
Goods goods; //定义Goods类对象goods为自定义异常类的成员变量
public DException(Goods goods){ //自定义异常类的构造方法
this.goods = goods;
}
public void toShow() { //toShow()方法
System.out.println("属于危险品");
}
}
class Machine{ //定义Machine类
public void checkBag(Goods goods) throws DException{//由方法抛出异常
//若isDange属性为true,即为危险品,抛出DException异常
if(goods.isDange == true) {
throw new DException(goods);
}
//若不是危险品,输出对应信息
else {
System.out.println("不属于危险品");
}
}
}
public class Test { //主类
static public void main(String []args) {
Goods goods = new Goods(false); //创建goods对象,设置isDange属性
Machine machine = new Machine(); //创建machine对象
try {
machine.checkBag(goods); //调用Machine类的checkBag()方法,判断参数goods是否为危险品
}
catch(DException de) { //捕获由checkBag()方法抛出的DException异常
de.toShow(); //调用toShow()方法处理危险品or输出非危险品的提示信息
}
Goods goods2 = new Goods(true);
try {
machine.checkBag(goods2);
}
catch(DException de){
de.toShow();
}
}
}