Java读书笔记一(异常处理)

1.介绍

在开发过程中,都会遇到程序运行时的异常,例如逻辑错误、硬件故障等,本篇博客将会详细的介绍一下Java中的异常处理机制。

2.Try和Catch捕获异常

我们在处理异常过程中经常用到的就是Try和Catch语句了。try语句块能够指出可能出现的异常,随后通过一个或者多个Catch语句块来捕获。

2.1.简单的Try和Catch语法

package com.RuntimeException;

public class Sample11_1
{
	public static void main(String[] args)
	{
		//被监视的代码块
		try
		{
			//创建数组对象
			int[] a=new int[4];
			System.out.println("整型数组创建完毕!!");
			//访问数组元素
			a[3]=9;
			System.out.println("整型数组中第四个元素的数值为"+a[3]+"!!!");
		}
		//处理下标越界异常
		catch(ArrayIndexOutOfBoundsException aiobe)
		{
			//打印提示信息
			System.out.println("这里出现的错误类型是:数组下标越界!!");
		}
		//处理空引用异常
		catch(NullPointerException npe)
		{
			//打印提示信息
			System.out.println("这里出现的错误类型是:空引用!!");
		}
		System.out.println("主程序正常结束!!!");
	}
}

2.2.异常的传播过程

在异常的传播过程中,如果没有Catch语句进行捕获的话,异常将会沿着方法的调用栈一直向上传播。如果传播的过程中一直没有Catch语句块捕获的话,则最终传播到main方法中,最后由Main方法进行抛出,由java运行时的环境来处理。

package com.RuntimeException;

import java.io.IOException;
import java.net.ServerSocket;

public class Sample11_2 {

	public static void main(String[] args) {

		// 主方法中调用method1方法
		method1();
	}

	static void method1() {
		// method1方法中调用method2方法
		method2();
	}

	static void method2() {
		int[] a = new int[3];
		// 产生数据下标越界错误
		a[4] = 12;
		System.out.println("OK!!!");
	}

}

2.3.finally语句块的作用

某些特殊情况下,当程序出错后,无论抛出异常与否都必须保证执行。例如,打开了一个数据库连接,无论处理过程中是否抛出异常,最后都要关闭连接,不能由于抛出异常就影响了其执行。那么此时可以把必须要执行的语句放置到finally中。

package com.RuntimeException;

public class Sample11_3 {

	public static void main(String[] args)
	{
		//受监视的代码块
		try
		{
			//创建长度为4的int型数组
			int[] a=new int[4];
			System.out.println("整型数组创建完毕!!");
			//为数组最后一个元素赋值
			a[3]=9;
			System.out.println("整型数组中第四个元素的数值为"+a[5]);
		}
		//处理空引用异常代码块
		catch(NullPointerException npe)
		{
			//打印提示信息
			System.out.println("这里出现的错误类型是:空引用!!");
		}
		//finally块
		finally
		{
			//打印提示信息
			System.out.println("这里是finally块,无论是否抛出异常,这里总能执行!");
		}
	}
}

2.4.try、catch以及finally之间需要注意的问题

~没有catch的情况下,finally必须紧跟try

~catch和finally不能同时省略

~try、catch以及finally块之间不能插入其他代码

3.异常的层次结构

当发生异常的时候,java会将异常包装成一个异常类的对象,并将其引用作用参数传递给相应的catch语句来处理。在java中异常分为两部分捕获异常和未捕获异常

3.1.异常层次图

~Throwable类有两个直接子类,Error与Exception类,Exception类有一个子类RuntimeException。

~捕获异常一般都是由外界因素产生,并且是可以恢复的,并不是由程序引起的,这些异常程序本身没有问题也可能会产生。

~未捕获异常,即Error类以及其子类以及RuntimeException类及其子类

~捕获的异常类型,都需要在程序中进行捕获处理。

3.2.异常的显性再抛出

对于捕获的异常,在方法声明时抛出后,可以在其中通过Try以及Catch再次抛出。

package com.RuntimeException;

import java.io.IOException;
import java.net.ServerSocket;

