JAVA SE(十七)—— JAVA 异常Exception(异常结构图、throw关键字、throws关键字、try...catch...finally捕获异常)

一、Java异常层次结构图

在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出),Throwable: 有两个重要的子类:Exception(异常)和 Error(错误)

二、Java异常分类

如上图,Java异常可分为两类:错误Error和异常Exception,其中异常Exception又分为编译时异常和运行时异常RunTimeException。

1、错误Error

  • 错误,是程序无法处理的错误,表示运行应用程序中较严重问题。
  • 大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。
  • 错误在程序中无须处理,而有运行环境处理。
  • 常见异常如:
    OutOfMemoeyErroe:Java heap space 堆内存溢出 一般常见于系统错误,没法解决,只能修改代码。
    StackOverLowError 栈内存溢出。

2、异常Exception
异常Exception是程序本身可以处理的异常。Exception 类有一个重要的子类 RuntimeException表示运行时异常,RuntimeException 类及其子类表示“JVM 常用操作”引发的错误。
(1)运行时异常

  • 运行时异常都是RuntimeException类及其子类异常,这些异常一般是由程序逻辑错误引起的,这意味着程序存在bug,如数组越界,0被除,入参不满足规范… 这类异常需要更改程序来避免,Java编译器强制要求处理这类异常,程序应该从逻辑角度尽可能避免这类异常的发生。
  • 运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常, 即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

(2)编译时异常

  • 编译时异常(Java.lang.Exception),是RuntimeException以外的异常,类型上都属于Exception类及其子类。一般是由于程序正确,但因为外在的环境条件不满足引发。
  • 例如:用户错误及I/O问题----程序试图打开一个并不存在的远程Socket端口。 这不是程序本身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。 对商用软件系统,程序开发者必须考虑并处理这个问题。
  • Java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。

(3)编译时异常和运行时异常的联系

  • Java.lang.Exception和Java.lang.Error继承自Java.lang.Throwable。
  • Java.lang.RuntimeException继承自Java.lang.Exception。

三、Java异常处理

1、抛出异常(throw、throws)
将异常抛给调用者,让调用者处理。
当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统, 异常对象中包含了异常类型和异常出现时的程序状态等异常信息。 运行时系统负责寻找处置异常的代码并执行。
(1)throw
① throw用于方法的内部,任何Java代码都可以抛出异常,throw语句抛出异常。throw后面跟异常类对象。
② 使用格式:

throw  new 异常类名(“异常信息”); 
例如:
throw new NullPointerException("空指向异常");

throw总是出现在函数体中,用来抛出一个Throwable类型的异常,程序会在throw语句后立即终止,它后面的语句执行不到。
③ throwDemo1

public class throwDemo1{
	public static void main(String[] args) {
		int[] arr = null; //注意这里的定义,现在是null
		int j = getArr(arr, 3);
		System.out.println(j);
	}
	//返回int[]数组,下标值又用户传入参数的元素+1
	public static int getArr(int[] arr,int index) {
		if( arr == null ) {
			throw new NullPointerException("空指向异常");
		}else if ( arr.length < index ) {
			throw new ArrayIndexOutOfBoundsException("下标越界异常");
		}
		int i = arr[index];
		return i + 1;
	}
}

int[] arr = null;语句中,数组定义为null,在getAr()方法中,if判断结构检测到数组arr为null,执行相应的代码块:throw new NullPointerException(“空指向异常”); 抛出异常NullPointerException,并在输出结果中显示“空指向异常”,所以输出结果为:

Exception in thread "main" java.lang.NullPointerException: 空指向异常
	at com.woniuxy.onclass0401.Test1.getArr(Test1.java:11)
	at com.woniuxy.onclass0401.Test1.main(Test1.java:5)

④ throwDemo2

public class throwDemo2{
	    public static void main(String[] args) {
		int[] arr = {}; //注意这里的定义
		int j = getArr(arr, 3);
		System.out.println(j);
	}
	//返回int[]数组,下标值又用户传入参数的元素+1
	public static int getArr(int[] arr,int index) {
		if( arr == null ) {
			throw new NullPointerException("空指向异常");
		}else if ( arr.length < index ) {
			throw new ArrayIndexOutOfBoundsException("下标越界异常");
		}
		int i = arr[index];
		return i + 1;
	}
}

代码同Demo1一样,只是在语句int[] arr = {};中,数组定义为{},所以在getAr()方法中,if判断结构检测到数组arr为{},执行相应的代码块:throw new ArrayIndexOutOfBoundsException(“下标越界异常”); 抛出异常ArrayIndexOutOfBoundsException,并在输出结果中显示“下标越界异常”,所以输出结果为:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 下标越界异常
	at com.woniuxy.onclass0401.Test1.getArr(Test1.java:13)
	at com.woniuxy.onclass0401.Test1.main(Test1.java:5)

这里需要注意的是:在语句throw抛出异常的语句中,如throw new NullPointerException(“空指向异常”);和throw new ArrayIndexOutOfBoundsException(“下标越界异常”); new后面接的异常类型可以自己随意设置,这个可以是API里面有的,也可以是自定义的,括号里面的内容也是自己定义的。

(2)throws
① 如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常。 方法名后的throws Exception1,Exception2,…,ExceptionN 为声明要抛出的异常列表,多个异常使用逗号分割。
② 使用格式:

方法名()  throws 异常类名;
例如:
public static void main(String[] args) throws Exception {

}

③ throwsDemo

public class throwsDemo{
	//计算圆的面积,如果半径是0或者负数,抛出异常
	public static void main(String[] args) throws Exception {
		System.out.println("输入x的值:");
		Scanner sc = new Scanner(System.in);
		double x = sc.nextDouble();
		double s1 = area(x);
		System.out.println(s1);
	}
	public static double area(double x) throws Exception {
		if (x == 0) {
			throw new Exception("x的值不能为0");
		} else if ( x < 0 ) {
			throw new Exception("x的值不能为0负数");
		}
		double s = 3.14 * x * x;
		return s;
	}
}

throws语句用在方法定义时声明该方法要抛出的异常类型,如果抛出的是Exception异常类型,则该方法被声明为抛出所有的异常。

