深入研究lab1中遇到的一些问题和解决方案

由于Lab1是软件构造的第一个实验,所以在完成的过程并没有很顺利很熟练,在lab1报告中对一些知识点也没有列出整理,有些只是查询了应用没有深入了解。这里更深入研究了一些编程时比较重要的过程,知识点和遇到的问题。
1.P1里,遇到的首先是关于文件操作的问题
i>第一个难题就是如何完成文件的读入和输出。这里查阅资料后得知是有关于java文件流操作的知识
public boolean isLegalMagicSquare(String fileName) throws Exception {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
        String myLine;
        int row = 0;
        int col = 0;
        List<int[]> list = new ArrayList<>();
        while ((myLine = bufferedReader.readLine()) != null) {//读取文件的每一行
            row++;
            String[] arr = myLine.split("\t");
            for (int i = 0; i < arr.length; i++) {//检查当前读入的这一行数据是否有不合法输入
                if (!arr[i].matches("[0-9]+") || arr[i].equals("0")) {
                    System.out.println("It contains some invalid input");
                    bufferedReader.close();
                    return false;
                }
            }
这里节选了一段代码。首先文件的读入,参数为文件名,就是String类型的字符串。BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));调用FileReader类构造器新建了一个文件类,作为构造器参数传入BufferReader构造器方法中。这里面,涉及到了节点流和处理流,深入了解这一块内容后总结如下:
FileReader是字符输入流,用于访问文件,而BufferReader是作为缓冲流,属于处理流。那么为什么要用处理流呢?原因一是在于处理流以缓冲的方式提高输入输出的效率,更关键的是在于其提供了很多便捷的方法来一次输入输出大批量的数据,使得使用起来更加灵活方便。
那么这里,就要用到bufferReader的readLine方法,一次读入一行的数据。并将字符串结果保存下来。当读到最后一行之后,再读入会返回null,所以可以用这个条件来判断数据是否全部读完。
此外要注意的还有,这里在第一次输入完毕后是会报错提示要抛出异常的,可以直接由主函数抛出异常,更加方便。
最后关闭处理流的时候,只需要关闭外层流即可,这里看了一下源码就能得知原因,传入的new FileReader(fileName)会在底层关闭。
ii>第二个细节是文件路径的输入。要用在路径前加一个.表示相对路径。
2.P1里第二个点是有关于正则表达式的。 if (!arr[i].matches("[0-9]+") || arr[i].equals("0")),这里的判断就是用于检查字符串是否是正整数。
3.P3中遇到的一个麻烦在于输入重名时的处理。这里学习使用了自定义异常来代替使用exit(0)来退出。
public void addVertex(Person p){
        if(!nameSet.add(p.getName())){
            //System.out.println("The name:" + p.getName() + " is repeated!");
            //System.exit(0);
            throw new SameNameException("The name:" + p.getName() + " is repeated!");
        }
        else{
            people.add(p);
        }
    }

class SameNameException extends RuntimeException{
    public SameNameException(String message){
        super(message);
    }
}
即自定义的异常继承与运行异常RuntimeException。这样有一个好处,就是可以捕获到这个异常。来看test的时候
@Test
    public void testRepeatedName(){
        FriendshipGraph graph = new FriendshipGraph();
        Person a = new Person("a");
        Person b = new Person("a");
        Person c = new Person("c");
        graph.addVertex(a);
        try{
            graph.addVertex(b);
            fail("fail to catch");
        }
        catch(SameNameException e){
        }
        graph.addVertex(c);
    }
JUNIT中涉及到异常的测试,要记得用fail,它是JUNIT里的功能,要求执行的目标结构必然数百,同样要求代码不可达,即是这个方法运在程序运行后不会成功返回,如果成功返回了则报错。这样就使得如果在重名时没有捕获到异常,就会报错,使得测试不通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值