public class Sample11_10 {
	// 定义connect方法将有可能抛出IOException异常
	public void connect() throws IOException {

		// 受监视的代码
		try {
			// 创建ServerSocket对象
			ServerSocket ss = new ServerSocket(9999);
		}
		// 异常处理代码
		catch (IOException e) {
			// 将异常抛出
			throw e;
		}
	}
}

3.3.隐形再抛出

如果只是想把异常再抛出的话,不必使用显性再抛出,直接使用隐形再抛出即可。

package com.RuntimeException;

import java.io.IOException;
import java.net.ServerSocket;

public class Sample11_12 {
	//声明方法myFunction将有可能抛出IOException异常
		public static void myFunction() throws IOException
		{
			//创建ServerSocket对象
			ServerSocket ss=new ServerSocket(9999);
		}
		public static void main(String[] args)
		{
			//受监视的代码
			try
			{
				//调用myFunction方法
				myFunction();
			}
			//异常处理代码
			catch(IOException e)
			{
				//打印调用栈信息
				e.printStackTrace();
			}
			System.out.println("恭喜你,程序正常运行结束!!!");
		}
}

4.自定义异常类

我们也可以自定义自己的异常类来满足自己使用时的需求。

4.1.创建自定义异常类

一般创建自定义异常类的话,只需继承Exception或者其他捕获异常类,常用到的方法如下

~printStackTrace():该方法将在控制台打印异常调用栈的信息

~toString():该方法将返回该异常对象的字符串表示

~getMessage():返回异常中携带的出错信息。

package com.RuntimeException;
class MyException extends Exception
{
	//两种版本的构造器
	public MyException()
	{	}
	public MyException(String msg)
	{
		super(msg);
	}
}
//主类
public class Sample11_15
{
	public static void main(String[] args)
	{
		//创建自定义异常类对象
		MyException me=new MyException("自定义异常类");
		me.printStackTrace();
		//调用继承的方法
		System.out.println("自定义异常对象的字符串表示为:“"+me.toString()+"”。");
		System.out.println("自定义异常对象携带的出错信息为:“"+me.getMessage()+"”。");
	}
}

4.2.同时捕获多次异常

如果try语句后要跟多个catch的话,最后catch语句的先后顺序满足从小到大的范围进行捕获,也就是异常先从子类开始,慢慢的递增。

时间: 2024-08-21 13:59:55

Java读书笔记一(异常处理)的相关文章

Java读书笔记(1)-异常处理

2015-12-31 一.异常处理 异常概述 (Exception/Error) 异常处理机制 使用try{}catch()捕获异常 异常类的继承体系(先处理小异常,再处理大异常) Java7提供的多异常捕获 访问异常信息 使用finally回收资源(显式回收物理资源 垃圾回收堆内存 return System.exit(1)) 异常处理的嵌套 Java7的自动关闭资源的try语句(带括号) Checked异常和Runtime异常体系 使用throws声明抛出异常(方法签名) 使用throw抛出

【java读书笔记】——java的异常处理

程序在实际环境的运行过程中,安全成为需要首先考虑的重要因素之一,这也是用户和程序员最关心的问题.同时,Java语言健壮性也体现在了能够及时有效地处理程序中的错误,准确的说是Java的异常处理机制为解决安全问题提交了一份满意的答卷. 先从整体上看一下本文要介绍的内容,然后进行详细的分析: 1.异常的概念 异常又称为例外,是特殊的运行错误对象,对应着Java语言特定的运行错误处理机制. 上面的概念是书本上说的,下面我谈一下自己的看法 其实异常处理机制提供了统一的机制来识别和响应程序错误,异常可以为我

think in java 读书笔记

java中没有单独函数的概念,依赖类的方法. java中优化了向前引用,类可以在调用者之后. java中包的命名方法实际上是网址的倒转. c++中因为存在全局变量和函数所以会存在一个变量名冲突的问题,但是java中不存在全局变量,不同程序设计者通过不同的类将相同名字的变量和方法隔离. static关键字 通常,我们创建类时会指出那个类的对象的外观与行为.除非用new 创建那个类的一个对象,否则实际上并 未得到任何东西.只有执行了new 后,才会正式生成数据存储空间,并可使用相应的方法. 但在两种

