Bootstrap

02_19_Java语音进阶||day19_Java基础小节练习(21-23部分)循环、异常&线程、字节流&字符流&Properties集合

第一部分 循环结构-for-while-do…while

第一题:语法练习

  • 语法点:运算符,while,if

  • 编写步骤:

    1. 定义类 Test1
    2. 定义 main方法
    3. 定义变量i为0,i2为10
    4. 使用第一个while循环,当条件为i小于5 时,则进入循环
    5. 循环内,i自增,i2自增
    6. 循环内,使用if判断,当i大于等于 2 并且 i2小于15 时,同时输出i和i2的值
    7. 使用第二个while循环,当条件为i2小于20 时,则进入循环
    8. 循环内,i自增,i2自增
    9. 循环内,使用if判断,当i大于8 或者i2小于等于18 时,同时输出i和i2的值
  • 参考答案:

    public class Test1 {
        public static void main(String[] args) {
            // 定义变量i为0,i2为10
            int i = 0;
            int i2 = 10;
    		// 使用第一个while循环,当条件为i小于5时,则进入循环
            while (i < 5) {
                // 循环内,i自增,i2自增
                i++;
                i2++;
                // 使用if判断,当i大于等于 2 并且i2小于15 时,同时输出i和i2的值
                if (i >= 2 && i2 < 15) {
                    System.out.println("i:" + i + ", i2:" + i2);
                }
            }
    
            System.out.println("-----------------------");
            // 使用第二个while循环,当条件为i2小于20 时,则进入循环
            while (i2 < 20) {
                // 循环内,i自增,i2自增
                i++;
                i2++;
                // 循环内,使用if判断,当i大于8 或者i2小于等于18 时,同时输出i和i2的值
                if (i > 8 || i2 <= 18) {
                    System.out.println("i:" + i + ", i2:" + i2);
                }
            }
        }
    }
    

第二题:语法练习

  • 语法点:变量,运算符,if

  • 编写步骤:

    1. 定义类 Test2
    2. 定义 main方法
    3. 定义变量 discount为1, totalPrice为550
    4. 判断当totalPrice >=500 ,discount赋值为0.5
    5. 判断当totalPrice >=400<500时,discount赋值为0.6
    6. 判断当totalPrice >=300<400时,discount赋值为0.7
    7. 判断当totalPrice >=200<300时,discount赋值为0.8
    8. 输出totalPrice.
    9. 输出totalPrice 与 discount 的积
  • 参考答案:

    
    public class Test2 {
        public static void main(String[] args) {
    
            // 定义变量 discount为1, totalPrice为550
            double discount = 1 ;
            int totalPrice = 550;
            // 判断当totalPrice >=500 ,discount赋值为0.5
            if (totalPrice >= 500){
                discount = 0.5;
            }else  if (totalPrice >=400 && totalPrice < 500) {
                // 判断当totalPrice >=400 且<500时,discount赋值为0.6
                discount = 0.6;
            } else if (totalPrice >=300 && totalPrice < 400) {
                // 判断当totalPrice >=300 且<400时,discount赋值为0.7
                discount = 0.7;
            } else if (totalPrice >= 200 && totalPrice < 300) {
                // 判断当totalPrice >=200 且<300时,discount赋值为0.8
                discount = 0.8;
            }
            // 输出totalPrice.
            System.out.println("totalPrice:"+totalPrice);
            // 输出totalPrice 与 discount 的积
            System.out.println("totalPrice的discount:"+(totalPrice*discount));
    
        }
    }
    

