目录
实验五 异常处理、I/O与JavaFX
实验目的
掌握异常处理的语句、异常的几种类型和解决方法
掌握建立、读取文件的方法
熟悉File类、字节流、字符流的使用
熟悉JavaFX的基本应用
实验内容
读取项目文件夹下Gettysburg.txt的内容,并统计单词个数,使用JAVAFX进行单词词频的体现。具体要求如下:
- IOprocessing类继承Application类。
- readfile(String filename)方法实现文件内容的读取。
- count()方法实现单词的计数。
- start(Stage primaryStage)方法中调用count()方法,并实现条形图的词汇频率统计表,横坐标为单词,纵坐标为单词出现的次数。
代码框架如下:
public class IOprocessing extends Application{
public static String readfile(String filename){
}
public static HashMap<String,Integer> count(){
}
@Override
public void start(Stage primaryStage) throws Exception {
}
public static void main(String[] args) { }
}
实验设计的思路与考量
异常类型
异常是对象,而对象都采用类来定义。异常的根类是java.lang.Throwable。在编写程序时,如idea、Eclipse等编程软件会自动识别会异常的类型,并主动抛出,但是自己编写代码的时候还是需要知道异常的类型。我们常见的异常类型如下所示:
捕获异常
当抛出异常时,可以在try-catch块中捕获和处理它。如下所示:
try {
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{}
需要注意的是:
- 从一个通用的父类可以派生出各种异常类。如果一个catch块可以捕获一个父类的异常对象,它就能捕获那个父类的所有子类的异常对象。
- 在catch块中异常被指定的顺序是非常重要的。如果父类的catch块出现在子类的catch块之前,就会导致编译错误。如RuntimeException写在Exception之后。
I/O的考察
实验中考察的是从txt文件中读取数据并转换成字符串,这是最基本的I/O知识。需要熟悉File类;Stream流(字节流)中使用FileInputStream、FileOutputStream类;Stream流(字符流)中FileWriter、FileReader、BufferedWriter、BufferedReader类等的使用。在使用时常会抛出FileNotFoundException、IOException等异常,需要合理使用try-catch语句。
在读取成字符串之后,需要考虑的是如何将整段话转换成为单词的问题。首先是要剔除无效字符,使用空格代替所有除英文字符之外的符号,使得每个单词之间用空格分开,便于后续进行操作。其次是调用split()方法,分割字符串,得到所有单词的词组。
HashMap的使用
在进行词频统计时,我们可以使用最基本的数组(但是因为数组定长,我们并不知道单词有多少),也可以使用之前学习过的ArrayList(但是需要两个list,一个保存单词一个保存数字,并且每加入一个单词需要遍历ArrayList一次,因此介绍HashMap的使用,他存储的是键值对,并且可以通过get方法得到value值并进行修改。在第二次碰到同样的单词时,可以使用put方法,即可覆盖之前的同一个key的信息。
在本个实验中,建议使用一种高度精简的put的方式:
hashMap.put(arrayStrings[i],hashMap.getOrDefault(arrayStrings[i],0)+1);
①getOrDefault()方法查找当前hashmap中是否存在该键值key,如果存在返回value,如果不存在返回0。
②将getOrDefault()的值加一并作为该键值key加入hashmap的value,实现了在一条语句内处理新单词加入hashmap、旧单词数量+1的方法。
JavaFX
在学习book1的过程中,每一章节的最后一个部分我们都会学习到JAVAFX的部分知识。因此借着这次实验,我们对JAVAFX进行一个简单的应用实现。
需要注意的是:
- 编写JavaFX程序,需要在主类继承javafx.application.Application。
- 需要重写定义在javafx.application.Application类中的静态方法start方法。当一个JavaFX应用启动时,JVM使用它的无参构造方法来创建类的一个示例,同时调用其start方法。Start方法一般用于将UI组件放入一个场景,并且在舞台中显示该场景。
- 如果使用的是public static void main(String[] args)方法进行启动,需要在其中写Application.launch(args);进行JavaFX的调用。因为launch方法是一个定义在Application类中的静态方法,用于启动一个独立的JavaFX应用。但是如果是从命令行运行程序,main方法不是必须的。
实验结果示例
本个实验是一个自主性较强的实现,实验体现结果的i形式可以与上图不同。