Java 学习笔记
1. Hello World
package test; public class HelloWorld { // 建立了一个类HelloWorld,public指出这个类是公共类,定义任何类都要用关键字class来标识。任何java程序都要以类的形式出现,一个程序中可以定义若干个类,但只能定义一个public类,源文件名必须和public类名相同 public static void main(String []args) { // 主方法的入口,用main定义一个主方法,所有的java程序都是由主方法开始执行,其中public表明所有的类都可以调用这个方法,static表明这个方法可以通过类名直接调用,void表明此方法执行后不返回任何值,括号内是向main传递的参数 System.out.println("Hello World"); //System是系统类,out是标准输出对象,println()是一个方法,这行代码的作用是调用类System中的标准输出对象out中的println方法,括号内是要打印的字符串 } }
2. Java符号集
标识符
定义:计算机中运行或存在的任何一个成分,都需要一个名字来标记它的存在和唯一性
规则:字母下划线或美元符号开头,区分大小写
关键字(保留字):主要是类型标识符(int、float、class等),或者控制语句中的关键字
数据可以区分为不同的类型,其中我没见过的类型是:接口,关键字是interface;
注意数组没有关键字,因为数组没有固定的数据类型,可能是整型、字符类型或其他类型
运算符
分隔符:() {} [] ; , 空格符
常量:
定义:程序运行过程中值始终保持不点的量
分类:
整数型常量:23、-23、0
浮点型常量:
单精度(float):2.3f、2.3F
双精度(double):浮点型常量后不加任何字符或者加上d或D表示双精度:2.3、2.3D、2.3d
布尔型常量:true和flase
字符型常量,包括:
用单引号括起的单个字符:'b', 'F', '4', '*'
用单引号括起的转义字符,反斜杠开头,后面跟一个字母,来表示某个特定的控制符:'\n'换行, '\r'回车
字符串常量:用双引号括起的0个或多个字符串序列,可以包括转义字符:"Hello", "two \nline", "\22\u3f07\n A B 123\n"
变量:
定义:程序运行过程中值可以改变的量
两重含义:
变量名:自己定义的标识符
变量值:这个变量在某一时刻的取值
声明变量:java的变量要先声明后使用,声明时要给出变量名称并指明变量类型,必要时可以指定初始值;声明变量后如果在使用前没有赋值,编译时就会报错
3. 表达式和语句
表达式:
定义:用运算符把操作数连接起来表达某种运算或含义的式子
用途:通常用于简单的计算或者描述一个操作条件
分类:
算术表达式:
定义:由算数运算符和位运算符与操作数连接组成的表达式
注意:
两个整数做除法时,结果只保留整数部分
a++和++a有区别:++a先赋值后运算(先加一再说),a++先运算后赋值(先把运算算完了再把a加一)
关系表达式:利用关系运算符连接的式子,比如x<=y,运算结果是true或flase
逻辑表达式:利用逻辑运算符连接的式子,运算符包括:!非 , ^ 异或 , &&, ||
赋值表达式:=
条件表达式:
条件运算符( ) ? : ,也叫三元运算符,它有三个操作数,并且需要判断布尔表达式的值
该运算符的主要作用是决定哪个值赋给哪个变量
例子:
b = (a == 1) ? 20 : 30;
,意思是a是不是等于1?是的话b等于20,否则等于30
相同类型的操作数才能进行运算,不同的需要强制类型转换,分类:
显式类型转换:人为在表达式前指明要转换的类型,比如 (int)h,但注意:显式类型转换时暂时的
隐式类型转换:会自动转换为较高(取值范围较大)的类型
int+float,转float
int或float与double,转double
char+int,转int
4. 程序控制结构
顺序结构
分支结构
if( ) {} else if( ) {} else {}
switch(grade) { case 'A': System.out.println("Very good!"); break; case 'B': case 'C': System.out.println("Just so so."); break; default: // default不需要break System.out.println("Unknown grade"); } // break语句会终止switch语句,跳到switch的下一句执行,而没有break就会继续执行下一条case,直到break出现
循环结构
while
do … while:和while类似,不同的是循环体至少执行一次
for:for(循环变量初值;退出循环的条件;更新循环变量)
5. 类和对象
对象:
定义:对象是一个类的实例,有状态和行为
创建对象:声明对象后创建对象,类名 对象名= new 类名()
对象初始化:创建对象时,通常要给对象的数据成员赋初始值,通过构造方法完成
类:
定义:类是一个模板,描述一类对象的行为和状态,把状态称为属性,把行为称为方法
描述一个类要指定:
类标识:一个类区别于其他类的名字
属性说明:描述相同对象的静态特征
方法说明:描述相同对象的动态特征
// 用户自定义的类格式 class 类名 { 数据成员 // 描述对象的属性 成员方法 // 刻画对象的行为或动作,一个成员方法确定一个功能或操作 }
当成员方法形参名与数据成员名相同时,或者成员方法局部变量名与数据成员名相同时,在方法内部借助this来明确表示引用的是类的数据成员,而不是形参或局部变量,从而提高程序可读性,使用形式:this.数据成员、this.成员方法(参数)[相等于python 中的self.数据成员]
构造方法:
一个类的方法中方法名与类名相同的类方法(相当于python中的
__init__
方法),每当使用new关键字创建一个对象时,java系统自动调用构造方法初始化新建的对象构造方法的特殊性:
构造方法的方法名和类名相同
构造方法是类的方法,它能够简化对象数据成员的初始化操作
不能对构造方法指定类型,它有隐含的返回值,该值由系统内部使用
构造方法一般不能由编程人员显式地调用,在创建一个类的对象的同时,系统会自动调用该类的构造方法将新对象初始化
构造方法可以重载,即可定义多个具有不同参数的构造方法
构造方法可以继承,即子类可以继承父类的构造方法
如果用户在一个自定义类中未定义该类的构造方法,系统将为这个类定义一个缺省的空构造方法。这个空构造方法没有形式参数,也没有任何具体语句,不能完成任何操作。但在创建一个新对象时,系统要调用该类的构造方法将新对象初始化。
注意:
类前面的public是类的修饰符,用于说明对该类的访问限制
public修饰的类是公共类,一个程序文件中只能定义一个public类,其余的类可以是无修饰符的类或者其他修饰符的类
如果一个类前面没有修饰符,那么这个类只能被同一个程序文件中的类使用
6. Java类库
定义:java类库是系统提供的已实现的标准类的集合,是java编程的API(Application Program Interface)
作用:可以直接调用,避免重复和可能的错误,提高编程效率
系统定义好的类会根据功能的不同,划分成不同的集合,每个集合称为一个包,所有的包合称为类库
使用类库的前提:这个系统类应该是用户程序可见的类,所以需要在用户程序中import需要使用的系统类或者系统类所在的包
使用方式:
直接使用系统类,例如输出字符串时使用的方法System.out.println(),就是系统类System的动态属性out方法
继承系统类,在用户程序里创建系统类的子类
创建系统类的对象
常用的包:
java.lang包
java.lang包是java语言的核心类库,包含运行java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等;每个java程序运行时,系统都会自动引入java.lang包
java.io包
java.io包中包含了实现java程序与操作系统、用户界面以及其他java程序之间进行数据交换所使用的类,如基本输入/输出流、文件输入/输出流、过滤输入/输出流、管道输入/输出流、随机输入/输出流等。凡是需要完成与操作系统有关的较低层的输入输出操作的java程序,都要使用该包
java.awt包
java.awt包是java语言用来构建图形用户界面(GUI)的类库,它包括了许多界面元素和资源。利用java.awt包,可以很方便地写出美观、方便、标准化的应用程序界面。java.awt包主要在三个方面提供界面设计支持:1. 低级绘图操作,如Graphics类等;2. 图形界面组件和布局管理,如Checkbox类、Container类、LayoutManager接口等;3. 界面用户交互控制和事件响应,如Event类
java.awt.event包
java.awt.event包是对JDK1.0版本中原有对Event类的一个扩充,它使得程序可以用不同的方式来处理不同类型的事件,并使每个图形界面的元素本身可以拥有处理它上面事件的能力
java.awt.image包
java.awt.image包是用来处理和操纵来自于网上的图片的java工具类库
java.applet包
java.applet包是用来实现运行于Internet浏览器中的java Applet的工具类库,它仅包含少量几个接口和一个非常有用的类Java.applet.Applet
7. Java修饰符
分类:
访问修饰符
作用:用来保护对类、变量、方法和构造方法的访问
访问权限:
default,默认的,不使用任何修饰符,只能被同一个包里的类使用
私有的,使用private修饰符指定,在同一个类内可见
共有的,使用public修饰符指定,对所有类可见
受保护的,使用protected修饰符指定,对同一包内的类和所有子类可见
修饰符 当前类 同一包内 子孙类 其他包 public Y Y Y Y protected Y Y Y N default Y Y N N private Y N N N 类修饰符:用于说明对类的访问限制
分类有:
无修饰符:上面的第一种,只能被同一个程序文件中的类使用
public:说明这个类是公共类,不但可以供它所在的包中的其他类使用,也可以供其他包中的类使用;在程序中可以用import语句引用其他包中的public类
final:该修饰符修饰的是最终类,最终类不能被其他任何类继承
abstract:该修饰符修饰的是抽象类,抽象类刻画了研究对象的公有行为特征,并通过继承机制将这些特征传送给它的派生类
注意事项:
可以同时使用两个修饰符来修饰一个类,当使用两个修饰符时,这些修饰符之间用空格分开,写在关键字class之前,修饰符的顺序对类的性质没有任何影响
一个类可以被修饰为public abstract,也可被修饰为public final,但不能被修饰为abstract final,这是因为abstract类自身没有对象,需要派生子类后再创建子类的对象,而final类不能派生子类,所以不存在用abstract final两个修饰符修饰的类
数据成员和成员方法的访问控制符:用于说明其他类能否访问该类的数据成员或成员方法
包括:
public:
一个类是public并且被其他包的程序中import后,就可以访问和引用这个类,创建这个类的对象,访问这个类内部可见的数据成员和引用它的可见方法
处于不同包中的public类作为整体对其他类是可见的,但是并不代表该类的所有数据成员和成员方法也同时对于其他类可见,要有数据成员和成员方法的修饰符来决定
只有public类中的数据成员和成员方法的访问控制符也被声明为public时,这个类所有用public修饰的数据成员和成员方法对于其他类才是可见的
private:
用private修饰的数据成员或成员方法只能被该类自身所访问修改,而不能被其他任何类(包括该类的子类)来访问和引用
类不能声明为private
当其他类实在想要获取或修改私有成员时,需要借助于类的方法来实现
protected:
用protected修饰的成员变量和方法可以被三种类引用:该类自身、与它在同一个包中的其他类、在其他包中的该类的子类
protected不能修饰类
缺省访问控制符
如果一个类没有访问控制符,说明它具有缺省的访问控制特性,这种特性被称为“友好访问”或包访问性;友好访问规定只有在同一包中的对象才能访问和引用这些类
类中的数据成员和成员方法也没有指定访问控制符,也具有友好访问的特性,即包访问性,可以被同一个包中的其他类所访问和引用
数据成员与方法 \ 类 public 缺省 public 所有类 包中类(含当前类) protected 包中类(含当前类),所有子类 包中类(含当前类) private 当前类本身 当前类本身 缺省 包中类(含当前类) 包中类(含当前类)
非访问权限修饰符
static
用static修饰符修饰的数据成员不属于任何一个类的具体对象,而是属于类的静态数据成员,一个类的任何对象访问它时,存取到的都是相同的数值,可以通过类名加点操作符访问它,static类数据成员仍属于类的作用域
还可以使用public static、private static等进行修饰,修饰符不同,可访问的层次也不同
final
用final修饰的数据成员被限定为最终数据成员。
最终数据成员可以在声明时进行初始化,也可以通过构造方法进行赋值,但不能在程序的其他部分赋值,它的值在程序的整个执行过程中是不能改变的,通常和static修饰符一起使用来创建类常量
8. Java变量类型
java中的所有变量使用前必须声明
变量类型:
类变量:独立于方法之外的变量,用static修饰
也称作静态变量,在类中以static关键字声明,但必须在方法、构造方法和语句块之外
一个类的任何对象访问它时,存取到的都是相同数值
静态变量除了被声明为常量外很少使用。常量是指声明为public/private,final和static类型的变量。常量初始化后不可改变。
静态变量在程序开始时创建,在程序结束时销毁
与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为public类型
默认值和实例变量相似。数值型变量的默认是0,布尔型的变量默认是false,引用类型变量的默认值是null。变量的值可以在声明的时候指定,也可以在构造方法中指定
静态变量可以通过:类名.变量 的方式访问
类变量被声明为public static final类型时,类变量名称一般建议使用大写字母。如果静态变量不是public和final类型,其命名方式与实例变量以及局部变量的命名方式一致
实例变量:独立于方法之外的变量,没有static修饰
实例变量声明在一个类中,但是在方法、构造方法和语句块之外
当一个对象被实例化后,每个实例变量的值就跟着确定
实例变量在对象创建的时候创建,在对象被销毁的时候销毁
实例变量的值应该至少被一个方法、构造方法或语句块引用,使得外部能够通过这些方式获取实例变量信息
实例变量可以声明在使用前或使用后
访问修饰符可以修饰实例变量
实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应把实例变量设为私有。通过访问修饰符可以使实例变量对子类可见
实例变量具有默认值。数值型变量的默认是0,布尔型的变量默认是false,引用类型变量的默认值是null。变量值可以在声明时指定,也可以在构造方法中指定
实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名:对象.变量
局部变量:类的方法中的变量
局部变量声明在方法、构造方法或者语句块中,随着它们被执行的时候创建,执行完成后局部变量会被销毁
访问修饰符不能用于局部变量,局部变量只在声明它的方法、构造方法或者语句块中可见
public class y{ static int a = 0; // 类变量 String str = "hello"; // 实例变量 public void method(){ int i = 0; // 局部变量 } }
9. 数组
作用:用来存储固定大小的同类型元素
声明数组:确定数组名、数组的维数和数组元素的数据类型,格式:类型标识符 数组名[]; 或 类型标识符[] 数组名,比如int abc[]; double[] abc;
初始化数组:数组初始化后,长度(可存放元素的个数)就不可再改变;初始化可以通过直接指定初值的方式完成,也可以通过new操作符来完成
// 直接指定初值 int[] a1 = {1,2,3,4}; // 用new初始化数组--方式一 int a[]; // 声明数组a a = new int[9]; // 初始化数组a,9是数组元素个数,和上一条语句中的数组名、类型标识符必须一致 // 用new初始化数组--方式二,声明数组的同时使用new关键字初始化 int[] a = new int[9];
引用数组:数组名+下标
获取数组长度:数组名.length
遍历数组:使用foreach循环(加强型循环),能在不使用下标的情况下遍历数组
int[] a = {1,2,3,4,5}; for(int element: a) { // int是每个元素的类型,element是每个元素,冒号后面是要遍历的数组 System.out.println(element); }
10. Character类
作用:用于对单个字符进行操作,Character类提供一系列方法来操作字符,可以使用Character的构造方法创建一个Character类对象:Character ch = new Character('a');
装箱和拆箱:将一个char类型的参数传递给需要一个Character类型参数的方法时,编译器会自动将char类型参数转换为Character对象,这种特征称为装箱,反之叫拆箱
// 原始字符a装箱到Character对象 Character ch = 'a'; // 原始字符b用test方法装箱,返回拆箱的值到c char c = test('b');
Character类的方法:
isLetter():是否是一个字母
isDigit():是否是一个数字字符
isWhitespace():是否是一个空格
isUpperCase():是否是大写字母
isLowerCase():是否是小写字母
toUpperCase():指定字母的大写形式
toLowerCase():指定字母的小写形式
toString():返回字符的字符串形式,字符串的长度仅为1
转义字符:前面有反斜杠的字符
\t:在文中该处插入一个tab键
\b:在文中该处插入一个后退键
\n:换行
\r:回车
\f:换页符
\':单引号
\":双引号
\\:反斜线
11. String类
String类(字符串类)的对象是一经创建便不能变动内容的字符串常量
字符串常量必须用双引号括起,一个串可以包含字母数字和各种特殊字符
任何字符串常量都是String类的对象,只不过在没有明确命名时,java自动为其创建一个匿名的String类的对象,于是它们也称为匿名String类的对象
创建String类的方法:String c1 = “hello”;
等号将匿名String类对象赋值给String类对象c1引用
访问器方法:用于获取有关对象的信息的方法,比如length()方法,可以获取字符串长度
连接字符串:
concat()方法:"hello".concat("world"),将两个字符串连接到一起
'+'操作符:"hello" + "world"
String类的方法:
charAt(int index):返回指定索引处的char值
compareTo(Object o):把这个字符串和另一个对象比较
concat(String str):将指定字符串连接到此字符串的结尾
indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引
indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
length():返回此字符串长度
indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
substring(int beginIndex):返回当前串中从下标beginIndex开始到串尾的子串
12. Java方法
Java方法是语句的集合,它们在一起执行一个功能,方法包含于类或对象中,在程序中被创建,在其他地方被引用;比如成员方法就是java方法
命名规则:必须以字母、'_'、'$'开头,可以包括数字,但是不能以数字开头
组成部分:
方法头:
修饰符:可选,用于告诉编译器该如何调用该方法,定义了该方法的访问类型
返回值类型:方法可能会有返回值。有些有返回值的写返回值具体的数据类型,有些没有返回值、只用于执行一些操作的方法返回值类型是关键字void
方法名:方法的实际名称,方法名和参数表共同构成了方法签名
参数类型:当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数
方法体:包含具体的语句,定义该方法的功能
方法重载:
编写两个或多个参数列表、返回值类型不一样但是名字一样的方法,会自动根据参数类型调用相应类型的方法
重载的方法必须拥有不同的参数列表,不能仅根据修饰符或者返回类型的不同来重载方法
变量的作用域:
定义:程序中该变量可以被引用的部分
方法内定义的参数就是局部变量,它的作用范围就是从声明开始,到包含它的块结束
方法的参数范围涵盖整个方法,参数实际上是一个局部变量
for循环的初始化部分声明的变量,其作用范围在整个循环;循环体内声明的变量其适用范围是从它的声明到循环体结束
13. 继承
如果类B有类A的全部属性和方法,而B自己还有一些特有的属性和方法,则A为一般类,B为A的特殊类
在面向对象程序设计中运用继承的原则,就是在一般类的对象实例和所有特殊类的对象实例所共有的属性和操作一次性显示定义完全,在特殊类中不在重复定义而是自动地、隐含的拥有一般类(或者更上层的一般类)中定义的属性和操作
特殊类的对象拥有其一般类的全部或部分属性与方法,称作特殊类对一般类的继承
一般类一般称作基类、父类或超类,特殊类一般称作派生类或子类
继承的优点:避免对一般类和特殊类之间共同特征进行重复描述。因为一般类中定义的属性和操作适用于这个类本身和它以下所有的每一层的特殊类的全部对象;越往上层的父类就越来越抽象
继承的特征:
继承关系是传递的。若C继承自B,B继承自A时,类C既有从B继承下的属性和方法,也有从A继承下的属性和方法,还可以有自己定义的属性和方法
继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系
提供软件复用功能。若B继承自A,建立类B时只需再描述与基类不同的少量特征(数据成员和成员方法)。这种做法能减小代码和数据的冗余度,大大增加程序的重用性
增加程序的易维护性
提供多重继承机制。从理论上说,一个类可以是多个一般类的特殊类,它可以从多个一般类中继承属性与方法,这就是多重继承。但是Java出于安全性和可靠性考虑,仅支持单重继承,而通过使用接口机制来实现多重继承(只有一个父结点的属于单重继承,有多个父结点的属于多重继承)
继承的实现:
关键字:extends,定义类的时候使用关键字extends来指明新定义类的父类
新定义的类可以从父类那里继承所有非private的属性和方法作为自己的成员
实际上,在定义一个类而不使用extends给出父类名时,这个类默认是系统类object类的子类
this和super关键字:
this:指向自己、也就是当前对象的引用
super:通过super关键字实现对父类成员对访问,用来引用当前对象的父类
final关键字:可以把类定义为不能继承的,即最终类;也可以把final用于修饰方法,该方法不能被子类重写
继承中的构造器(构造方法/函数):子类不能继承父类的构造器,但是父类的构造器要是带有参数,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表;如果父类有无参构造器,则用super调用父类构造器不是必须的,因为系统会自动在子类的构造器最开始调用父类的无参构造器
14. 重写与重载
重写(Override):子类对父类的允许访问的方法的实现过程进行重新编写,但返回值和形参都不能改变
方法的重写规则:
参数列表和返回类型必须完全与被重写的方法相同
访问权限不能比父类中被重写的方法的访问权限更低。例如,如果父类的一个方法是public,那么子类中重写该方法就不能声明为protected
父类的成员方法只能被它的子类重写
声明为final的方法不能被重写
声明为static的方法不能被重写,但是能够再次声明
子类和父类在同一个包中,那么子类可以重写除了声明为private和final的所有方法
子类和父类不在同一个包中,那么子类只能重写父类声明为public和protected的非final方法
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之可以
构造方法不能被重写
如果不能继承一个方法,那么就不能重写这个方法
重载(Overload):是在一个类里,方法名字相同,而参数不同。返回类型可以相同也可以不同,每个重载的方法(或构造函数)都必须有一个独一无二的参数类型类标
最常用的地方就是构造器的重载
重载的规则:
被重载的方法必须改变参数列表(参数个数或类型或顺序不一样)
被重载的方法可以改变返回类型
被重载的方法可以改变访问修饰符
被重载的方法可以声明新的或更广的检查异常
方法能够在同一个类中或者在一个子类中被重载
无法以返回值类型作为重载函数的区分标准
重载和重写之间的区别:
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
15. 异常处理机制
作用:及时有效地处理程序运行中的异常错误
Java引入了很多异常和异常类,并且定义了很多异常类;每一个异常类都代表一类运行错误,类中包含了该运行错误的信息和处理错误的方法等内容
每当java程序运行过程中发生一个可识别的运行错误时,系统都会产生一个相应的异常类的对象,并由系统中相应的机制来处理,以确保不会产生死机、死循环或者其他对操作系统由损害的结果,从而保证了整个程序运行的安全性
所有的异常类(Exception类)都继承自java.lang.Throwable类,Exception类是Throwable类的子类,包含了一般性的异常;Throwable中除了Exception类外还有一个子类Error,Error用来指示运行时环境发生的错误
异常的继承关系(忽略yes和no)
java定义了一些异常类在java.lang标准包中,标准运行时异常类的子类时最常见的异常类。由于java.lang包默认加载到所有java程序,所以大部分从运行时异常类继承来的异常都可以直接使用
Exception异常类分为运行时异常类(RuntimeException)和非运行时异常(Non_RuntimeException)
运行时异常:java运行系统执行过程中的异常,常见的运行时异常类:
异常类名 | 功能说明 |
---|---|
ArithmeticException | 除数为0的异常 |
IndexOutOfBoundsException | 下标越界异常 |
ArrayIndexOutOfBoundsException | 访问数组元素下标越界异常 |
StringIndexOutOfBoundsException | 字符串下标越界异常 |
ClassCastException | 类强制转换异常 |
非运行时异常:由Java编译器在编译时检测是否会发生在方法的执行过程中的异常,常见的有:
异常类名 | 功能说明 |
---|---|
ClassNotFoundException | 指定类或借口不存在的异常 |
IllegalAccessException | 非法访问异常 |
IOException | 输入输出异常 |
ProtocolException | 网络协议异常 |
SocketException | Socket操作异常 |
Error类定义了正常情况下不希望捕捉的错误,常见的:
异常类名 | 功能说明 |
---|---|
LinkageError | 动态连接失败 |
VirtualMachineError | 虚拟机错误 |
AWTError | AWT错误 |
异常处理机制结构:
采用java异常处理机制的预设方法处理:一旦程序发生异常,程序就会被终止并显示一些错误信息给用户
缺点:大多数情况下只会输出一些简单的信息,然后结束程序运行,多数情况下不符合我们的要求
自行处理:用java提供的try-catch-finally语句自行处理
优点:
最主要的:将处理异常的代码与程序代码的主线分离开,增强了程序的可读性
减少中途终止程序运行的可能性
-
程序运行期间try是否有异常执行catch执行finallyyesno
使用try和catch可以捕获异常,try和catch代码块称为保护代码,放在异常可能发生的地方
try { // 程序代码 }catch(异常类,异常变量) { // 捕捉异常类有关的处理结构 } finally { // 不管发不发生异常都要执行的部分 }
try:将可能出现错误的程序代码放在try块中,对try块中的程序代码进行检查,可能会抛出一个或多个异常
catch:包含要捕获的异常类型的声明。当保护代码块中发生一个异常时,catch块就会被检查。如果发生的异常包含在catch块中,异常会被传递到该catch块
多重捕获异常:一个try后面跟着多个catch代码块。发生异常时,异常先给第一个catch块,如果异常的数据类型和第一个catch块的异常类型匹配,那么就会在这里被捕获;要是不匹配,就会传给第二个catch块。直到异常被捕获,忽略掉后面所有的catch,或者通过所有的catch块
finally:在try-catch语句后执行,不管抛不抛异常都要执行
一般异常都是程序运行时抛出的,也可根据实际情况手动在程序中抛出异常,使用Throw和Throws语句抛出异常
Throw:用来明确地抛出一个异常;作用就是改变程序的执行流程,使程序跳到相应的异常处理语句中执行
throw new ArrayIndexOutOfBoundsException();
Thows:把异常向上移,交给调用这个方法的方法来处理,而不是一个方法本身处理异常
throws用在声明方法时,表示该方法可能要抛出异常:
void function() throws ArithmeticException{}
两者的区别:
throws出现在方法函数头,而throw出现在函数体
throws表示出现异常的一种可能性,并不代表一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象