第三题:语法练习

  • 语法点:运算符,for,while

  • 编写步骤

    1. 定义类 Test3
    2. 定义 main方法
    3. 使用for循环,初始化变量r为10,当r>0时,进入循环
    4. for循环内,定义变量c,赋值为r
    5. for循环内,使用while循环,当c>=0时,输出c,再将c减2赋值给c
    6. for循环内,while循环外,r除以c赋值给r
  • 参考答案:

    public class Test3 {
        public static void main(String[] args) {
            // 使用for循环,初始化变量r为10,当r>0时,进入循环
            for (int r = 10; r > 0; ) {
                // for循环内,定义变量c,赋值为r
                int c = r;
                // or循环内,使用while循环,当c>=0时,输出c,再将c减2赋值给c
                while (c >= 0) {
                    System.out.print(c + " ");
                    c -= 2;
                }
                // for循环内,while循环外,r除以c赋值给r
                r /= c;
            }
        }
    }
    

第四题:语法练习

  • 语法点:方法,运算符,for,while

  • 编写步骤

  1. 定义类 Test4,定义 main方法
  2. main方法中,定义int类型变量 a为10,b为20,c为30
  3. 定义 method1方法, 定义变量a为-5,变量b为–a,判断a为偶数,则a赋值为++b,否则b赋值为–a.打印a,b
  4. 定义 method2方法, 定义变量a为0,使用while循环,判断a<=5,进入循环.
  5. while循环内部,使用for循环,初始化int类型变量b为1,当b<=5时进入循环, 步进表达式b++
  6. for循环内,不换行输出i并拼接" "
  7. for循环外,输出换行.
  8. j自增.
  9. main方法调用method1方法,method2方法
  10. 输出a,b,c
  • 参考答案:

    public class Test4 {
        public static void main(String[] args) {
            // 3.main方法中,定义int类型变量 a为10,b为20,c为30
            int a = 10, b = 20, c = 30;
             // 调用 method1
            method1();
            // 调用 method2
            method2();
      
            System.out.println();
            System.out.println(a);
            System.out.println(b);
            System.out.println(c);
      
        }
        // 定义 method2方法, 定义变量a为0,使用while循环,判断a<=5,进入循环.
        private static void method2() {
            int a = 0;
            // while循环内部,使用for循环,初始化int类型变量b为1,当b<=5时进入循环, 步进表达式b++
            while (a <= 5) {
                // for循环内,不换行输出i并拼接" "
                for (int b = 1; b <= 5; b++) {
                    System.out.print(b + " ");
                }
                // for循环外,输出换行.
                System.out.println();
                // a自增.
                a++;
            }
            System.out.println("----------");
        }
      
        // 定义 method1方法, 定义变量a为-5,变量b为--a,判断a为偶数,则a赋值为++b,否则b赋值为--a.打印a,b
        public static void method1() {
            int a = -5;
            int b = --a;
      
            if (a % 2 == 0) {
                a = ++b;
            } else {
                b = --a;
            }
            System.out.println(a);
            System.out.println(b);
            System.out.println("----------");
        }
    }
    

第五题:语法练习

  • 语法点:运算符,for,if

  • 编写步骤

    1. 定义类 Test5
    2. 定义 main方法
    3. 定义变量jj为20,a为0,b为0
    4. 使用for循环,初始化值ii为0,当ii<jj 时进入循环,步进表达式为ii+=2,jj自减
    5. 循环内,使用if判断ii被3整除,ii赋值给a,并输出ii拼接"Hello"
    6. 不被3整除,ii赋值给b,并输出ii拼接"World"
    7. 循环外,按照格式,打印a与b的乘积
  • 参考答案:

    public class Test5 {
        public static void main(String[] args) {
            // 定义变量jj为20,a为0,b为0
            int jj = 20;
            int a = 0;
            int b = 0;
            // 使用for循环,初始化值ii为0,当ii<jj时进入循环,步进表达式为ii+=2,jj自减
            for (int ii = 0; ii < jj ; ii+=2,jj--) {
                // 循环内,使用if判断ii被3整除,ii赋值为a,并输出ii与"Hello"
                if (ii %  3 ==0 ){
                    a = ii;
                    System.out.println(ii +" Hello");
                }else {
                    // 不被3整除,ii赋值为b,并输出ii与"World"
                    b = jj;
                    System.out.println(ii + "  World");
                }
            }
            // 循环外,按照格式,打印a与b的乘积
            System.out.println("a*b的值:" +a+"*"+b +"=" + a * b);
        }
    }
    
    

