计应本的自考笔记(3)-Java程序的流程控制

496 阅读6分钟

Java程序的结构

  • 一个Java程序由一个或多个.java源文件组成。每个源文件中包含一个或多个类/接口,但只能有一个public类型的类,源文件名要与这个公有类名称一致。
  • 一个Java程序的结构包含以下内容:
    • package包语句,最多只有一个,须写在源文件开始的地方;
    • import引入语句,可有可无,若有则应写在所有类定义的前面;
    • public权限的类定义,最有只有一个;
    • 类定义:个数无限制;
    • 接口定义:个数没有限制;
  • 包是类的容器,用来划分命名空间,以免类名冲突。语法为:packge pkg1[.pkg2[.pkg2...]]
  • package语句是源文件中,第一条非注释语句,一个源文件中最多只能有一条package语句。
  • 包的名字有层次关系,各层之间以点分隔。报名全部用小写字母。
  • 一个包可以包含若干个类文件,也可以包含若干个包。

流程控制

  • 语句是Java最小执行单位,以分号(;)作为分隔符。
  • 语句分为单语句和复合语句。单语句就是一条语句,复合语句是用大括号包含的语句组,也称为语句块。

1、赋值语句

  • 将一个值赋值给某个变量,称之为赋值语句。
  • 值得注意的是,语句和表达式有很多相同点,也有不同的地方。表达式可以当作语句,但语句不一定都是表达式;表达式都会得到一个值,也就是表达式的计算结果,而语句也会有一个值,但不是计算结果,而是执行结果。
costomer1 = new Customer(); // 赋值语句
x = 12; // 赋值语句

x++; // 表达式语句

2、分支语句

分支语句指根据一定的条件,动态决定程序的执行方向。

if语句

  • if语句的条件表达式必须得到一个逻辑值
  • if语句的else子句是可选的
  • 通过嵌套if语句可以实现多重选择,也就是多个分支的判断
// 形式1:无else子句
if(show){
    Person.say('hello')
}

// 形式2:有else子句
if(!close){
    Door.open()
}else{
    Door.close()
}

// 形式3:嵌套的if语句
if(yellowColor){
    System.out.println("黄灯")
} else if(redColor){
    System.out.println("红灯")
} else if(greenColor){
    System.out.println("绿灯")
} else {
    System.out.println("其他")
}

switch语句

  • 当需要进行多个条件的判断时,可以使用switch语句来实现,格式上更加简洁
  • switch语句的表达式计算结果必须是int型或者是char型,default子句是可选的
switchch(colorNum){
    case 0:
        setBackground(Color.red);
        break;
    case 1: 
        setBackground(Color.yellow);
        break;
    case 2: 
        setBackground(Color.green);
        break;
    default:
        setBackground(Color.black);
        break;
}

3、循环语句

for语句

语法格式

for (初始语句; 条件表达式; 迭代语句){
    循环体语句
}
  • 初始语句和迭代语句可以包含多个语句,语句之间以逗号分隔。
  • 先执行初始语句,判断条件表达式的值,如果为true,执行循环体语句,然后再执行迭代语句。下一个迭代再判断条件表达式的值,执行迭代语句,直到条件表达式的值为false,循环结束。
  • 如果条件表达式的值一直为true,则循环会无限制的执行下去。

while语句

语法格式

while(条件表达式){
    循环体语句
}
  • 跟if语句一样,while语句的条件表达式需要返回布尔值,而不能是数值
  • while语句先计算条件表达式的值,为true时,重复执行循环体语句,直到条件按表达式值为false。

do-while语句

语法格式

do{
    循环体语句
} while(条件表达式)
  • do语句先执行循环体语句,然后判断条件表达式是否为true,再重复执行循环,直到条件按表达式值为false则退出。

4、跳转语句

跳转语句由标号和语句组成标号: 语句;

break语句和container语句

  • break语句可用于3类语句中:1. switch语句;2. for/while/do-while循环语句;3. 语句块;
  • break的语义是跳过本语句块的余下语句,执行到语句块末尾。
  • 如果在循环语句中执行break,则是结束循环。
  • container用于循环语句,表示结束当次循环,进行下一次循环

输入/输出

Scanner类

import java.util.Scanner;

public class Echo {
    public static void main(String[] args){
        String message;
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter a line of text:");
        message = scan.nextLine();
        System.out.println("You entered: " + message + "\")
    }
}

NumberFormat类和DecimalFormat类

import java.util.Scanner;
import java.text.DecimalFormat;

public class IntDouble{

    public static void main(String[] args){
        int age;
        double weight, height, bmi;
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入年龄:");
        age = scan.nextInt();

        System.out.println("请输入体重(公斤):");
        weight = scan.nextDouble();

        System.out.println("请输入身高(米):");
        height = scan.nextDouble();

        bmi = weight / (height * height);

        // 保留三位小数
        DecimalFormat fmt = new DecimalFormat("0.###");
        System.out.println("BMI:" + fmt.format(bmi));
        fmt = new DecimalFomat("0.##");
        // 保留两位小数
        System.out.println("BMI:" + fmt.format(bmi));
    }
}

处理异常

  • Java语言把错误分为两类:
    • 非致命性的错误,通过修正后,程序还能继续执行的(称为异常Exception);
    • 致命性的错误,比如程序内存耗尽,无需程序员处理的;

异常及处理机制

  • Java的异常处理机制预定义了Exception类,定义了程序产生异常的条件。也允许程序员自己编写特殊的异常处理程序,使得程序发生异常时,不是简单的结束程序,而是执行某段特殊的代码来处理这个异常,设法恢复程序的运行
  • 如果发生了异常,程序会产生要给异常事件,相应地生成异常对象。这个对象包含了异常事件的类型,以及发生程序的运行状态。

异常分类

  • Exception类是所有异常类的父类,Error类是错误类的父类,它们都继承自Throwable类。
  • 异常分为以下3种:
    • 受检异常(Checked Exception):程序执行期间发生的严重事件,比如程序要用户输入地址读取某个文件,执行时却找不到该文件FileNotFoundException。编写程序的时候应该预见到这类错误,应该允许可以重新输入地址,从而恢复程序的执行。
    • 运行时异常(Runtime Exception):是程序中逻辑错误的结果,比如数组下标越界ArrayIndexOutOfBounds、除0错误ArithmneticException。该类错误都是RuntimeException的子类。
    • 错误(Error):比如内存溢出等情况,一般不需要处理;

异常处理

  • 异常要捕获之后,有两种处理的选择:在方法内处理异常,或者抛出让方法的调用者处理
  • 使用try/catch来进行异常处理,try语句块包含可能捕获异常的代码段,catch语句块处理异常
try{
    anyObject.readString()
}catch(IOException e){
    // 参数e,表示一个实际的异常
    System.out.println(e.getMessage())
}catch(FileNotFoundException e){
    // 可抛出不同类型的异常
}finally{
    // 总会执行的代码
}
  • 如果一个方法引发了异常,但自己又不处理,则可通过thow语句进行抛出。值得注意的是,如果要抛出异常,方法定义时,要添加一个throws子句进行声明。