- 程序源代码
- 编译器(JDK)
- 字节码
- JVM(JAVA虚拟机)
- 机器码
- 计算机
Java SE(Java Standard Edition,Java 标准版)是Java技术的核心和基础,是Java ME和Java EE编程的基础。
Java EE是一种利用Java2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。
Java ME是Java微版的简称(Java Platform,Micro Edition),是一个技术和规范的集合,它为移动设备(包括消费类产品、嵌入式设备、高级移动设备等)提供了基于Java环境的开发与应用平台。
法一: (官网JDK下载、安装)
(1)安装配置jdk
(1)java程序的构成
- 逻辑构成
程序头包的引用:主要引用JDK软件包自带的包,也可以是自己定义的类,引用之后程序体中就可以自由应用包中的类的方法与属性。
类的定义:可以有多个类的定义,但必须有一个主类,这个主类是程序运行的路口点,在java源程序中,主类的名字同文件名一致。
- 物理构成
- 注释语句
- 标识符、关键字和转义符
- 常量:是指整个运行过程中不在发生改变的量。
- 变量:变量得声明也指变量的创建。
(2)switch语句
- 表达式1的值必须与整型兼容。
- break表示要跳出这一分支。
- case分支要执行程序语句。
(3)for循环语句
- 首先运行初始化表达式。
- 然后计算测试表达式,为真时,执行语句块,如果为假,结束for循环。
- 最后执行步长。
(4)while循环
(5)do语句
(6)数组
- 首先是一个对象。
- 存放相同的数据类型。
- 所有数组下标默认值0开始,且访问时候不可以超出定义上限。
- 声明格式
- 创建数组
由于数组是一个对象,所以用关键字new来创建一个数组。
创建完成后,赋值:
(1)类的定义与声明
- java编程是面向对象的,处理最小的完整单元为对象。
- 类由类声明和类体构成,类体又有变量和方法构成。
- 类声明的基本格式
- 类体
- 使用new进行创建类
(2)类的单继承性
java语言中允许用externs关键字从一个类扩展出一个新类,新类继承超类的成员变量和方法,并且可以覆盖。
(3)特殊变量
两个特殊变量:super和this
- super
类声明中用关键字extends扩展了其超类后,super用在扩展类中引用其它超类中的成员变量。
- this
指向当前变量或者实例。
(4)构造函数
类中的构造函数用来初始化一个类。
(5)包
(1)List接口
- List接口
List接口扩展了Collection,可以包含重复元素。元素是有顺序的,每个元素都有一个index值(从0开始)标明元素在列表中的位置。在声明时可以带有一个泛型参数,即List<E> 。实现List接口的主要类有Vector、ArrayList和linkedList等。Vector和ArrayList以类似数组的形式进行存储,因此它的随机访问速度极快。linkedList的内部实现是链表,适合于在链表中间需要频繁进行插入和删除操作。
ArrayList/Vector常用方法:
- void add(Object obj) ,添加一个对象
- boolean addAll(Collection col),添加整个集合,如果接收者对象的结果有变化,则返回true
- int size() ,返回元素的个数。
- boolean isEmpty(),如果不含元素,则返回true
- Object get(int pos),返回指定位置的元素
- void set(int pos, Object obj),用参数对象替换指定位置的对象
- boolean remove(Object obj),去除给定对象的第一次出现,如果找到了对象,则返回true。去除一个对象后,其后面的所有对象都依次向前移动。
- Object remove(int pos),去除给定位置的元素,并返回被去除的对象
- boolean removeAll(Collection<?> col),从接收者对象中去除所有在参数对象中出现的元素,如果接收者对象的结果有变化,则返回true
- void clear() ,去除所有的元素
- boolean contains(Object obj),返回是否包含指定的对象,如果包含则返回true;否则,返回false
- boolean containsAll(Collection<?> col),返回是否包含参数col中的所有对象
- int indexOf(Object obj),返回给定对象在Vector /ArrayList中第一次出现的位置,如不存在,则返回-1
(2)Set接口
- Set接口
Set接口扩展了Collection接口,禁止重复的元素,是数学中“集合”的抽象。实现它的两个主要类是哈希集合(HashSet)及树集合(TreeSet)。
(3)Map接口
- Map接口
Map用于存储“关键字”(key)和“值”(value)的元素对,其中每个键映射到一个值,当需要通过关键字实现对值的快速存取时使用。两个主要实现类:TreeMap、HashMap。
Map接口常用方法:
- int size(),返回Map中的元素个数
- boolean isEmpty(),返回Map中是否包含元素,如不包括任何元素,则返回true
- boolean containsKey(Object key),判断给定的参数是否是Map中的一个关键字(key)
- boolean containsValue(Object val),判断给定的参数是否是Map中的一个值(value)
- Object get(Object key),返回Map中与给定关键字相关联的值(value)
- Collection values(),返回包含Map中所有值(value)的Collection对象
- Set keySet(),返回包含Map中所有关键字(key)的Set对象
- Set entrySet(),返回包含Map中所有项的Set对象
- Object put(Object key, Object val),将给定的关键字(key)/值(value)对加入到Map对象中。其中关键字(key)必须唯一,否则,新加入的值会取代Map对象中已有的值
- void putAll(Map m),将给定的参数Map中的所有项加入到接收者Map对象中
- Object remove(Object key),将关键字为给定参数的项从Map对象中删除
- void clear(),从Map对象中删除所有的项
(4)Iterator接口
- Iterator接口
Iterator接口是一个遍历集合元素的工具,并具有从正在遍历的集合中去除对象的能力。具有如下三个实例方法,
- hasNext(),判断是否还有元素
- next(),取得下一个元素
- remove(),去除一个元素。注意是从集合中去除最后调用next()返回的元素,而不是从Iterator类中去除
(5)Collections类
- Collections类
Collections类提供了对集合的操作,包括
- 排序算法sort
对List重新排序,使其中的元素按照某种次序关系升序排列。有两种形式,简单形式只是将元素按照自然次序排列,第二种形式需要一个附加的Comparator对象作为参数,用于规定比较规则,可用于实现反序或特殊次序排序。
- 洗牌算法shuffle
其作用与排序算法恰好相反,它打乱List中的任何次序。也就是说以随机方式重排元素,任何次序出现的几率都是相等的。在实现偶然性游戏的时候,这个算法很有用。
- reverse:将一个List中的元素反向排列
- fill:用指定的值覆写List中的每一个元素,这个操作在重新初始化List时有用
copy:接受两个参数,目标List和源List,将源中的元素复制到目标,覆写其中的内容。目标List必须至少与源一样长,如果更长,则多余的部分内容不受影响。
(1)代码实现
(3)结果展示
(1)代码实现
(1)题目要求
(2)代码实现
枚举类型:Gender.java
实现要求:Student.java
测试代码:text.java
运行结果:
(1)题目
(2)实现过程
- 新建一个工程,命名为Shape。
- 在工程中新建一个类,命名为Shape,Shape类为抽象类,包含抽象方法draw,实现代码为:
- 新建Rectangle类,从Shape类派生并实现抽象方法draw,实现代码为:
- 新建Circle类,从Shape类派生并实现抽象方法draw,实现代码为:
- 新建ShapeTester类,此类是本工程的主类,包含程序入口函数main,实现代码为:
(3)结果显示
- 创建字符串
- 连接字符串
- 获取字符串信息
(1)获取字符串长度
使用String类的length()方法可获取声明的字符串对象的长度。
例1:获取字符串长度
- 字符串查找
(1)indexOf()法
例2:查找n在字符串str中的索引位置。
(2)lastIndexOf()法
返回指定字符串最后一次出现的索引位置。
- 获取指定索引字符串
例3:在类中查找第六位字符是。
- 获取子字符串
(1)substring(int beginindex)
返回的是指定的索引位置开始截取直到该字符串结尾的子串。
例4:截取字符串
(2)substring(int beginindex,int endindex)
例5:截取
- 去除空格
trim方法返回字符串副本,忽略前导空格、尾部空格。
例6:
- 字符串替换
例7:把a替换成A
- 判断字符串开始与结尾
(1)startsWith()方法
判断当前字符串对象的前缀是否为参数指定字符串。
(2)endsWith()方法
判断当前字符串是否为以给定的子字符串结束。
例8:
- 判断字符串是否相等
不能使用==来进行字符串相等的比较。
(1)equals()方法
如果字符串具有相同的字符和长度,则使用equals()的方法进行比较时,则返回true。(区分大小写)
str、otherstr是要比较的两个字符串对象。
(2)equalsIgnoreCase() (不区分大小写)
例9:
- 按字典顺序比较两个字符串
str、otherstr要比较的两个字符串。
- 字符串大小写转换
(1)toLowerCase()方法(数字和非字符串不受影响)
将String转换成小写,str要转换的字符。
(2)toUpperCase()方法(数字和非字符串不受影响)
将String转换成大写。
例10:
- 字符串分割
(1)split(String sign)
利用StringBuilder类中的方法可动态的执行添加、删除、和插入等字符串的操作。
(1)append(content)
content表示要追加到字符串生成器中的内容。
(2)insert(int offset arg)
例14:
(3)delete(int start,int end)
例15:
- 创建一维数组
数据元素类型决定了数组的数据类型。
使用new为数组分配内存时,整数型数组中各个元素中的值为0;
声明的同时为数组分配内存空间:
- 初始化一维数组
两种方式:
- 使用一维数组
例1:在主方法中创建int型数组,实现各个月的天数输出;
- 二维数组创建
先声明,再用new运算符进行内存分配:
也可以为每一维分配内存:
声明内存的同时为数组分配内存。
- 二维数组初始化
- 使用二维数组
例2:输出一个3行4列且所有元素为0的矩阵。
- 遍历数组
结果:
- 填充替换数组元素
(1)fill(int[] a,int value)
a:要进行元素替换的数组;
value:要存储数组中所有元素的值;
例3:创建一维数组,通过fill进行填充,最后将数组中的元素输出;
结果:
(2)fill(int[] a,int formIndex,int toIndex,int value)
a:要填充的数组;
formIndex:填充第一个元素索引(包含);
toIndex:填充最后一个元素(不包含);
value:要存储所有元素中的值;
例4:创建一维数组,通过fill进行填充,最后将数组中的元素输出;
结果:
- 对数组进行排序
通过Arrays类的静态sort()方法可以进行实现数组的排序,可以对任意数组进行升序排列。
例5:创建一维数组,将数组排序后输出。
结果:
- 复制数组
(1)copyOf(arr,int newlength)
arr:要进行复制的数组;
newlength:int型常量,指复制后新数组的长度,如果新数组长度大于数组arr长度,则用0进行补充。如果新数组长度小于数组arr长度,满足截取长度即可。
结果:
(2)copyOfRange(arr,int formIndex,int toIndex)
arr:要进行复制数组对象;
formIndex:开始复制指定数组位置;
toIndex:要复制范围的最后索引位置;
结果:
- 数组查询
(1)binarySearch(Object[] a,Object key)
a:要搜索的数组;
key:要搜索的值;
如果key包含在数组中,则返回索引值;否则返回-1或“-”;
结果:
(2)binarySearch(Object[] a,int formIndex,int toIndex,Object key)
a:要进行检索的数组;
formIndex:指定范围的开始处索引;
toIndex:指定范围的结束出索引;
key:要搜索的元素;
结果:
基本思想:对比相邻的元素值,如果满足条件就交换值,把较小的元素移动到数组前面,把大的元素移动到数组后面。
实例:{34,56,67,23,12,4}运用冒泡排序进行操作;
结果显示:
基本思想:将指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值。
结果显示:
基本思想:把最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,依次类推。
结果显示:
通常把对象划分成两个部分,即静态部分和动态部分。
对象是类抽象出来的一个实例。
类就是同一类实物的统称,如果将任意事物抽象成对象,类就是这类对象的统称。
面向对象程序的特点:
- 封装性
封装是面向对象编程的核心思想,将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装思想。
- 继承性
继承性主要利用特定对象之间的共有属性,只能说子类的实例都是父类的实例,但不能说父类的实例是子类的实例。
- 多态性
将父类对象应用于子类的特征就是多态。
5.2.1 成员变量
例1:在项目中创建Book类,在该类中定义并使用成员变量;
5. 2.2 成员方法
语法格式为:
Java中的成员方法无返回值,可以使用void关键字表示;
局部变量是在方法被执行时创建,在方法执行结束时被销毁。局部变量在使用时必须进行赋值操作,否则将出现编译出错。
局部变量的有效范围从该变量的声明开始到该变量的结束为止。
在不同嵌套区域可以定义相同名称和类型的局部变量。
在嵌套区域中不可以定义相同名称和类型的局部变量。
5.2.5 this关键字
在项目中创建一个类,该类中定义了setName(),并将方法的参数值赋予类中的成员变量。
this.name指的是Book中的name成员变量。
第二个name指的是形参name。
实现功能为将形参name的值赋予成员变量name。
构造方法的特点:
构造方法定义语法格式:
如果类中没有明确构造方法,编译器会自动创建一个不带参数的默认构造方法。
由static修饰的变量、常量、方法被称为静态变量、常量、方法;
在项目中创建StaticTest类,该类中的主方法调用静态成员并在控制台输出;、
静态方法中不可以使用this关键字;
在静态方法中不可以之间调用非静态方法;
在java中规定不能讲将方法体内的局部变量声明为static的;
主方法是类的切入口,它定义了程序从何处开始。
- 主方法是静态的;
- 主方法没有返回值;
- 主方法形参为数组;
5.6.1 对象的创建
在Java中使用new操作符调用构造方法创建对象;
结果显示:
5.6.3 对象的引用
5.6.4 对象的比较
两种比较方式:“==”和equals()方法;
“==”和equals()方法比较内容是不同的,equals()方法是String类中的方法,它用于比较两个对象引用所指的内容是否相等;
而“==”运算符比较的是两个对象引用的地址是否相等。
例:
结果显示:
5.6.5 对象的销毁
- 对象引用超过其作用范围,这个对象将视为垃圾;
- 将对象赋值为null;
结果显示:
常量:Integer类提供以下四个常量:
MAX_VALUE:表示int类型可取的最大值;
MIN_VALUE:表示int类型可取最小值;
SIZE:用来以二进制补码形式表示int值的位数;
TYPE:表示基本类型int的class实例;
Boolean类将基本类型为boolean的值包装在一个对象中。
调用booleanValue()方法将创建的对象重新转换为boolean数据输出。
结果显示:
常量:
TRUE:对应基值true的Boolean对象;
FALSE:对应基值false的Boolean对象;
TYPE:基本类型boolean的Class对象;
Byte类将基本类型为byte的值包装在一个对象中。
Character类将基本类型为char的值包装在一个对象中。
Character类的判断功能:
public static boolean isDigit(char ch)确定指定字符是否为数字。public static boolean isLetter(char ch) 确定指定字符是否为字母。public static boolean isLowerCase(char ch)确定是否是小写字母字符public static boolean isUpperCase(char ch)确定是否大写字母字符
两个转换功能:
public static int toLowerCase(char ch)使用取自 UnicodeData 文件的大小写映射信息将字符参数转换为小写。public static int toUpperCase(char ch)使用取自 UnicodeData 文件的大小写映射信息将字符参数转换为大写。
例:
7.2.2 指数函数方法
7.2.3 取整函数方法
7.2.4 取最大值、最小值、绝对值函数方法
7.3.1 Math.random()方法
在Math类中存在一个random()方法,用于产生随机数字,这个方法默认生成大于等于0.0且小于1.0的double型随机数。
即0.0<Math.random()<1.0;
例:在4到34之间任意生成一个偶数;
7.3.2 Random类
通过实例化一个Random对象创建一个随机生成器。
public int nextInt():返回一个随机整数。
public int nextInt(int n):返回大于等于0且小于n的随机整数。
public long nextLong():返回一个随机长整型值。
public boolean nextBoolean():返回一个随机布尔型值。
public float nextFloat():返回一个随机浮点型值。
public double nextDouble():返回一个随机双精度型值。
public double nextGaussian():返回一个随机概率密度为高斯分布的双精度值。
例:
结果显示:
7.4.1 BigInteger
java.math.BigInteger类针对大整数的处理类,用于高精度计算。下面给出其用法(双引号不能去掉):
下面给出一些函数:
例:
结果显示:
7.4.2 BigDecimal
java.math.BigDecimal类则针对大小数的处理类。
例:
继承基本思想:基于某个父类的拓展,制定出一个新的子类,子类可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者重写父类中的某些方法。
使用关键字extends来标识两个类的继承关系。
例1:在项目中创建Test1和Test2类,进行相关说明演示。
Test2类继承Test1类,所以Test1为Test2的父类。
在子类构造方法中使用super()语句调用父类的构造方法,也可以在子类中使用super关键字调用父类的成员方法。
子类没有权限去调用父类中被修饰为private方法,只可以调用父类修饰为public或protected的成员方法。
在重写父类方法时,修改方法的修饰权限只能从小到大的范围改变。
例2:创建Test1、Test2、Test3类,继承关系为Test2继承Test1,Test3继承Test2,分别在这三个类构造方法中输出构造方法名称。
从结果中可以看出调用构造方法的顺序,首先是顶级父类,然后是上一级父类,最后是子类。也就是说,实例化子类对象时首先要实例化父类对象,然后在实例化子类对象。
在实例化子类对象时,父类无参构造方法将自动调用,但有参构造方法并不能被自动调用,只能依赖于super关键字显式调用父类构造方法。
在java中,所有的类都直接或者间接继承了java.lang.Object类。
Object类是比较特殊的类,它是所有类的父类,是java类层中的最高层类。
由于所有类都是Object子类,所以在定义类时,省略了extends Object关键字。
Object类中几个重要方法:
8.2.1 getClass()方法
getClass()方法是Object()类定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。
8.2.2 toString()方法
将一个对象返回为字符串形式,它返回一个String实例。
8.2.3 equals()方法
两种比较方式:“==”和equals()方法;
“==”和equals()方法比较内容是不同的,equals()方法是String类中的方法,它用于比较两个对象引用所指的内容是否相等;
而“==”运算符比较的是两个对象引用的地址是否相等。
8.3.1 向上转型
8.3.2 向下转型
通过向上转型可以推出向下转型是将较抽象的类转换为较具体的类。
如果将父类对象直接赋予给子类,会发生编译器错误,因为一个父类对象不一定是子类的实例。
当程序中执行向下转型操作时,如果父类对象不是子类对象实例,就会发生异常,所以呢,我们在用到向下转型之前,一定要首先判断父类的对象是否为子类的实例。
我们用操作符instanceof来完成。格式如下:
myobject:某类的引用对象。
ExampleClass:某个类。
操作符返回值为布尔类型,如果返回值为true则是,否则相反。
前面的内容已经学过了构造方法,知道构造方法的名称是由类名决定的,但如果我们希望以不同的方式来实例化对象,就需要多个构造方法来完成,由于这些构造方法是由类名进行命名的,为了能让方法名相同而形参不同的构造方法同时存在,必须要用到方法的重载。
方法的重载就是在同一个类中允许同时存在一个以上的同名方法,只要这些方法的参数个数或类型不同即可。
例:
结果显示:
根据以上可以得出以下结论:
在涉及方法重载时候,会想到定义不定长参数方法。
实例:
结果显示:
利用多态可以使程序具有良好的扩展性,并可以对所有类对象进行通用的处理方法。
在这里可以举个实例:
比如我们现在定义了一个四边形类,可以让它处理所有继承该类的对象,然后利用向上转型理念可以把每个继承四边形类的对象作为draw()方法参数,然后根据不同的图形对象绘制相应的图形。这样可以避免代码冗余问题,便于维护。
程序员无需在所有的子类中执行相同功能的算法,只要可以实例化一个继承父类的子类对象即可调用相应的方法。只要去维护父类中的这个方法即可。
Java语言中设置抽象类不可以实例化对象,图形类不同抽象出任何一种具体图形,但子类可以。、
格式:
abstract:抽象类的关键字;
使用abstract关键字定义的类是抽象类,使用这个关键字定义的方法称为抽象方法。
抽象方法没有方法体,这个方法本身没有任何意义,实际上抽象类除了被继承之外没有任何意义。
另外Java中规定了类不能同时继承多个父类,面临这种问题,就出现了接口的概念。
接口是抽象类的延伸,可以把接口看做成抽象类。
接口中所有的方法都没有方法体。
格式:
public:权限修饰符。
interface:定义接口关键字。
drawTest:接口名称。
一个类实现一个接口可以使用implements关键字。
在接口中定义的任何字段都是static或final的。
例:把多态技术与接口相结合。
结果显示:
我们知道在Java中不允许多重继承,但使用接口就可以实现多重继承。因为一个类可以同时实现多个接口,这样可以使用implements关键字后并且使用逗号分隔开来。
final关键可以用于变量声明,一旦变量被设定,就不可以改变变量的值。
由final变量定义的变量为常量。
当在程序中使用PI这个常量时候,它的值为3.14,。
final关键字定义的变量必须在声明时对其进行赋值操作。
final可以修饰基本数据类型常量、修饰对象引用、修饰数组,一旦被final修饰后,他只能恒定指定一个对象,无法改变以指向另一个对象。
例:在com.fan包中创建FinalTest类,定义各种类型的final变量。
被定义的final的常量定义时需要使用大写字母命名规则。
在java中定义的全局变量,通常使用public static final修饰,这样的常量只能在定义时被赋值。
final数据可以出现的位置:
定义为final的方法不能被重写。
将方法定义为final类型可以防止子类修改该类的定义与实现的方法,同时定义为final的方法的执行效率要高于非final方法。
结果显示:
从本例子可以看出,final方法不可以被覆盖。
定义为final类不可以被继承。
如果你希望一个类不允许任何类继承,并且不允许其它人对于这个类进行任何改动,可以定义为final形式。
final类格式如下:
如果某个类设置成final形式,则类中所有方法都被隐藏设置为final形式,但final成员变量可以被定义为final或非final形式。
例如:
结果显示:
在java程序中每定义好一个类,通过Java编译进行编译之后,都会生成一个扩展名为.class的文件,当这个程序规模逐渐扩大时候,就很容易发生类名冲突现象,所以在java中提供了一种管理文件的机制,就是类包。
例如:java.lang.Math;
java.lang为包的名称。
Math为类的名称。
一个完整的类名需要包名和类名的组合,每个类都隶属于一个类包,只要保证同一类包中的类不同名,就可以有效的避免同名类冲突的情况,用类包的时候需要指定完整的类路径。
例:在程序中使用两个不同Data类完整路径。
在java中使用类包十分重要,类包可以解决类名冲突问题。
在类包定义语法为:
在类中指定包名时需要将package表达式放置在程序的第一行,它必须使文件中第一行非注释代码,当使用package关键字为类指定包名之后,包名将会成为类名中的一部分。
Java包的命名规则是全部必须全部为小写字母。
在Java中定义包名时通常使用创建者的Internet域名的反序,由于域名是独一无二的,所以包自然也不会发生冲突。
用法:
在使用关键字import时,可以指定类完整描述,如果为了使用包中更多的类,可以使用import关键字指定时候在包指定后加上*,这表示可以在程序中使用包中所有的类。
语法格式:
例:比较5和6的大小。
在文件中定义两个类,但其中任何一个类都不在另一个类的内部,而如果在定义一个类,则将在类中在定义的那个类称为内部类。
语法格式为:
在内部类中可以任意使用外部类的成员变量以及成员方法。
例:
内部类向上转型为接口:
可以在外部提供一个借口,在接口中声明一个方法。
非内部类不可以被声明为private或protected访问类型。
使用this关键字获取内部类与外部类的引用:
如果内部类与外部类中定义的成员变量与内部类的成员变量名称相同,可以使用this关键字;
内部类不仅可以在类中定义,也可以在类的局部位置定义,如在类的方法任意的作用域中均可以定义。
在方法中定义的内部类只能访问方法中final类型的局部变量。
例:在return语句中编写返回值为一个匿名内部类。
匿名类的所有实现代码都要需要在大括号之间进行编写。
其中A为类名;
在内部类前添加修饰符static,这个内部类就变成了静态内部类了。
一个静态内部类中可以声明static成员,而在非静态内部类中不可以声明静态成员。
静态内部类具有以下两个特点:
- 如果创建静态内部类的对象,不需要其外部类的对象。
- 不能从静态内部类的对象中访问非静态外部类的对象。
内部类和其它普通类一样可以被继承,需要特定的语句来实现。
例:
在程序中,可能产生没有预料的各种情况,或者超出可控的范围环境因素。
异常是一个在程序执行期间发生的事件,它中断了环境正在执行的程序的正常指令流。
例:
程序报出算数异常:
系统不再继续执行下去,提前结束,这就是所说的异常。
可以使用在Java中捕获异常的方法。
异常产生后,如果不做任何处理,程序就会被终止,不再执行下面的语句。
可以通过捕获异常语句来处理:异常捕获结构由三部分组成,try、catch、finally,try是存放是可能发生异常的语句,catch程序块在try语句块之后,用来激发被捕获的异常,finally语句块是异常处理结构最后执行的语句。
(1)try-catch
Integer.parseInt():将一个字符串转化成一个整数,如果字符串不是整数形式,就会抛出异常。
上面例子中,先执行try语句块中的代码,当执行到:
发生异常,程序转接到catch代码块中执行,输出异常信息。
最后继续执行后面的代码。
异常处理常用以下三个函数来获取相关信息:
(2)finally
完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,都会执行finally语句;
下面四种情况不会执行finally语句块:
所有的类都是Throwable类的子类,Throwable类派生了两个类,分别是Exception和Error类。
Error类:用来描述java系统中的内部错误以及资源耗尽的错误,这些错误比较严重。
- 空指针异常类:NullPointerException
- 类型强制转换异常:ClassCastException
- 数组负下标异常:NegativeArrayException
- 数组下标越界异常:ArrayIndexOutOfBoundsException
- 违背安全原则异常:SecturityException
- 文件已结束异常:EOFException
- 文件未找到异常:FileNotFoundException
- 字符串转换为数字异常:NumberFormatException
- 操作数据库异常:SQLException
- 输入输出异常:IOException
在程序中使用自定义异常步骤:
- 创建自定义异常类
- 在方法中通过throw关键字抛出异常
- 进行下一步