第六题:语法练习

  • 语法点:字符串,for,switch

  • 编写步骤:

    1. 定义类 Test6
    2. 定义 main方法
    3. 定义字符串遍历 str,赋值为J
    4. 使用for循环,初始化变量i = 0,如果i<5进入循环,步进表达式i++
    5. for循环内部,嵌套定义变量key ,赋值为i%3;
    6. 定义switch语句 ,表达式为key.
    7. case 为0时,str拼接字符’a’,i++后,break
    8. case 为2时,str拼接字符’V’
    9. 循环结束后,输出str
  • 参考答案:

    public class Test6 {
        public static void main(String[] args) {
    
            // 定义字符串遍历 str,赋值为J
            String str  = "J";
            // 使用for循环,初始化变量i = 0,如果i<5进入循环,步进表达式i++
            for (  int i = 0 ; i < 5;i++) {
                // for循环内部,嵌套定义变量key ,赋值为i%3;
              int  key  = i % 3;
              // 定义switch语句 ,表达式为key.
                switch (key) {
                    // case 为0时,str拼接字符'a',i++后,break
                    case 0:
                        str +='a';
                        i++;
                        break;
                    //case 为2时,str拼接字符'V'
                    case 2:
                        str +='V';
    
                }
            }
            // 循环结束后,输出str
            System.out.println(str);
        }
    }
    

第七题:语法练习

  • 语法点:do-while,if

  • 编写步骤

    1. 定义类 Test7
    2. 定义 main方法
    3. 定义boolean类型变量,bVar为false,bVar1为true
    4. 定义int类型变量,count 为 8
    5. 使用do … while 格式,do代码块中,输出"Hello Java!"拼接count的字符串
    6. do代码块中,使用if判断,如果count大于等于7,则bVar1赋值为false,count自减,否则count+=3.
    7. while中,当bVar与bVar1值相等并且count小于9的时候,进入循环
  • 参考答案:

    public class Test7 {
            public static void main(String[] args) {
                // 定义boolean类型变量,bVar为false,bVar1为true
                boolean bVar = false;
                boolean bVar1 = true;
                // 定义int类型变量,count 为 8
                int count =8;
                // 使用do ... while 格式,do代码块中,输出"Hello Java!"拼接count的
                do {
                    // do代码块中,使用if判断,如果count大于等于7,则bVar1赋值为false,count自减,否则count+=3.
                    System.out.println("Hello Java! " +count);
                    if (count >= 7) {
                        bVar1 = false;
                        count--;
                    }else {
                        count += 3;
                    }
    
                    // while中,当bVar与bVar1值相等并且count小于9的时候,进入循环
                } while (bVar == bVar1 && count < 9);
    
            }
      }
    

第二部分 异常&线程

异常&线程部分

第一题:异常的体系

  1. 概述:
    1. 请描述异常的继承体系
    2. 请描述你对错误(Error)的理解
    3. 请描述你对异常(Expection的理解)
    4. 请描述你对运行时异常(RuntimeException)的理解
  2. 解答:
    1. 异常继承体系为:异常的根类是 java.lang.Throwable,其下有两个子类:
      java.lang.Error 与 java.util.Exception 。而Exception又分为编译时期异常:checked异常,与运行时期异常:runtime异常。
    2. Error:表示不可修复的恶性的错误,只能通过修改代码规避错误的产生,通常是系统级别的,所以很严重。
    3. Exception:表示可修复的良性(相对于错误)的异常,异常产生后程序员可以并且应该通过代码的方式纠正,使程序继续运行,是必须要处理的。
    4. 运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。

第二题:throw与throws的区别

  1. 概述:
    1. 请描述throw的使用位置,作用是什么?
    2. 请描述throws的使用位置,作用是什么?
  2. 解答:
    1. throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。
    2. throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常对象抛给方法调用处。