当方法抛出异常列表的异常时,方法将不对这些类型及其子类类型的异常作处理,而抛向调用该方法的方法,由他去处理。
④ throws后面跟异常类。规则如下:

  • 如果是不可查异常(unchecked exception),即Error、RuntimeException或它们的子类, 那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。
  • 必须声明方法可抛出的任何可查异常(checked exception)。 即如果一个方法可能出现受可查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出,否则会导致编译错误。
  • 仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出。
  • 调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。 声明的任何异常必须是被覆盖方法所声明异常的同类或子类。

2、捕捉异常(try…catch…finally)
1、概念
捕捉异常是在发生异常的地方直接处理,通过try-catch语句或者try-catch-finally语句实现。

2、处理格式:
(1) 单个异常时

try {
    可能会出异常的代码(受监测代码);
} catch ( 异常类 变量名) {
    捕获到异常后执行的代码;  
} finally {      
    必须执行的内容(没有可不写);
}

(2)多个异常时
如果出现多个异常时,两个异常之间存在继承关系,则父类必须放在后面

try {
    可能会出异常的代码(受监测代码);
} catch ( 异常类 变量名) {
    捕获到异常后执行的代码;  
}  catch ( 异常类 变量名) {
    捕获到异常后执行的代码;  
}...... 

finally {      
    必须执行的内容(没有可不写);
}

(3)其他格式

try {
    可能会出异常的代码(受监测代码);
} finally {      
    必须执行的内容(没有可不写);
}

(4)图解执行顺序

  • 当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句。
  • 当try捕获到异常,catch语句块里没有处理此异常的情况: 此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行。
  • 当try捕获到异常,catch语句块里有处理此异常的情况: 在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块, 并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行, 而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句。
  • finally的作用:主要用于断开连接或关流。

(5)捕获异常示例

public class Demo{
	//异常的处理:try...catch...finally
	public static void main(String[] args) throws Exception  {
		//对异常进行处理
		try {
			double avg = area( 1,2,3,4,5,6 );		//可能会出现异常的代码(受监测的代码)
			System.out.println( "平均值=" + avg );
		} catch (Exception e) {
			System.out.println(e);		//捕获到异常后执行的代码
			System.out.println( "捕获到异常" );
		} finally {	//必须执行的代码(没有可以不写)
			System.out.println( "必须执行的代码" );
		}
		System.out.println( "结束代码" );
	}
	public static double area(double...arr) throws Exception  {
		double  sum = 0;
		for( double a : arr ) {
			if ( a < 0 ) {
				throw new Exception("x的值不能为0负数");
			} 
			sum = sum + a;
		}
		return  sum / arr.length;
	}
}

四、自定义异常

(1)用户自定义异常类,只需继承Exception类即可。

(2)自定义步骤:

  • 创建自定义异常类。
  • 在方法中通过throw关键字抛出异常对象。
  • 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
  • 在出现异常方法的调用者中捕获并处理异常。

(3)自定义异常示例
① 首先创建一个Student类,其拥有属性姓名,年龄,分数。在Student的有参构造函数里面判断传入的年龄和分数,根据条件抛出相应的异常,我们知道人的年龄不可能小于0,一般也不可能大于200,分数也不能小于0,所以在这里自定义两个异常NotAgeException和IgnoralScoreException。

//创建一个Student类,拥有属性姓名、年龄、分数等。
public class Student {
	String name;
	int age;
	double score;

	//无参构造函数
	public Student() {
		super();
	}
	//有参构造函数
	public Student(String name, int age, double score) throws NotAgeException, IgnoralScoreException {
    //判断年龄,抛出相应异常
		if ( age <= 0 || age > 200 ) {
			throw new NotAgeException("年龄不合法");
		}else if ( score < 0 ) {
			throw new IgnoralScoreException("分数错误");
		}
		this.name = name;
		this.age = age;
		this.score = score;
	}
}

② 因为NotAgeException和IgnoralScoreException是我们自己定义的异常,在API中是没有的,所以需要新建这两个异常类去继承Exception。

//NotAgeException 类
public class NotAgeException extends  Exception{
	public NotAgeException() {}
	public NotAgeException(String message) {
		super(message);
	}
}

//IgnoralScoreException 类
public class IgnoralScoreException extends Exception{
	public IgnoralScoreException( ) { }
	public IgnoralScoreException(String s) {
		super(s);
	}
}

③ 最后,创建main函数,通过传参和调用实现功能。挡在主函数中传入的年龄和分数满足Student类中的判断条件时,就会抛出相应的异常。

