zoukankan      html  css  js  c++  java
  • 201521123005 《Java程序设计》 第十周学习总结

    1. 本周学习总结##

    1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容。

    2. 书面作业##

    本次PTA作业题集异常、多线程

    1.finally###

    题目4-2
    1.1 截图你的提交结果(出现学号)

    1.2 4-2中finally中捕获异常需要注意什么?

    (1)finally捕获异常需要注意resource.close();可能发生异常需要抛出异常,打印close出错信息。
    (2)只有执行过try语句块,finally语句块才会执行。
    (3)无论在try块的哪个地方返回,finally块都会被执行到。
    

    2.用异常改进ArrayIntegerStack###

    题目4-3
    2.1 截图你的提交结果(出现学号)

    2.2 实验总结

    一开始看到抛出异常,然后马上想到用try-catch后来才发现不是这样的。我一开始三个方法都throws Exception,提交后编码错误,其中一个错误提示说peek() in ArrayIntegerStack cannot implement peek() in IntegerStack; overridden method does not throw java.lang.Exception 就是说如果我throws Exception 那么peek()在ArrayIntegerStack不能实现IntegerStack peek();而且java.lang.Exception不能覆盖方法。这道题它方法不需要声明异常,有异常后抛出相应的异常即可。
    

    3.自定义异常###

    题目5-4
    4.1 截图你的提交结果(出现学号)

    4.2 自定义异常有哪几个关键点?

    一、注意:
        (1)所有异常都必须是 Throwable 、Exception或其子类的子类。
        (2)如果希望写一个需要try-catch异常类,则需要继承 Exception 类。
        (3)如果你想写一个不需要try-catch异常类,那么需要继承 RuntimeException 类。
        (4)抛出异常时,应让用户知道错误发生的原因,显示异常类及异常的具体原因
        (5)尽量使用JDK已有的异常类:重用、便于理解
    二、自定义异常遵循以下四个步骤:
      1)首先创建自定义异常类,语法格式:自定义异常类名 extends Exception(或 RuntimeException看自身需要)。
         代码形式:
            class UserDefinedException extends Exception{ 
                public UserDefinedException(String msg){  
                    super(msg); 
                }
            }​ 
        2)在方法中通过关键字throw抛出异常对象。
      3)若是在当前抛出异常的方法中处理异常,可以用try-catch语句捕获并处理;若不是,在方法的声明处通过关键字throws指明要抛出给方法调用的异常。
      4)在出现异常方法的调用中捕获并处理异常。
    
    

    4.读取文件并组装对象###

    实验任务书中中的题目3:读取文件并组装对象
    给出关键代码(需出现你的学号)

    public class ReadFileUsingScanner201521123005{
    	public static void main(String[] args)  throws FileNotFoundException{
    	ArrayList<User> student=new ArrayList<User>();
    	Scanner in = null;
    	try{
    		in = new Scanner(new File("身份证号.txt"));//为myfile.txt这个File创建一个扫描器in
    		int count=0;
    		while(in.hasNextLine()){
    			String line = in.nextLine();//读出myfile.txt的下一行		
    		    count++;
    			Scanner lineScanner = new Scanner(line);//为每一行建立一个扫描器
    			lineScanner.useDelimiter(" ");//使用空格作为分隔符
    			try{
    				String a1 = lineScanner.next();//姓名
    				if(a1.length() == 0 || a1.length() > 10)
    				{
    					throw new IllegalArgumentException("a1.length = " + a1.length());
    				}
    				
    				String a2 = lineScanner.next();//身份证号
    				if(a2.length() == 0)
    				{
    					throw new IllegalArgumentException("a2.length = " + a2.length());
    				}
    				String a3 = lineScanner.next();//性别
    				if(!a3.equals("男") && !a3.equals("女"))
    				{
    					throw new IllegalArgumentException("性别写的不是男女,是"+a3);
    				}
    				String a4 = lineScanner.next();//年龄
    				String a5 = lineScanner.next();//地址
    				while(lineScanner.hasNext()){//谨防地址只有一段
    					a5 += lineScanner.next();
    				}
    				student.add(new User(a1,a2,a3,Integer.parseInt(a4),a5));
    			}		
    			catch(IllegalArgumentException e)
    			{
    				System.out.println("出错的类是:"+e+"。错误在文件的第"+count+"行:"+line);
    			}
    			catch(NoSuchElementException e)
    			{
    				System.out.println("出错的类是:"+e+"。错误在文件的第"+count+"行:"+line);
    			}		  
    		}
    	}catch (FileNotFoundException e) {
    	    // TODO Auto-generated catch block
    	    e.printStackTrace();
    	} finally {
    	    if (in != null) {
    	        in.close();
    	    }
    	}
    	Collections.sort(student, (User o1, User o2) -> {
    	        return o1.getAge() - o2.getAge();
    	});
    	for (User user : student) {
    		System.out.println(user.toString());
    	}
         
    		
    	}
    }
    

    运行结果:

    5.学会使用Eclipse进行调试###

    观看相关调试视频
    5.1 简述使用Eclipse进行调试需要几步?

    一、在正确的地方设置断点
        1.根据错误提示信息,确定错误类型
        2.缩小出错范围、确定错误发生点
        3.将鼠标放在错误的一行的前方(在编译器区域的左侧)上,双击即可设置断点
    二、启动调试模式
        点击右上角的“Debug”(像小虫子的图标)可以看到Debug透视图
    三、使用F5、F6、F7快捷键进行调试
    四、查看状态值
        在窗口的右上方可以看到代码中的相对应得值
    
    

    5.2 调试时F5, F6, F7快键键各有什么不同?什么情况该使用哪个快捷键?

    F5快键键:step into(跳到某个函数内部)
    F6快键键:step over(跳过函数,不进入函数里面)
    F7快键键:step return(从函数里跳出)
    当你要调试某个函数内部的代码,进入函数内部要使用F5快捷键;想要一步步调试就使用F6快捷键;想要跳出这个函数可以使用F7快捷键。
    如果一行有很多函数时:
    当第一次按F5快捷键就跳入这一行第一个函数,F6快捷键一步步调试,F7快捷键跳出这个函数;
    当第一次按F5快捷键就跳入这一行第一个函数,F6快捷键一步步调试,F7快捷键跳出这个函数;
    以此类推,想要进入这一行的第几个函数,就按几次F5和F7。
    

    5.3 除了Eclipse的调试器,你还使用什么方法调试程序?

    一般使用System.out.println输出值来调试。
    
    下面是其他调试方法,目前还在学习中
    1.每个需要测试的类中放一个main方法
    2.JUnit(单元测试框架)
    3.日志(现在用的更多使用第三方日志框架Log4j2)
    4.Throwable的printStackTrace方法
    5.System.err 
    6.将错误信息保存到文件中 java Test 2 >errors.txt
    

    5.3 选做:实验任务书中的题目5:使用Eclipse进行调试中的选做

    6.题集多线程###

    6.1 程序填空3-1、3-2。(截图提交结果,出现你的学号)


    6.2 函数4-1(Thread)、4-2(Runnable)(截图提交结果,出现你的学号)

    6.3 函数4-3(Runnable与匿名内部类)(截图提交结果,出现你的学号),并使用Labmda表达式改写。

    import java.util.Arrays;
    public class Main201521123005 {
        public static void main(String[] args) {
            final String mainThreadName = Thread.currentThread().getName();
            Thread t1 = new Thread( () -> {
            	System.out.println(mainThreadName);
            	System.out.println(Thread.currentThread().getName());
            	System.out.println(Arrays.toString(Thread.currentThread().getClass().getInterfaces()));
            } );     	
            t1.start();
        }
    }
    

    6.4 实验总结

    3-1:t1为守护线程即可
    3-2:t1.start(),之后用while(t1.isAlive()){}或者使用t1.join()语句确认其结束
    4-1:重写run()方法,循环输出0 到 n - 1,结束之后输出该线程的名称,并且调用isAlive()来表示线程是否还活着。
    4-2:这题做得很心累啊,交pta一直答案错误。现在总结一下错误的原因有两个:一个是没有判断word是否为null,一个是后来看了测试点提示有两个测试点分别为正常终止线程结束和没有终止线程结束,我一开始没有考虑这个。改正第一个问题比较简单但是我不知道出错在这个地方,是后来问了同学才知道,加了判断if(word!=null),然后让word=null,因为题目要求对每个传入的word只检查一遍。第二个问题关键在没有终止线程结束,也就是不是通过boolean标志来终止线程(这是正常终止线程结束的方法),即通过捕获异常来终止线程。这需要sleep方法抛出一个InterruptedException异常,InterruptedException被抛出,就可以在run方法中捕获这个异常,让线程安全退出。
    代码:
        try{
            Thread.sleep(1);
        } 
        catch(InterruptedException e){   }
    4-3:做这道题后学习了一些Thread的函数,例如:
            Thread.currentThread().getName();//获得线程名
            Arrays.toString(getClass().getInterfaces());//线程Thread所实现的所有接口
    

    7.源代码阅读:多线程程序BounceThread###

    7.1 哪个类是支持多线程的类,它实现了什么接口。这个类做了些什么?

    BallRunnable是支持多线程的类,它实现了Runnable接口,生成小球的位置移动,移动之后,对界面进行重画,并睡眠一段时间。
    

    7.2 Ball.java这个程序只做了两件事,这两件事分别是什么?

    getShape()获得小球的大小和move(Rectangle2D bounds)小球移动的位置坐标。
    

    7.3 BallComponent也只做了两件事,这两件事分别是什么?

    add(Ball b)加小球和paintComponent(Graphics g)画小球
    

    7.4 BounceThread中,什么时候启动了新线程?

    点击addButton按钮的时候会添加一个小球,启动一个新线程。
    

    7.5 这个程序是如何实现?一个大致的执行流程是什么?

    建立一个Jframe,加入显示小球运动的组件,点击addButton按钮就会有小球出现在界面中并开始移动(改变小球的位置),每点击一次,界面就会多出来一个移动的小球。最后当小球移动一定的步数之后,就停止。
    

    8.购物车系统中的多线程###

    8.1 购物车系统中可能存在哪些多线程问题?

    有几个使用者使用就要有几个线程。有几个Jframe就有几个线程。
    
    

    9.选做:单元测试JUint4###

    实验任务书中的题目6:单元测试使用JUnit4。

    10.选做:JavaFX入门###

    如果未完成作业1、2的请先完成。如果已完成的请完成第五部分:将数据用 XML 格式存储或第六部分:统计图(漂亮的图表)。注:内有代码,可在其上进行适当的改造。建议按照里面的教程,从头到尾自己搭建。

    3. 码云上代码提交记录##

    题目集:异常、多线程(3-1, 3-2, 4-1, 4-2, 4-3)

    3.1. 码云代码提交记录

    在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

    4. 选做:课外阅读##

    4.1 Java Concurrent Animated
    4.2 线程的高级知识笔记

  • 相关阅读:
    ZipOutputStream SharpZipLib 插件加密无法解密
    Bootstrap可视化页面布局
    Centos7中加载验证码图片报错
    Centos7中安装多版本dotnet core sdk
    NetCore中使用MySql操作数据库时发生异常
    NetCore写属性过滤时遇到的AutoFac注入的问题
    微信小程序采坑记
    PC共享网络,非软件
    hibernate HQL —— ReflectHelper.java:343
    hibernate SQL聚合查询
  • 原文地址:https://www.cnblogs.com/yangxy/p/6761337.html
Copyright © 2011-2022 走看看