第三题:异常的处理方式

  1. 概述:
    1. 异常处理方式有几种,分别是什么?
    2. 详细阐述每种方式对异常是如何处理的
  2. 解答:
    1. 异常的处理方式有两种,分别是使用throws和try…catch…finally
    2. throws用在方法的声明上后接异常类名,是把异常抛给调用者进行处理
    3. try…catch…finally是捕获异常,自己处理,处理完毕后面的程序可以继续运行
      1. try代码块中是可能出现异常的代码
      2. catch代码块,是遇到异常,对异常进行处理的代码
      3. finally代码块是无论是否发生异常,都必须执行的代码,用于释放资源.

第四题:常见异常,及产生原因

  1. 概述:请列举常见异常,并说明产生原因。
  2. 解答:
    • NullPointerException:空指针异常。
      • 当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度等等。
    • ArrayIndexOutOfBoundsException:数组索引越界异常。
      • 当对数组的索引值为负数或大于等于数组大小时抛出此异常。
    • ArithmeticException:算术运算异常。
      • 程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。
    • NumberFormatException:数字格式异常。
      • 当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。
  • 注意:答案不唯一,合理即可。

第五题:并行、并发概念

  1. 概述:请简单描述什么是并行,什么是并发?
  2. 解答:
    • 并行:指两个或多个事件在同一时刻发生(同时发生)。
    • 并发:指两个或多个事件在同一个时间段内发生。
    • 通俗易懂版:
      • 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不 支持并行。
      • 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
      • 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
  • 并发的关键是你有处理多个任务的能力,不一定要同时。
  • 并行的关键是你有同时处理多个任务的能力。
    • 所以它们最关键的点就是:是否是『同时』。

第六题:进程概念、线程概念、线程与进程联系

  1. 概述:请描述什么是进程,什么是线程,进程与线程之间的关系,并举例说明。
  2. 解答:
    • 进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
    • 线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
    • 一个程序运行后至少有一个进程,一个进程中可以包含多个线程,但一个进程中至少包含一个线程。比如使用迅雷软件下载网络文件时,同时下载多个文件,就使用到了多线程下载。

线程&同步部分

第一题:多线程开启

  1. 概述:请描述Thread类中的start()方法与run()方法的区别。
  2. 解答:
    • 线程对象调用run()方法不开启线程,仅是对象调用方法。线程对象调用start()方法开启线程,并让jvm调用run()方法在开启的线程中执行。

第二题:创建多线程

  1. 概述:请描述创建线程的两种方式
  2. 解答:
    • 第一种方式是将类声明为 Thread 的子类。
      1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体。
      2. 创建Thread子类的实例,即创建了线程对象。
      3. 调用线程对象的start()方法来启动该线程。
    • 第二种方式是声明一个类实现Runnable 接口。
      1. 定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
      2. 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,Thread对象才是真正的线程对象。
      3. 调用线程对象的start()方法来启动线程。

第三题:实现Runnable接口的优势

  1. 概述:请描述实现Runnable接口比继承Thread类所具有的优势:
  2. 解答:
    1. 适合多个相同的程序代码的线程去共享同一个资源。
    2. 可以避免java中的单继承的局限性。
    3. 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和数据独立。
    4. 线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类。

第四题:线程状态

  1. 概述:请描述在线程的生命周期中, 有几种状态呢 ?
  2. 解答:
    1. NEW(新建) 线程刚被创建,但是并未启动。
    2. Runnable(可运行)
      线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。
    3. Blocked(锁阻塞)
      当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。
    4. Waiting(无限等待)
      一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。
    5. Timed Waiting(计时等待)
      同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、Object.wait。
    6. Teminated(被终止)
      因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。

第三部分 字节流&字符流&Properties集合