//main 函数类
public class Demo{
	public static void main(String[] args) throws NotAgeException, IgnoralScoreException {
		Student s = new Student("张三",18,30);
		System.out.println("name = " + s.name + "  age = " + s.age + "  score = " + s.score );
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
模块7 异常处理 《Java程序设计案例教程》教学课件07异常处理全文共31页,当前为第1页。 学习目标 01 了解异常产生的原因。 02 了解Java异常体系结构,以及受检异常和未受检异常的区别。 03 掌握使用try-catch-finally语句块捕捉并处理异常。 05 掌握设计和使用用户自定义异常。 04 掌握使用throw语句抛出异常,以及使用throws语句声明方法异常。 《Java程序设计案例教程》教学课件07异常处理全文共31页,当前为第2页。 技能目标 能够在MyEclipse IDE中使用try-catch-finally语句块编写程序捕捉并处理异常。 01 能够在MyEclipse IDE中使用throw语句编写程序抛出异常。 02 能够在MyEclipse IDE中使用throws语句编写程序声明方法异常。 03 能够在MyEclipse IDE中编写程序定义自己的异常。 04 《Java程序设计案例教程》教学课件07异常处理全文共31页,当前为第3页。 7.1 回顾与思考 Java语言的健壮性确保了在编程过程中出现的错误可以得到及时、有效的控制。但是,并不是所有错误都能在编译阶段被发现。有些错误只有在运行时才会发生。在编译或运行时发生的错误都被称为异常。在编译或运行时跟踪这些异常被称为异常处理。Java异常处理机制负责异常处理和错误恢复。 如果把【例6-1】中的代码"for(int i = 1;i < myArray.length;i++)"改成"for(int i = 1;i <= myArray.length;i++)",这时,编译可以通过。运行后在控制台出现如下提示。 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8 at ch6.example.Example6_1.main(Example6_1.java:16) 《Java程序设计案例教程》教学课件07异常处理全文共31页,当前为第4页。 7.2 异常异常类 7.2.1 Java异常体系结构 Java中的异常有很多类型,包括在Java API中已经被定义的异常(也称系统异常)和用户自定义异常。所有的异常类都直接或间接继承了Throwable类。Throwable类是Object类的直接子类。 Throwable类有两个直接子类: Error类 Exception类 《Java程序设计案例教程》教学课件07异常处理全文共31页,当前为第5页。 7.2 异常异常类 7.2.2 受检异常 Exception类及其子类中除了RuntimeException类及其子类以外的异常被称为受检异常checked exception)。受检异常在编译阶段能被Java编译器检测到,不可回避,用户必须对受检异常进行处理。 《Java程序设计案例教程》教学课件07异常处理全文共31页,当前为第6页。 7.2 异常异常类 7.2.2 受检异常 【例7-1】受检异常示例。 文件名为Example7_1.java,其代码如下。 《Java程序设计案例教程》教学课件07异常处理全文共31页,当前为第7页。 7.2 异常异常类 7.2.2 受检异常 【例7-1】受检异常示例。 在"Class.forName("com.mysql.jdbc.Driver");"这条语句下出现了波浪线,光标停留在该语句上会出现浮窗提示:未处理异常类型ClassNotFoundException,如图7-1所示。 图7-1 受检异常未处理的浮窗提示 《Java程序设计案例教程》教学课件07异常处理全文共31页,当前为第8页。 7.2 异常异常类 7.2.3 未受检异常 属于RuntimeException类及其子类的异常和Error类及其子类的异常被称为未受检异常(unchecked exception)。未受检异常在编译阶段不能被Java编译器检测到。不强迫用户利用异常处理机制对未受检异常进行处理。未受检异常的发生是因为程序有逻辑错误。未受检异常首先且主要通过用户在程序编写过程中避免。如果滥用异常处理机制处理(预防)未受检异常,程序会变得臃肿,影响可读性。 《Java程序设计案例教程》教学课件07异常处理全文共31页,当前为第9页。 7.3 异常处理结构 7.3.1 捕捉异常 1. try-catch语句块 可以使用trycatch语句块对程序中可能出现的异常进行捕捉并处理。把可能产生异常的代码放置在try语句块内,catch语句块紧接着try语句块之后。catch语句块中包含了处理异常及输出异常产生原因的语句。一个catch语句块仅对应一个try语句块,但是一个try语句块可以对应多
基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 上架时间:2010-3-30 出版日期:2010 年3月 开本:16开 其他详细信息查看:http://www.china-pub.com/196571 编辑推荐 Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,手把手教会读者学习Java 配16小时多媒体教学视频,高效、直观 一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己的第一个Java程序跑起来 2 教学视频:19分钟 1.1 想要用Java改变这个世界吗? 2 1.1.1 Java有什么优势? 2 1.1.2 Java在哪儿? 3 1.2 准备好开始Java之旅 3 1.2.1 下载JDK 4 1.2.2 安装JDK 5 1.2.3 配置环境变量 6 1.2.4 测试环境是否安装成功 8 1.2.5 如果失败了怎么办? 9 1.3 让自己的第一个程序运行起来 10 1.3.1 编写自己的Hello World源程序 10 1.3.2 编译自己的HelloWorld程序 11 1.3.3 让代码运行起来 13 1.4 初探Hello World 14 1.4.1 类(Class):Java世界中一类物体 14 1.4.2 方法(Method):物体的功能 15 1.4.3 main()方法:所有Java程序执行的起点 15 .1.5 名词解释 16 1.5.1 JDK和Java平台 16 1.5.2 Java编译器(Java Compiler) 17 1.5.3 Java类库(Java Class Libraries) 17 1.5.4 Java虚拟机(Java Virtual Machine) 17 1.5.5 HelloWorld的整个流程 17 1.6 小结:我们学会了编译和运行一个Java程序! 18 1.7 习题 19 第2章 搭建自己的集成开发环境 20 教学视频:31分钟 2.1 安装集成开发环境 20 2.1.1 集成开发环境有哪些 20 2.1.2 安装Eclipse 21 2.2 Eclipse界面介绍 23 2.2.1 启动Eclipse 23 2.2.2 Eclipse的Perspective 24 2.2.3 Eclipse的菜单 25 2.2.4 Eclipse的工具条 25 2.2.5 Eclipse辅助视图区 25 2.2.6 Eclipse中Package Explorer 26 2.2.7 Eclipse中的源代码编辑器 26 2.2.8 Eclipse的设置窗口 26 2.2.9 Eclipse中的其他视图 27 2.3 如何使用Eclipse 28 2.3.1 在Eclipse中创建自己的第一个项目 28 2.3.2 在Eclipse中编写HelloWorld程序 29 2.3.3 通过Eclipse运行Hello World 31 2.4 小结:Eclipse——功能很强大 32 2.5 习题 32 第3章 Java中的基本数据类型和运算符 33 教学视频:1小时5分钟 3.1 Java中的基本数据类型 33 3.1.1 基本数据类型——编程语言中的数据原子 33 3.1.2 Java中的基本上数据类型介绍 34 3.1.3 基本数据类型值域 34 3.2 Java运算符 36 3.2.1 变量的概念 36 3.2.2 插曲:Java中的语句 37 3.2.3 创建一个变量和变量名的规范 37 3.2.4 Java中的基本运算符和表达式 39 3.2.5 Java中的布尔运算符 43 3.3 基本数据类型运算的难点 47 3.3.1 强制类型转换——小数哪里去了 48 3.3.2 类型的转换在运算中悄悄进行 50 3.3.3 强制类型转换最优先 52 3.3.4 等号其实不简单 52 3.3.5 小心使用浮点数进行比较 53 3.3.6 boolean和char 55 3.3.7 不要使用还没有创建出来的变量 57 3.3.8 String——char串起的项链 58 3.3.9 转义符——看不见写得出 61 3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 if语句的嵌套 71 4.2.3 if-else语句 73 4.2.4 if-else语句嵌套 75 4.3 使用while进行循环 76 4.3.1 使用while语句 76 4.3.2 使用do-while语句 79 4.4 使用for进行循环 80 4.4.1 自增和自减操作 80 4.4.2 for语句 82 4.4.3 for语句省略形式 84 4.5 语句中不能不说的事 84 4.5.1 小心复杂语句中创建的变量 85 4.5.2 别让循环次数给弄懵了 86 4.5.3 循环的嵌套 87 4.6 continue关键字与break关键字 88 4.6.1 continue关键字 88 4.6.2 break关键字 89 4.7 使用switch进行跳转 90 4.8 大例子 94 4.8.1 从控制台读取数据 94 4.8.2 结账程序中的循环 96 4.9 小结:Java不是一个直肠子 98 4.10 习题 99 第5章 数组 100 教学视频:35分钟 5.1 什么是数组 100 5.1.1 假设:如果需要逐个定义变量 100 5.1.2 数组初探 101 5.1.3 数组——物以类聚 104 5.1.4 数组元素的值内有乾坤 105 5.1.5 创建数组的简洁语法 106 5.2 数组的“名”与“实” 107 5.2.1 “名”与“实”分离的数组 107 5.2.2 一“实”多“名”的数组 109 5.2.3 一“实”多“名”带来的困惑 111 5.3 多维数组 114 5.3.1 什么是多维数组 114 5.3.2 多维数组的实质 115 5.4 数组大练兵 123 5.4.1 轻松查询全班成绩 123 5.4.2 轻松查询全校成绩不在话下 124 5.4.3 杨辉三角 125 5.5 小结:方便快速的数组 129 5.6 习题 129 第2篇 Java语言高级语法 第6章 Java的类(Class)和对象(Object) 132 教学视频:59分钟 6.1 驾驶汽车向类(Class)的世界进发 132 6.1.1 汽车带来的问题 132 6.1.1 类的组成 134 6.1.3 使用自定义的Car类 136 6.1.4 类和对象 139 6.1.5 源文件的存放 141 6.1.5 理解引用 143 6.1.7 null关键字 145 6.2 巧妙使用类中的属性 147 6.2.1 在类中给每个变量一个初始值 147 6.2.2 定义自己的引用 147 6.2.3 使用点操作符的技巧 148 6.2.4 类的数组 149 6.3 小结:Java其实是个类和对象的世界 152 6.4 习题 153 第7章 Java中的方法——给汽车丰富多彩的功能 154 教学视频:2小时55分钟 7.1 方法:让汽车动开动 154 7.1.1 引出问题:开动汽车 154 7.1.2 那么,方法到底是什么呢? 155 7.1.3 方法调用过程初探 156 7.2 Java普通方法的组成部分 157 7.2.1 访问控制符:public 158 7.2.2 返回值和关键字void 158 7.2.3 方法名(Method Name) 159 7.2.4 参数列表(Parameter List) 159 7.2.5 方法体(Method Body) 160 7.2.6 方法串串烧 160 7.3 方法的参数:让汽车加速 161 7.3.1 方法的参数:让汽车可以加速 161 7.3.2 带参数的方法有何不同? 162 7.3.3 让方法有多个参数 163 7.4 返回值:汽车超速了吗? 164 7.4.1 写一个有返回值的方法 164 7.4.2 调用有返回值的方法 165 7.4.3 发生了什么?如何使用方法的返回值? 166 7.4.4 使用return结束方法 166 7.5 方法重载(overload):给汽车加速添个限制 168 7.5.1 什么是方法的签名 168 7.5.2 什么是重载?为什么要重载? 168 7.5.3 给汽车加个重载的方法 169 7.5.4 测试一下 169 7.5.5 重载容易引发误解的两个地方——返回类型和形参名 170 7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 7.6.3 发生了什么 174 7.7 加餐:局部变量和实例变量 175 7.7.1 什么是局部变量(Local Variable) 175 7.7.2 什么是实例变量(Instance Variable) 177 7.8 this关键字:指向对象自己的引用 177 7.8.1 发现问题:当实例变量和局部变量重名 177 7.8.2 经常深藏不露的this关键字 178 7.8.3 在方法中调用方法 179 7.9 构造方法(Constructor) 181 7.9.1 构造(Constructor)方法初探 181 7.9.2 如何使用构造方法 182 7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解Java方法 191 7.12 习题 192 第8章 Java中的包(Package)命名习惯和注释 193 教学视频:43分钟 8.1 Java中的包(Package) 193 8.1.1 Java中的包 193 8.1.2 在Eclipse中使用包 194 8.1.3 天上掉下个package 197 8.1.4 包带来了什么? 197 8.2 import语句:化繁为简 200 8.2.1 import语句 200 8.2.2 一网打尽包中所有类 201 8.2.3 import语句带来的小问题 202 8.2.4 默认引入的包 204 8.3 命名习惯大回顾 204 8.4 Java中的注释 205 8.4.1 使用双斜杠的单行注释 205 8.4.2 多行注释 206 8.4.3 Javadoc注释 206 8.5 小结:包让Java的类更清晰优雅 208 8.6 习题 209 第9章 再看数组、字符串和main()方法 210 教学视频:29分钟 9.1 数组也是类 210 9.1.1 得到数组的长度 210 9.1.2 加餐:不可改变的final变量 211 9.1.3 多维数组的长度 212 9.1.4 一维数组的clone()方法 212 9.1.5 当数组类型不再是基本数据类型 214 9.1.6 多维数组的clone()方法 217 9.2 老朋友String类 220 9.2.1 遍历String中的字符 220 9.2.2 获取字符串中的一部分 222 9.2.3 判断两个字符串是否相等 223 9.2.4 判断字符串的开头和结尾 225 9.2.5 分割字符串 225 9.2.6 在字符串中查找子字符串或字符 226 9.2.7 替换字符串中的内容 226 9.2.8 String对象——磐石刻字 227 9.3 String类的最佳拍档——StringBuffer类 227 9.3.1 StringBuffer:专业操纵字符 228 9.3.2 String和StringBuffer一个都不能少 229 9.4 最熟悉的陌生人:main()方法 229 9.4.1 main()方法的参数 229 9.4.2 static关键字 232 9.4.3 当方法遇到static关键字 233 9.5 小结:学会使用类中的方法 235 9.6 习题 236 第10章 继承和多态 237 教学视频:1小时55分钟 10.1 继承——最优的解决方案 237 10.1.1 饭前水果:实例变量的访问控制符 237 10.1.2 一切还是从汽车开始 238 10.1.3 一类车,一个类 241 10.1.4 分开也有麻烦 244 10.1.5 使用继承——问题迎刃而解 245 10.1.6 使用Bus类 248 10.1.7 Java中的单继承 248 10.1.8 Java中的类图 249 10.1.9 万类之祖——Object类 250 10.2 子类对象?父类对象? 251 10.2.1 父随子行 251 10.2.2 当构造方法遇到继承 254 10.2.3 记得给类一个无参数的构造方法 255 10.2.4 调用父类中的构造方法 256 10.2.5 对象也会“变脸” 258 10.2.6 遵守语法,正确“变脸” 262 10.3 覆盖——与继承如影随形 264 10.3.1 当方法不再通用 264 10.3.2 覆盖——让众口不再难调 265 10.3.3 覆盖——到底调用了哪个方法 270 10.3.4 覆盖的语法不简单 272 10.3.5 更复杂的使用覆盖的情况 274 10.3.6 覆盖——不得不打开的潘多拉魔盒 276 10.3.7 使用super调用父类中的方法和属性 278 10.4 多态(Polymorphism)以及其他 279 10.4.1 多态——运行方知结果 280 10.4.2 重载也不简单 280 10.4.3 使用多态构建车队 283 10.5 在多态的环境中拨开迷雾 284 10.5.1 神秘的Class类 284 10.5.2 覆盖不再神秘 285 10.5.3 instanceof运算符——让对象告诉你它的类是谁 286 10.6 小结:继承和多态让世界丰富多彩 287 10.7 习题 290 第11章 修饰符(Qualifier) 291 教学视频:26分钟 11.1 插曲:类的组成部分的名字 291 11.2 类中的修饰符 292 11.2.1 无修饰符类 292 11.2.2 类的可见性 293 11.2.3 final——让类不可被继承 295 11.2.4 理解final关键字 296 11.2.5 总结:类的修饰符 297 11.3 方法的修饰符 297 11.3.1 方法的访问控制符 298 11.3.2 public:没有限制的修饰符 299 11.3.3 protected:仅对子类和同包的类可见 300 11.3.4 默认控制符:仅在本包中可见 301 11.3.5 private:仅对本类可见 303 11.3.6 理解4个访问控制符 304 11.3.7 访问控制符可见性汇总 306 11.3.8 访问控制符带来的覆盖问题 306 11.3.9 final:不允许方法被覆盖 310 11.3.10 重温静态方法 311 11.3.11 静态方法——类范围里的概念 312 11.3.12 静态方法何以为“静态” 314 11.4 变量的修饰符 316 11.4.1 变量方法皆成员 317 11.4.2 变量的访问控制符 317 11.4.3 使用private修饰类的成员变量 318 11.4.4 使用private,然后呢? 320 11.4.5 变量的覆盖 322 11.4.6 使用final修饰成员变量 325 11.4.7 静态成员变量 326 11.4.8 局部变量的修饰符 326 11.4.9 当final遇到引用类型成员变量 327 11.5 小结:修饰符作用大 328 11.6 习题 330 第12章 接口 331 教学视频:29分钟 12.1 自行车带来的问题 331 12.1.1 记录马路上的车辆 331 12.1.2 引发问题的自行车 335 12.1.3 仔细分析recordTransport()方法 338 12.2 初用接口 339 12.2.1 准备好需要用到的类 339 12.2.2 认识接口的代码组成 340 12.2.3 什么是接口 341 12.2.4 使用接口仅需一步——实现接口 342 12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 重温上节中的程序 349 12.3.2 面向接口编程 351 12.3.3 话说“抽象” 353 12.3.4 接口大瘦身 355 12.3.5 实现多个接口 355 12.3.6 接口中的变量 357 12.3.7 接口的继承 358 12.3.8 匹配抽象方法中的类型 359 12.3.9 空接口 361 12.4 小结:接口的难点在于何时使用 362 12.5 习题 364 第13章 抽象类和内部类 365 教学视频:26分钟 13.1 抽象类(Abstract Class) 365 13.1.1 不知道怎么打招呼的Person类 365 13.1.2 当类中有了抽象方法 367 13.1.3 抽象类语法详解 368 13.1.4 理解抽象类的作用 369 13.2 内部类的分类(Inner Class) 370 13.2.1 成员内部类 370 13.2.2 局部内部类 372 13.3 成员内部类 374 13.3.1 使用成员内部类 374 13.3.2 成员内部类的修饰符 375 13.3.3 在类外部使用内部类 376 13.3.4 非静态内部类的特性 378 13.3.5 外部类访问成员内部类中的属性 382 13.3.6 静态成员内部类 383 13.4 局部内部类 384 13.4.1 局部内部类之“局部” 385 13.4.2 局部内部类之“内部类” 386 13.4.3 使用局部内部类 388 13.5 匿名内部类(Anonymous inner classes) 389 13.5.1 准备工作 389 13.5.2 匿名内部类的语法 389 13.5.3 通过接口使用匿名类 390 13.5.4 通过抽象类使用匿名类 391 13.6 类,这样一路走来 391 13.7 小结:丰富多彩的类 395 13.8 习题 397 第14章 Java异常处理机制 398 教学视频:36分钟 14.1 认识异常 398 14.1.1 异常什么时候发生 398 14.1.2 异常是什么 401 14.1.3 Java异常机制的流程 401 14.2 抛出异常 403 14.2.1 异常类的父类——Throwable 403 14.2.2 在代码中使用throw抛出一个异常 404 14.2.3 在方法声明中使用throws 407 14.2.4 构造自定义异常类 409 14.2.5 使用自定义异常类 410 14.3 异常的传递 411 14.3.1 抛出最确切的异常类型 411 14.3.2 Java异常的传递 412 14.3.3 图说Java异常的传递 414 14.4 异常的处理 418 14.4.1 把异常捉住 418 14.4.2 图说异常处理流程 421 14.4.3 多类异常,一并处理 424 14.4.4 try-catch-finally语句 426 14.4.5 try-finally语句 431 14.4.6 好好利用catch语句 432 14.5 异常的类型 433 14.5.1 3个类的继承关系 433 14.5.2 必须处理的Exception类 434 14.5.3 灵活掌握的RuntimeException类 434 14.5.4 不用处理的Error类 435 14.6 小结:终止错误的蔓延 435 14.7 习题 437 第15章 多线程编程 438 教学视频:1小时14分钟 15.1 线程——执行代码的机器 438 15.1.1 线程——执行代码的基本单位 438 15.1.2 演奏会模型 440 15.2 Java中的线程编程 443 15.2.1 线程类Thread 443 15.2.2 覆盖Thread类的run()方法 444 15.2.3 使用Runnable接口 446 15.2.4 两个线程 448 15.3 深入学习Thread类 449 15.3.1 线程的名字 449 15.3.2 得到当前的线程 451 15.3.3 让线程“沉睡” 453 15.4 多个线程的故事 457 15.4.1 一个有多个线程的程序 457 15.4.2 复印社模型 459 15.4.3 一个简单的复印社例程 461 15.5 多个线程的同步 463 15.5.1 线程同步之synchronized关键字 463 15.5.2 深入学习synchronized关键字 468 15.5.3 静态同步方法 469 15.5.4 非静态的同步方法 472 15.5.5 银行的麻烦——账户乱套了 474 15.5.6 多角度理解同步方法 481 15.5.7 闲话同步方法的使用 484 15.5.8 同步代码块 485 15.5.9 锁(Lock) 486 15.5.10 线程同步之wait()和notify()方法 488 15.5.11 wait和notify的顺序 491 15.6 小结:线程——代码执行器 494 15.7 习题 495 第3篇 Java语言编程进阶 第16章 如何学习本篇 498 教学视频:15分钟 16.1 多想多写多练 498 16.2 术业有专攻 498 16.3 拆分问题,逐个击破 500 16.4 阅读Javadoc 500 16.5 小结:大练兵马上开始 506 16.6 习题 507 第17章 编程常用知识 508 教学视频:18分钟 17.1 再谈对象的比较 508 17.1.1 hashcode()方法 508 17.1.2 equals()方法 509 17.1.3 对象的比较equals()方法 509 17.2 Java中的集合类框架 510 17.2.1 集合类框架中的接口 510 17.2.2 List接口 511 17.2.3 使用ArrayList 512 17.2.4 Set接口 516 17.2.5 使用HashSet类 517 17.2.6 List与Set 518 17.3 泛型简介 518 17.3.1 没有泛型时的程序 519 17.3.2 使用泛型——避免强制类型转 520 17.4 Map接口 522 17.4.1 认识Map 522 17.4.2 使用HashMap 523 17.5 字符集和编码 524 17.5.1 字符集 524 17.5.2 编码 525 17.5.3 关于字符集的小程序 526 17.6 小结:编程需要打好基础 529 17.7 习题 530 第18章 Java文件编程和Java文件I/O 531 教学视频:9分钟 18.1 Java中的文件编程 531 18.1.1 File类 531 18.1.2 创建和删除文件 532 18.1.3 列出文件和文件夹 533 18.1.4 重命名文件 535 18.2 Java的I/O编程 536 18.2.1 理解Java中的Stream 536 18.2.2 向文件中写入数据 538 18.2.3 从文件中读取数据 539 18.2.4 从控制台读取数据 541 18.2.5 使用输出流写入数据 543 18.2.6 使用输入流读取数据 545 18.3 小结:Java中的文件类和输入输出机制 546 18.4 习题 547 第19章 Java Socket编程 548 教学视频:8分钟 19.1 IP地址和端口号 548 19.1.1 IP地址——计算机的标识 548 19.1.2 端口号——通信的窗口 549 19.1.3 网络,IP地址和端口号 551 19.2 Java TCP编程 551 19.2.1 数据传输协议 552 19.2.2 TCP的数据传输模式 552 19.2.3 第一个TCP小程序 553 19.3 Java UDP编程 557 19.3.1 UDP的数据传输模式 557 19.3.2 使用UDP协议收发数据 558 19.3.3 TCP和UDP的区别 560 19.4 小结:让程序伸向整个网络 561 19.5 习题 561 第20章 Java Swing编程 562 教学视频:14分钟 20.1 Java Swing编程简介 562 20.1.1 图形用户界面编程简介 562 20.1.2 组件 563 20.1.3 布局管理器(Layout Manager) 563 20.1.4 事件处理(Event Handling) 564 20.2 Swing基本组件 565 20.2.1 窗口(JFrame) 565 20.2.2 Swing的线程 567 20.2.3 Swing组件的鼻祖——JComponent 567 20.2.4 Swing面板类 568 20.2.5 Swing中的标签 568 20.2.6 Swing中的文本框 570 20.2.7 Swing中的文本域 571 20.2.8 Swing中的组合框 572 20.2.9 Swing中的按钮 573 20.3 Swing的布局管理器 574 20.3.1 最简单的FlowLayout 574 20.3.2 东南西北中之BorderLayout 574 20.3.3 平均分割之——GridLayout 576 20.3.4 最强大的布局管理器——GridBagLayout 577 20.3.5 使用多个布局管理器 579 20.4 Swing的事件处理 581 20.4.1 事件的传递和封装 581 20.4.2 事件监听器——事件的处理者 582 20.4.3 Swing事件处理的机制 584 20.4.4 事件监听器的编写 586 20.4.5 如何学习更多的事件 588 20.5 小结:从此不再依赖控制台 588 20.6 习题 588 第21章 编程,需要的是想象力和恒心 589 教学视频:13分钟 21.1 编程的前奏 589 21.1.1 细数手中的积木 589 21.1.2 发挥想象力 590 21.1.3 确定程序的功能 591 21.2 聊天窗口程序 591 21.2.1 聊天程序设计 591 21.2.2 设计程序运行效果 593 21.2.3 UDP消息收发模块 595 21.2.4 图形用户界面模块 598 21.2.5 消息处理模块 600 21.2.6 一个更通用的聊天程序 601 21.3 小结:编程是必不可少的锻炼 602 21.4 习题 602 第22章 JDBC入门 603 教学视频:11分钟 22.1 JDBC的基本API 603 22.1.1 JDBC是什么 603 22.1.2 DriverManager——驱动管理器 605 22.1.3 Connection接口 606 22.1.4 Statement接口 606 22.1.5 PreparedStatement接口 606 22.1.6 ResultSet接口 607 22.1.7 JDBC-ODBC桥 607 22.2 一个操作数据库的简单程序 608 22.2.1 程序的执行结果 608 22.2.2 程序设计与模块划分 609 22.2.3 准备好数据源 610 22.2.4 数据库操作模块的实现 610 22.2.5 图形用户界面模块的实现 611 22.3 小结:强大的JDBC标准 613 22.4 习题 613
Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 if 条件语句 if...else 条件语句if...else if 多分支语句switch 多分支语句 循环语句 while 循环语句do...while 循环for 循环语句 跳转语句 break 语句 continue 语句面向对象 类也是-种对象对象的创建 属性和方法 构造方法 方法重载 方法的重写 初始化 类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 Throwable 常见的 ExceptionException 有关的 Java 关键字 throws 和 throw tryfinallycatch 什么是 Error 内部类 创建内部类集合 Iterable 接口顶层接口 ArrayList Vector LinkedList 类Stack HashSet TreeSet LinkedHashSet 类 PriorityQueue HashMap TreeMap 类 LinkedHashMap 类 Hashtable 类IdentityHashMap 类WeakHashMap 类 Collections 类集合实现类特征图 泛形 泛型的使用 用泛型表示类 用泛型表示接口泛型方法 泛型通配符 反射 Class 类Field 类Method 类ClassLoader 类 枚举 枚举特性 枚举和普通类-样枚举神秘之处 枚举类 I/O File 类 基础 IO 类和相关方法InputStream OutputStream Reader 类Writer 类 InputStream 及其子类 OutputStream 及其子类Reader 及其子类Writer 及其子类 注解 关于 null 的几种处理方式大小写敏感 null 是任何引用类型的初始值 null 只是-种特殊的值使用 Null-Safe 方法null 判断 关于思维导图 Java.IO Java.lang Java.math Java.net Java 基础核心总结 V2.0 IO 传统的 BIO BIO NIO 和 AIO 的区别什么是流 流的分类 节点流和处理流 Java IO 的核心类 File Java IO 流对象 字节流对象InputStream OutputStream 字符流对象Reader Writer 字节流与字符流的转换新潮的 NIO 缓冲区(Buffer)通道(Channel) 示例:文件拷贝案例 BIO 和 NIO 拷贝文件的区别操作系统的零拷贝 选择器(Selectors) 选择键(SelectionKey) 示例:简易的客户端服务器通信 集合 集合框架总览 -、Iterator Iterable ListIterator 二、Map 和 Collection 接口Map 集合体系详解 HashMap LinkedHashMap TreeMap WeakHashMap Hashtable Collection 集合体系详解 Set 接口 AbstractSet 抽象类SortedSet 接口HashSet LinkedHashSet TreeSet List 接口 AbstractList 和 AbstractSequentialList Vector Stack ArrayList LinkedList Queue接口Deque 接口 AbstractQueue 抽象类LinkedList ArrayDeque PriorityQueue 反射的思想及作用 反射的基本使用 获取类的 Class 对象构造类的实例化对象获取-个类的所有信息 获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过反射调用方法反射的应用场景 Spring 的 IOC 容器反射 + 抽象工厂模式 JDBC 加载数据库驱动类反射的优势及缺陷 增加程序的灵活性破坏类的封装性 性能损耗 代理模式 静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量
目 录 第一章 JAVA入门 10 计算机语言发展史 10 机器语言 10 汇编语言 10 高级语言 10 其他高级语言 11 JAVA发展简史 12 JAVA为什么能够流行? 13 JAVA各版本的含义 13 JAVA技术体系架构 14 JAVA的特性和优势 14 JAVA应用程序的运行机制 15 JVM(JAVA VIRTUAL MACHINE) 16 Java运行时环境JRE(Java Runtime Environment) 17 JAVA语言应用范围 18 第一个JAVA程序 18 JAVA开发环境搭建 18 一个典型的JAVA程序的编写和运行过程 19 第一个程序常见错误 20 第一个JAVA程序的总结和提升 20 常用Java开发工具 20 常用dos命令 21 本章笔试作业 21 本章上机操作 21 第二章(1) 编程的基本概念 22 注释 22 标识符 22 关键字/保留字 23 变量(variable) 24 常量(Constant) 25 命名规则(规范) 25 基本数据类型(primitive data type) 26 整型变量 26 浮点型 27 字符型(2个字节): 28 boolean类型 29 运算符(operator) 29 二元运算符 29 一元运算符 30 布尔逻辑表达符 30 位运算符 30 扩展运算符 31 字符串连接符 31 三目条件运算符 31 运算符优先级的问题 31 自动类型转换 32 基本类型转化时常见错误和问题 33 方法 33 简单的键盘输入和输出 33 本章思考作业 34 上机操作 34 第二章(2) 控制语句 35 顺序结构 35 选择结构 35 if单选择结构 35 if-else双选择结构 35 If-elseif-else多选择结构 36 switch多选择结构 37 循环结构 39 While和dowhile的区别 41 For循环 42 break语句和continue语句 47 语句块 48 递归结构 49 本章作业 50 本章上机操作 51 第三章 JAVA面向对象程序开发 52 编程语言发展史 52 类和对象是如何产生发展的?如何进化的? 52 面向对象思想初步(OOP初步Object Oriented Programming) 53 面向对象编程的语言的三大特征简介 56 对象和类的概念 56 类和对象初步 57 测试类的定义方式 57 简单的学生类编写示例 58 内存分析 59 属性(field,或者叫成员变量) 59 引用类型 60 类的方法 60 对象的创建和使用 60 构造器(或者叫做构造方法,constructor) 60 垃圾回收机制(Garbage Collection) 63 方法的重载(overload),构造方法的重载 63 this关键字 65 static 关键字 66 静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? 70 继承使用要点 71 Object类 72 toString方法 72 equals方法 73 super关键字 74 方法的重写(override) 74 隐藏/封装(encapsulation) 75 为什么需要封装?封装的作用和含义? 75 使用访问控制符,实现封装 76 封装的使用细节 76 多态(polymorphism) 76 为什么需要多态? 76 如何实现多态? 77 方法绑定(method binding) 77 静态绑定 77 动态绑定 77 多态的使用要点 78 对象的转型(casting) 79 final 81 抽象类 82 抽象类的使用要点 83 接口 83 为什么需要接口? 84 如何定义接口? 84 接口的本质探讨 84 接口使用要点 85 接口的多继承 86 面向接口编程 87 OOP更多应用 87 组合 87 内部类(innerclasses) 88 字符串(java.lang.String类)的使用 90 字符串相等的判断 92 思考作业 93 上机作业 94 第四章 异常机制 95 导引问题 95 异常Exception)的概念 96 异常分类 96 Error 97 Error和Exception的区别 97 Exception 97 异常的处理办法之一,捕获异常 99 try块 99 catch 99 finally 100 try, catch,finally ,return 执行顺序 100 异常的处理办法之二,声明异常
Java高级程序设计 第2章 异常处理 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第1页。 第2章 异常处理 2.1 什么是异常 2.2 处理异常 2.3 自定义异常throw关键字 2.4 throws关键字 2.5 Java的内置异常 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第2页。 本章目标 理解异常及其作用 使用try-catch-finally语句捕获和处理异常 使用throwthrows关键字 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第3页。 本章任务 任务1 识别异常 任务2 处理异常 任务3 自定义百分制分数异常 任务4 使用throws关键字 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第4页。 2.1 什么是异常 任务1 识别异常 编程实现整数除法运算:接收用户输入的2个整数,除法运算后输出结果。根据用户的不同输入,可能产生如图所示的不同结果。 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第5页。 知识点:异常的概念、异常处理机制 一、异常的概念 程序开发中一般会出现两种问题: 第一种,在编译期间被检测出来的错误,我们称之为语法错误,比如关键字拼写错误、语句丢失分号、变量名未定义等。如果程序中存在这类错误,将不能编译通过,不能生成字节码。 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第6页。 第二种,没有语法错误编译成功了,但在程序运行期间出现错误,我们称之为运行错误,比如被访问对象没有正常初始化、访问数组元素时下标值超出范围等等。这种运行错误如果没有得到及时的处理,可能会造成程序提前中断、数据遗失乃至系统崩溃等问题。这种运行错误也就是我们所说的"异常"。 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第7页。 二、异常处理机制 为了解决这种需要由程序员承担程序出错情况判断的不正规处理模式所带来的困难和阻碍,Java引入了异常处理机制,通过代码运行到出现错误的时候由系统抛出一个运行异常Java程序可以很容易地捕获并处理发生的异常情况。 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第8页。 Java异常类层次结构 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第9页。 2.2 处理异常 任务2 处理异常 完善任务1中的IntDivide程序,对除法运算中除数为0的异常进行处理,即使用户输入0值不能进行除法运算时也不会再粗鲁地直接中断程序执行了,运行效果如图所示。 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第10页。 知识点:try-catch-finally语句处理异常 try{ //需要监视异常的代码块,该区域如果发生异常就匹配catch来决定程序如何处理 } catch(异常类型1 异常的变量名1){ //处理异常语句组1 } catch(异常类型2 异常的变量名2){ //处理异常语句组2 } …… finally{ //最终执行的语句组 } Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第11页。 2.3 自定义异常throw关键字 任务3 自定义百分制分数异常 编程实现:根据用户输入的分数判定成绩等级并输出。分数规定为百分制,一旦用户输入的分数不符合百分制分数要求,则请用户重新输入,直至输入分数正确,判定等级并输出为止。运行效果如图所示。 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第12页。 知识点:自定义异常throw关键字 一、自定义异常 <class> <自定义异常类名> <extends> <Exception>{ // 变量、构造方法、成员方法 } 二、throw关键字 <throw> <异常对象>; Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第13页。 2.4 throws关键字 任务4 使用throws关键字 编程实现与任务3相同的根据分数判定等级并输出的功能。 代码要求:将根据分数判等级的功能定义为方法,且方法内部不处理分数异常,而是将异常抛出给其调用者来进行处理。 Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第14页。 知识点:throws关键字为方法声明异常 方法声明 <throws> <异常类1>,<异常类2>,…<异常类n> { //方法体,抛出异常 } Java高级程序设计(第二版)--第2章-异常处理全文共19页,当前为第15页。 2.5 Java的内置异常 在核心语言包java.lang中
Java语言提供了异常机制来应对程序运行时可能出现的错误情况。在Java中,异常是一个对象,它包含了异常信息和程序执行的上下文环境。Java语言中的异常处理机制主要涉及到以下关键字: 1. throws:throws关键字用于声明一个方法可能会抛出哪些异常,它放在方法签名的末尾,多个异常可以用逗号隔开。例如:public void doSomething() throws IOException, InterruptedException。 2. throwthrow关键字用于在程序中抛出一个异常对象。例如:throw new RuntimeException("Something went wrong!"); 3. trytry块用于包装可能会抛出异常的代码块。如果try块中的代码抛出异常,则程序会跳转到与之匹配的catch块中。例如: ``` try { // 可能会抛出异常的代码 } catch (Exception e) { // 异常处理代码 } ``` 4. catchcatch块用于捕获try块中抛出的异常,并对其进行处理。catch块包含异常类型和处理代码。一个try块可以有多个catch块,用于处理不同类型的异常。例如: ``` try { // 可能会抛出异常的代码 } catch (IOException e) { // 处理IOException类型的异常 } catch (InterruptedException e) { // 处理InterruptedException类型的异常 } catch (Exception e) { // 处理其他类型的异常 } ``` 5. finallyfinally块包含在try-catch块的末尾,无论是否抛出异常都会执行。finally块通常用于释放资源或进行清理操作。例如: ``` try { // 可能会抛出异常的代码 } catch (Exception e) { // 异常处理代码 } finally { // 释放资源或进行清理操作 } ``` 需要注意的是,try-catch-finally块可以嵌套使用,例如: ``` try { try { // 可能会抛出异常的代码 } catch (IOException e) { // 处理IOException类型的异常 } finally { // 释放资源或进行清理操作 } } catch (Exception e) { // 处理其他类型的异常 } finally { // 释放资源或进行清理操作 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TwoYellowGuns

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值