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子句进行声明。