Java基础(4)——逻辑控制 分支,循环,try

31 阅读3分钟

2.do-while

冷门循环,先执行1次再判断

3.重点:for循环

for (int i = 0; i < 10; i++) {}

简化:for each

Older findOlder = null;
for (Older older: list) {
    if(id.equals(older.getId())){
        findOlder = older;
        break;
    }
}

语法:变形语法forEach

list.forEach(System.out::println);

三、异常try…catch

捕获异常的作用:

  • 1.当程序异常时,可以根据异常的类型做出不同的处理;
  • 2.保证程序在处理完异常后可以继续执行后面的程序,而不是中断程序;

产生 :Scanner使用时产生;
解决:异常处理机制——异常捕获
try {
// 可能会出现异常的代码
}

在这里插入图片描述

四、逻辑控制词

  • break 跳出循环 跳出当前的for循环,距离最近的一层循环
  • return 直接把方法停止
  • continue 结束本次循环,进入下次循环,不会执行continue下面的代码
// 1.电梯有18层,只能停10层一下的楼层(10层以上楼层不可达)
int i = 1;
for( ;i <= 18;i++) {
   if(i % 2 == 0) {
       continue; // 结束本次循环,进入下次循环,不会执行continue下面的代码
	}
	System.out.println("电梯停在了"+i+"层");
}

如何交换两个变量的数据

// 面试点:如何交换两个变量的数据
int x = 10;
int y = 20;
int temp = x; //声明第三个变量存放任意一个变量值;

System.out.println("x=" + x + ",y=" + y);
x = y;
y = temp;
System.out.println("交换后的x=" + x + ",y=" + y);

五、递归:自己调用自己

典型案例:求阶乘

/\*\* 用递归的方式
 \* 6! = 6\*5! = 6\*5\*4\*3\*2\*1
 \* 6 \* jiecheng2(5)
 \* 5 \* jiecheng2(4)
 \* ...
 \* 2 \* jiecheng2(1)
 \* return 1; 递归结束的条件
 \*/
public static long jiecheng2(int num) {
	if(num == 1 || num == 0) { // 0和1的阶乘都为1
		return 1;
	}else if (num < 0){
		System.out.println("错误的输入");
		return (Long) null;
	}
	return num \* jiecheng2(num-1);
}


在这里插入图片描述

六、案例

1.手机号格式判断

  • 号码的位数为1880222959,11位,开头为18;
  • String.valueOf(任意类型) 将任意类型转换成字符串
  • str.startsWith(“18”) 字符串以18开头
  • str.endsWith(“18”) 以18结尾

import java.util.Scanner;
import java.util.InputMismatchException;

// 输入手机号码,判断手机号码是否正确
/\*
 \* 号码的位数为18802229401,11位,开头为18;
 \* String.valueOf(任意类型) 将任意类型转换成字符串
 \* str.startsWith("18") 字符串以18开头
 \* str.endsWith("18") 以18结尾
 \*/
public class Test5 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in); // 扫描输入
		System.out.println("请输入一个手机号码");
		long num = 0; // 变量赋初值
		while(true) {
			// 用try catch 捕获处理异常
			try {
				num = scanner.nextLong();
// String strnum = num + ""; // 任意类型转换成字符串;
				String strnum = String.valueOf(num);
				int length = strnum.length(); // 手机号码的长度
				if(length==11 && strnum.startsWith("18")) {
					System.out.println("手机号码正确,跳出循环");
					break;
				}else { // 手机号位数不正确
					throw new IllegalArgumentException("手机号码位数不正确,请重新输入");
				}
			}catch(InputMismatchException e) {
				// 手机号格式错误
				System.out.println("手机号必须是数字,请重新输入");
				scanner.next(); // 阻塞,此处将键盘的输入传递到scanner.nextLong()
			}catch(IllegalArgumentException e) {
				System.out.println(e.getMessage());
				
			}
		}
		System.out.println("循环之外的代码");
		scanner.close(); // 关闭扫描
	}
}


2.输入字母,大小写;输入字符,字母数字中文?

import java.util.Scanner;

public class Test6 {
	public static void main(String[] args) {
		// 1.键盘输入一个字母,判断是大写字母还是小写字母;
		Scanner scanner = new Scanner(System.in);
		String str1 = scanner.nextLine();
		char ch1 = str1.charAt(0); // 取输入的第一个字符
		if(ch1 >= 'a' && ch1 <= 'z') {
			System.out.println("您输入的"+ ch1 +"是小写");
		}else if(ch1 >= 'A' && ch1 <= 'Z') {
			System.out.println("您输入的"+ ch1 +"是大写");
		}else {
			System.out.println("输入的"+ ch1 +"不是字母");
		}
		
		// 2.键盘输入一个字符,判断是字母,数字,还是中文字符?
		String str = scanner.nextLine();
		char ch = str.charAt(0); // 取输入的第一个字符
		if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') {
			System.out.println("输入的是字母");
		}else if(ch >= '0' && ch <= '9') {
			System.out.println("输入的是数字");
		}else if(ch >= '\u4E00' && ch <= '\u9FA5') { // 常用汉字范围4E00-9FA5
			System.out.println("输入的是汉字");
		}else {
			System.out.println("输入其他字符");
		}
		scanner.close();
	}
}

3.键盘输入年、月、日,判断输入的日期是当前这一年的第几天

巧妙使用switch的穿透

public class Test9 {
	public static void main(String[] args) {
		// 经典题:键盘输入年、月、日,判断输入的日期是当前这一年的第几天
		int year = 2020;
		int month = 7;
		int day = 22;
		
		int num = 0; // 一年中的第几天
		switch(month) {
		case 12:
			num = num + 31;			
		case 11:
			num = num + 30;	
		case 10:
			num = num + 31;	
		case 9:
			num = num + 30;	
		case 8:
			num = num + 31;	
		case 7:
			num = num + 31;	
		case 6:
			num = num + 30;	
		case 5:
			num = num + 31;	
		case 4:
			num = num + 30;	
		case 3:
			num = num + 31;	
		case 2:
			// 判断是不是闰年year
			num = num + 29;	
		case 1:
			num = num + 31;	
		default:
			System.out.println("输入月份错误");
			break;
		
		}
	}

}


另一种方法,用for循环 + if 判断

public class Test10 {
	public static void main(String[] args) {
		// 经典题:键盘输入年、月、日,判断输入的日期是当前这一年的第几天
		int year = 2019;
		int month = 12;
		int day = 31;
		
		int num = 0; // 一年中的第几天
		for(int i = 1;i < month;i++) {
			if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) {
				num += 31;
			}else if(i == 4 || i == 6 || i == 9 || i == 11) {
				num += 30;
			}else {
				if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ) {
					num += 29;
				}else {
					num += 28;
				}
			}
		}
		num += day;
		System.out.println(year+"年"+month+"月"+day+"天"+ "是第"+num+"天");
	}
}

4.产生随机数的案例

  • 总结公式:产生m~n之间的随机整数
  • random.nextInt(n-m+1) + m
import java.util.Random;

public class Test2 {
	public static void main(String[] args) {
		//1.随机数类
		Random random = new Random();
		// 产生一个随机数,[0,3)左闭右开
		int nextInt = random.nextInt(3); 
		System.out.println(nextInt);
		
		// 练习1:获取随机数65~90
		int num = random.nextInt(26)+65;
		// 练习2:获取随机的4位数(产生4位数的验证码)1000~9999
		int num1 = random.nextInt(9000) + 1000;
		/\*