第一题:字节输出流写出字节数据

  1. 概述:利用字节输出流一次写一个字节的方式,向D盘的a.txt文件输出字符‘a’。
  2. 步骤:
    1. 创建字节输出流FileOutputStream对象并指定文件路径。
    2. 调用字节输出流的write(int byte)方法写出数据
  3. 解答:
    public class Test01_01 {
        public static void main(String[] args) throws IOException {
        		// 1.创建字节输出流FileOutputStream对象并指定文件路径。
        		FileOutputStream fos = new FileOutputStream("d:/a.txt");
        		// 2.调用字节输出流的write(int byte)方法写出数据
        		fos.write(97);
        		// 3.关闭流
        		fos.close();
    	}
    }

第二题:字节输出流写出字节数组数据

  1. 概述:利用字节输出流一次写一个字节数组的方式向D盘的b.txt文件输出内容:“i love java”。
  2. 步骤:
    1. 创建字节输出流FileOutputStream对象并指定文件路径。
    2. 调用字节输出流的write(byte[] buf)方法写出数据。
  3. 解答:
    public class Test01_02 {
		public static void main(String[] args) throws IOException {
		// 1.创建字节输出流FileOutputStream对象并指定文件路径。
		FileOutputStream fos = new FileOutputStream("d:/b.txt");
		// 2.调用字节输出流的write(byte[] buf)方法写出数据。
		byte[] buf = "i love java".getBytes();
		fos.write(buf);
		// 3.关闭资源
		fos.close();
    	}
    }

第三题:字符输出流写出字符数据

  1. 概述:请用户从控制台输入信息,程序将信息存储到文件Info.txt中。可以输入多条信息,每条信息存储一行。当用户输入:”886”时,程序结束。
  2. 步骤:
    1. 创建MainAPP类,并包含main()方法
    2. 按照上述要求实现程序
  3. 解答:
    public class Test01_07 {
    	public static void main(String[]args) throws IOException {
    		//1. 指定输出流, 对应的文件Info.txt
    		FileWriter bw= new  FileWriter("Info.txt");
    		//2.采用循环的方式,把每条信息存储一行到Info.txt中
    		Scanner sc= new Scanner(System.in);
    		while(true){
    			//获取键盘输入的一行内容
    			System.out.print("请输入内容:");
    			String str= sc.nextLine();
    			//当用户输入:”886”时,程序结束。
    			if ("886".equals(str)) {
    				break;//跳出循环
    			}
    			//把内容写入到Info.txt文件中
    			bw.write(str);
    			//换行
    			bw.write(System.lineSeparator());
    		}
    		//关闭流
    		bw.close();
    	}
    }

第四题:IO对象Properties结合使用,设置properties文件

  1. 概述:我有一个文本文件score.txt,我知道数据是键值对形式的,但是不知道内容是什么。
    • 请写一个程序判断是否有"lisi"这样的键存在,如果有就改变其实为"100"
    • score.txt文件内容如下:
    • zhangsan = 90
    • lisi = 80
    • wangwu = 85
  2. 步骤:
    1. 创建一个空的Properties集合
    2. 读取数据到集合中
    3. 遍历集合,获取到每一个key
    4. 判断当前的key 是否为 “lisi”,如果是就把"lisi"的值设置为100
    5. 把集合中所有的信息,重新存储到文件中
  3. 提示:
  4. 解答:
    public class Test02_06 {
        public static void main(String[] args) throws IOException {
        //1:创建一个空的集合
        Properties prop = new Properties();
        //2:读取数据到集合中
        prop.load(new FileInputStream("score.txt"));
        //3:遍历集合,获取到每一个key
        Set<String> keys = prop.stringPropertyNames();
        //获取到每一个key
        for (String key : keys) {
            //4:判断当前的key 是否为 "lisi"
            if ("lisi".equals(key)) {
            //把"lisi"的值设置为100
            prop.setProperty(key, "100");
            }
        }
        //把集合中所有的信息,重新存储到文件中
        prop.store(new FileOutputStream("score.txt"), "haha");
        }
    }
;