流程控制语句
一. Java程序的结构
1. Java包的概念
- package语句:包语句,每个文件最多只有一个,必须放在文件开始位置。前面只能有空行或者注释
- 通常使用CLASSPATH指定搜索包的路径,类名就是文件名,包名就是文件夹名(目录名),目录名不一定是包名
- 包是类的容器,利用包划分名字空间,避免类名冲突
- 目的是将相关源代码文件组织在一起
2. 引入语句
- import语句: 可以没有也可以有多个,必须放在所有类定义的最前面,引入语句
- 源文件中可以同时出现package语句和import语句,但是包语句必须在最前面
- 下面语句可以引入包中所有的类:
- import java.lang *;
二. 流程控制
赋值 分支 循环语句 分别对应3类语句流,分别是 顺序流,分支流,循环流
1. 赋值语句
-
赋值语句: 表达式可以当作一个值赋给某个变量
-
有的表达式可以当语句,但并不是所有的语句都可以当表达式
-
每个表达式都会得到一个值,这个值是计算结果
-
语句也会有一个值,而是执行结果
user = new User(); x = 12; x++;
- 前两条是赋值语句,后一条是表达式语句
-
2. 分支语句
-
分支语句: 根据条件,动态决定程序的流程方向
-
if 语句
- if关键字之后的条件表达式必须得到一个逻辑值, Java不提供数值与逻辑值之间的转换
- else子句属于逻辑上离它最近的语句
-
switch 语句
- 与嵌套的 if 语句类似, 格式更加简洁
- switch后的表达式语句必须是int或者char类型
- 使用byte和short的时候,需要进行提升
- 不允许使用浮点型或long型表达式
- break语句 : 结束当前整个循环, 转到下一个循环 最后一个break语句可以省略
- default子句是可选的
- switch 的 case 语句最后如果没有加 break,则程序会一直往后执行
3. 循环语句
-
for 语句
for (int k =0; k<3; k++) { // 初始语句; 条件表达式; 迭代语句 System.out.println("Hello World"); }
-
初始语句和迭代语句中可以含有多个语句,当条件表达式为空时,默认规定恒真true
-
先执行初始语句,判断条件表达式的值,为真时,执行循环体语句,再执行迭代语句
-
条件为假时,循环结束 ,转到for之后的语句继续执行
-
-
while 语句
- 当程序值不能明确指明循环的执行次数时, 可以用条件表达式来决定循环是否执行,这个时候就可以使用while循环
- 与 if switch语句一样,条件表达式不能使用数值来代替
-
for 语句中循环控制变量的值通常是隐式修改的, while 语句中需要显示修改
-
do 语句
- 把while 语句中的条件表达式移到循环体之后
- 首先执行循环体语句, 然后判断条件表达式的值, 为真, 则重复执行循环体语句, 直到条件为假时, 结束循环
- 无论条件是真是假, do 循环中的循环体至少执行一次
4. 跳转语句
-
标号
- 标号可以放在任意语句之间,通常与for while do 语句配合使用,语法格式
- 标号:语句;
- 标号可以放在任意语句之间,通常与for while do 语句配合使用,语法格式
-
break 语句
- 在switch 语句中,跳过本块中余下的所有语句,转到块尾,执行后面的语句
-
continue 语句
- 立即结束当次循环,不输出当前循环的数,开始执行下一次循环
for (int i =0; i<5;i++){
if (i==3) break;
System.out.print(i); //0 1 2输出到3就跳出循环了
}
for (int i =0; i<5;i++){
if (i==3) continue;
System.out.print(i); //0 1 2 4 无法输出3,跳过直接进入下一个迭代
}
三. 简单的输入/输出
1. Scanner类
-
可以读入不同类型的输入值,键盘输入,文件输入等
-
要使用它必须创建一个对象,它读入键盘输入
-
Scanner scan = new Scanner(System.in);
- 创建了一个变量scan,代表一个Scanner对象
- 对象本身由new运算符创建,调用构造方法建立对象
- Scanner类的构造方法接收一个参数,这个参数代表了输入源
- System.in代表标准输入流,默认指的是键盘
-
-
Scanner的 next()方法读入下一个输入对象,并且作为字符串返回
-
nextLine()方法读入当前行的所有输入,作为字符串返回
-
public static void main(String[] args) { String message; Scanner scanner = new Scanner(System.in); // 创建从键盘输入的对象 message = scanner.nextLine(); System.out.println("您输入的是"+message); //回显 } 控制台: 你好 您输入的是你好
-
-
Scanner有不同的方法来读入不同类型的数据
-
public static void main(String[] args) { int age; double weight,height,bmi; Scanner scan = new Scanner(System.in); System.out.println("请输入您的年龄: "); age=scan.nextInt(); //从键盘读入一个int型的数据 System.out.println("请输入您的体重: "); weight=scan.nextDouble(); //从键盘读入一个double型的数据 System.out.println("请输入您的身高: "); height=scan.nextDouble(); bmi = weight/(height*height); System.out.println("BMI: "+bmi); } 控制台: 请输入您的年龄: 19 请输入您的体重: 109 请输入您的身高: 172 BMI: 0.003684424012979989
-
2. NumberFormat 类和 DecimalFormat类
-
这是Java提供的格式化输出功能,可以使打印或显示的信息比较美观
-
NumberFormat类不能使用new实例化,只能直接使用类名调一个静态方法来得到一个对象
-
常用方法详情看API
public static void main(String[] args) { Double myNum = 12345.123456789; Double test = 1.2345; String myString = NumberFormat.getCurrencyInstance().format(myNum); System.out.println("默认格式:"+myString); //按照通用格式输出 } 控制台: 默认格式:¥12,345.12
-
DecimalFormat使用new来实例化对象,它的构造方法要带一个String类型的参数
public static void main(String[] args) { Double bmi = 0.003633240850838948; DecimalFormat fmt = new DecimalFormat("0.###"); // 格式对象,保留3为小数 System.out.println("BMI: "+fmt.format(bmi)); // 使用格式对象输出 } 控制台: BMI: 0.004
四. 处理异常
1. 异常以及处理机制
-
为了解决异常问题,Java提供了异常处理机制,预定义了Exception类
-
抛出异常
- 在一个方法运行过程中,发生了异常,相应的生成了一个异常对象
- 这个异常对象包含所发送的异常类型,以及程序的运行状态
- 生成的异常对象传递给Java运行时系统,运行时系统寻找相应代码来处理
- 生成异常对并将他提交给运行时系统这个过程称为抛出异常(Throw)
-
捕获异常
- Java运行时系统从生成对象的代码块开始回溯,沿方法的调用栈逐层回溯,寻找相应的处理代码
- **直到找到异常处理的方法为止,并把异常对象交给该方法处理 **这个过程称为捕获
2. 异常分类
-
Exception类是所有异常类的父类,Error类是所有错误类的父类,这两个类都是Throwable的子类
-
受检异常
- 是程序执行期间发生的严重事件的后果**,必须需要进行处理的**
- 如果程序从磁盘读入数据,而系统找不到含有数据的文件,就会发生受检异常
-
运行时异常
- 程序中逻辑错误的结果,一般只需要修改程序中的错误即可
- 运行时异常都是RuntimeException的子类
-
错误
- 一般是系统了问题,比如说内存溢出
- 不是代码逻辑错误
3. 异常处理
- 比如说方法1调用了方法2,方法2调用方法3,进而方法3调用方法4
- 如果方法4中发生了异常,则调用栈中的任何一个方法都可以捕获并处理这个异常
-
处理代码含有 try catch 两段
- 第一段try 含有可能抛出异常的语句
- 第二段含有一个或多个catch块
- 如果没有发生异常,则try 块内的语句全部执行,然后执行catch 块后的语句
- 每个catch 块可能含有捕获及处理某种异常类型的代码
- 如果发生了异常,则立即转到catch块,此时捕获了异常
- catch 语法 类似于一个方法定义,标识符e 称为 catch块参数,表示 catch块将要处理的 Exception对象
- catch 避免使用Exception,尽可能的捕获具体的异常,先捕获最具体的
- 作为一个对象,每个异常都有存取方法 getMessage( ),返回抛出异常时创建的描述字符串
- 如果问题很严重,catch 块可以调用exit迭代来终止程序 System.exit(0);
- 给System.exit的参数设置为0,表示虽然遇到一个严重问题,但是程序是正常结束的
-
finally
- 无论是否捕获到异常,finally后面的语句都会执行
- 一般将需要共同处理的内容放到finally后的代码段中
- try 大括号后面的代码称为保护代码,如果在保护代码中执行了System.exit(0); 将不会执行finally语句
4. 公共异常
-
ArithmeticException
-
整数除法中,如果除数为0,则发生该异常
-
int i =12/0;
-
-
NullPointerException
- 如果一个对象还没有实例化,则访问该对象或者调用它的方法导致空指针
-
NeagetiveArraySizeException
- 数组的元素应该是一个大于等于0的整数,创建数组时,如果元素个数是负数,则报异常
-
ArrayIndexOutOfBoundsException
- Java把数组看成是对象,并用length变量记录数组的大小
- 访问数组元素时,运行时环境根据length 值检查下标的大小
- 如果下标越界,则报下标越界异常
5. 抛出异常
-
如果一个方法确实引发了一个异常(运行时异常和错误除外),则在方法中必须写相应的处理代码
-
处理异常有两种方式
-
throw 抛出异常
- 程序员不在当前方法里处理异常,将异常抛出到调用方法中
- 当不能使用合理的方法来解决不支持或意外事件的情况下,才使用抛出异常
- 在方法头中用throw,表示声明这个方法可能抛出的异常
- 在方法体中用throw,表示实际抛出一个异常
-
try catch
- 捕获到所发生的异常类,并进行相应处理
如果下标越界,则报下标越界异常**
- 捕获到所发生的异常类,并进行相应处理
-