第三章流程控制语句(暑假啃书提升计划)

流程控制语句

一. 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 语句配合使用,语法格式
      • 标号:语句;
  • 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

      • 捕获到所发生的异常类,并进行相应处理
        如果下标越界,则报下标越界异常**
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值