Effective Java 读书笔记(2创建和销毁对象)

第一章是引言,所以这里不做笔记,总结一下书中第一章的主要内容是向我们解释了这本书所做的事情:指导Java程序员如何编写出清晰.正确.可用.健壮.灵活和可维护的程序. 2.1考虑用静态工厂方法代替构造器 静态工厂方法与构造器相比有四大优势: (1)静态工厂方法有名称,具有适当名称的静态工厂方法易于使用.易于阅读: (2)不必每次在调用它们的时候都创建一个新的对象: (3)可以返回原返回类型的任何子类型的对象: (4)在创建参数化类型实例的时候,它们使代码变得更加简洁. 同时静态工厂方法也有两大缺点

Effective Java读书笔记(4 类和接口)

4.1 使类和成员的可访问性最小化 要区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰的隔离开来,然后模块之间只通过API进行通信,一个模块不需要知道其他模块内部的工作情况,这个概念被称为信息隐藏或封装,是软件设计的基本原则之一. 4.2 在公有类中使用访问方法而非公有域 坚持面向对象程序设计思想:如果类可以在它所在的包的外部进行访问,就提供访问方法,以保留将来改

Effective Java读书笔记(3对于所有对象都通用的方法)

3.1 覆盖equals时请遵守通用约定 什么时候应该覆盖Object.equals()方法呢? 如果类具有自己特有的"逻辑相等"概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法. Object.equals()方法具有自反性.对称性.传递性.一致性和与null比较返回false的特点. 实现高质量equals方法的诀窍: (1)使用==操作符检查"参数是否为这个对象的引用".如果是,则返回true,这

think in java 读书笔记 3 —— 数据报

目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 概要 1. 数据报基本知识 1. 数据报基本知识 之前套接字中例子使用的都是“传输控制协议”(TCP),亦称作“基于数据流的套接字”.根据该协议的设计宗旨,它具有高度的可靠性,而且能保证数据顺利抵达目的地.换言之,它允许重传那些由于各种原因半路“走失”的数据.而且收到字节的顺序与它们发出来时是一样的.当然,这种控制与可靠性需要我们付出一些代价:TCP 具有非常高的开销. 还有另一种协

【java读书笔记】——java开篇宏观把控 + HelloWorld

学完java有一段时间了,一直没有做相应的总结,总觉得有一种缺憾.从这篇博客开始,将自己平时的学习笔记进行总结归纳,分享给大家. 这篇博客主要简单的介绍一下java的基础知识,主要的目的是扫盲.原来只是听说过java,现在自己真正开始学习了,看完了第一集视频之后,问自己,你知道java是什么吗?问完之后才发现一无所知,上完查一查,简单了解一下,给自己扫盲. 介绍 知道java是一种可跨平台应用软件的面向对象的程序设计语言,就可以了. 组成 Java由四方面组成:java编程语言,java类文件格

【java读书笔记】JSTL,快速精通

JSTL并不是什么新颖的技术而且很简单,甚至有人认为JSTL已经过时了.但是我认为它既然存在,就有存在的道理,作为技术人员就应该知道它们是什么,怎么使用,有什么优点. JSTL包含两部分:标签库和EL语言.下面先介绍标签库,再介绍EL语言,最后总结一下JSTL的优点. JSTL JSTL简介 JSTL(JavaServer Page Standard Tag Library,即:JSP标准标签库),是由SUN公司提供的简化JSP页面设计的标签.JSTL是由Core(核心库).Format(格式化

think in java 读书笔记 1 ——移位

在Think in Java中有这么一段话“对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int.只有右侧的5个低位才会有用.这样可防止我们在一个int数里移动不切实际的位数.若对一个long值进行处理,最后得到的结果也是long.此时只会用到右侧的6个低位,防止移动超过long值里现成的位数.” 对上面那段话的理解是:移位操作符操作的运算对象是二进制的“位”,int类型是32位也就是2的5次幂 !如果移32位以上,那么原来的数的信息会全部丢失,这样也就