【Java】异常处理_学习笔记

异常:

1、格式1:

try

{

//业务代码

}

catch(Exception e)

{

//异常处理代码

}

说明:

a、   异常抛出:执行try里的代码,系统会自动生成一个异常对象,该对象会被提交给Java运行环境的过程。

b、   异常捕获:Java运行环境将接收到的异常对象与catch块匹配的过程。

c、   找不到匹配catch块,程序终止。

2、格式2:

try

{

//业务代码

}

catch(Exception1 e1)

{

//异常处理代码

}

catch(Exception2 e2)

{

//异常处理代码

}

……

说明:try后可以跟多个catch,多个catch由上至下顺序执行,所以范围大的异常放在后面,避免之前的小范围异常得不到执行机会。

3、格式3:

try

{

//业务代码

}

catch(Exception1 | Exception2| Exception3  e)

{

//异常处理代码

//如下代码错误

//e = new Exception1();

}

说明:一个catch里的参数可以包含多个异常类型,各类型间使用|号隔开,多异常的变量e有隐式final修饰,所以不能继续赋值。

4、异常信息访问:

A、   getMessage():返回异常的详细描述字符串。

B、   printStackTrace():将异常的跟踪栈信息输出到标准错误输出。

C、   printStackTrace(PrintStream s):将异常的跟踪栈信息输出到指定输出流。

D、  getStackTrace():返回异常的跟踪栈信息。

举例:

try

{

//业务代码

}

catch(Exception1  e1)

{

System.out.println(e1.getMessage());

e1.getStackTrace();

}

5、物理资源回收

try

{

//fis = new FileInputStream(“a.text”);

}

catch(Exception1 e1)

{

//异常处理代码

}

catch(Exception2 e2)

{

//异常处理代码

}

……

finally

{

//资源回收块

//fis.close();

}

说明:

A、            Java垃圾回收机制并不会回收物理资源(数据库连接、网络连接、磁盘文件等),只会回收堆内存中的无引用的对象。

B、            Try语句必须有,catch和finally语句必须有一个以上。

C、            Finally语句应该放在最后,否则其后的catch语句将失去执行机会。

D、           除非使用System.exit(1)语句,否则finally语句一定会得到执行。

6、异常处理的嵌套

说明:

A、   嵌套的层数不限,但超过两层会降低可读性。

B、   异常处理的流程可以放在任何可以放可执行代码的地方,所以try块里、catch块里,finally块里都可以嵌套。

7、自动关闭资源的try语句

try(

BufferedReader br=new BufferedReader(new FileReader(“AutoClose.java”));

PrintStream ps= new PrintSteam(new FileOutpurSteam(“a.txt”))

)

{

//业务代码

}

说明:

A、   在try后的()里可以初始化、声明一个或多个资源,语句结束时资源会自动关闭。

B、   ()里的资源须实现AutoCloseable或Closeable接口,Closeable接口是AutoCloseable接口的子接口,他们的close()方法都抛出了IOException,Java7几乎把所有资源类都实现了这两个接口。

8、Checked异常体系和Runtime异常体系

Runtime异常体系:所有的RuntimeException类及其子类的实例都是Runtime异常;

Cheaked异常体系:不是Runtime异常体系的称为Checked异常体系。

说明:Checked异常需要程序显式处理,而Runtime异常无需显式声明抛出。

9、使用throws声明抛出异常

格式:throws ExceptionClass1,ExceptionClass2……

举例1:

public class void main(String[] args) throws IOException

{

FileInputStream fis = new FileInputStream(“a.txt”);

}

说明:

a、throws声明抛出异常,自己不处理异常,让上一级调用者处理。

b、上面这段代码会将IOException异常丢给JVM处理,JVM打印异常的跟踪栈信息后,就会结束程序。

举例2:

public class void main(String[] args) throws Exception

{

test();

}

public static void test() throws IOException

{

FileInputStream fis = new FileInputStream(“a.txt”);

}

说明:IOException是一个Checked异常,方法a用throws抛出checked异常,方法b调用了a,那么,a也要用throws抛出一个异常,或者用try catch显式捕获该异常。

举例3:

public class OverrideThrows

{

public void test() throws IOException

{

FileInputStream fis = new FileInputStream(“a.txt”);

}

}

class Sub extends OverrideThrows

{

//以下是错误的

public void test() throws Exception

{

}

}

说明:

A、子类重写父类方法时throws抛出的类型,应该与父类的抛出异常相同或是该异常的子类。

B、子类重写父类方法时,抛出的异常不能比父类方法多。

10、使用throw抛出异常

格式:

throw ExceptionInstance;

说明:throw抛出的是异常实例,而不是异常类。

举例1:

try

{

//业务代码

throw new Exception(“不好”);

}

catch(Exception e)

{

//异常处理代码

}

说明:throw一次只能抛出一个异常实例。

举例2:

public static void main(String[] args)

{

try

{

throwChecked(-3);

}

catch(Exception e)

{

System.out.ptintln(e.getMessage());

}

throwRuntime(3);

}

public static void throwChecked(int a ) throw Exception

{

//业务代码

}

public static void throwRuntime(int a)

{

//业务代码

throw new RuntimeException(“异常”);

}

说明:

a、抛出的是checked类异常的话,throw语句须放在try块中,或者直接放在带throws声明的抛出的方法中。

b、抛出的是Runtime类异常的话,不一定要放在try块或者带throws的方法中。

11、自定义异常类

格式:

public class 类名 extends Exception(或者RuntimeException)

{

//无参数的构造器

public 类名 (){}

//带参数的构造器

public 类名(String msg)

{

super(msg);

}

}

说明:

a、自定义异常都应该继承Exception类或者RuntimeException类。

b、需要写如上的两个构造器,这个msg将作为异常的返回信息,也就是getMessage方法的返回值。

12、catch和throw同时使用

举例:

public 返回值 test(Sting str) throws AuctionException//这是一个自定义异常

{

try

{

//业务代码

}

catch(Exception e)

{

e.printStackTrace();//打印异常的跟踪栈信息

throw new AuctionException(“异常”);//重新抛出一个自定义异常,并调用带参数的构造器

}

}

public static void main(String[] args)

{

try

{

//假设之前已经创建了对象TE

TE.test(“hello”);

}

catch(AuctionException ae)

{

//再次捕捉test方法的异常,并且处理

System.err.println(ae.getMessage());

}

}

说明:某些异常当前方法无法完全处理,先处理一部分,然后再将异常抛给上一级调用者继续处理。

13、Java7增强的throw语句

Java7以前使用throws捕获再抛出如下:

public class Throwtest

{

public static void main(String args) throws Exception //FileNotFoundException

{

try

{

new FileOutputStream(“a.txt”);//FileNotFoundException

}

catch(Exception ex)

{

ex.pringtStackTrace();

throw ex;//注意抛出的变量类型

}

}

}

说明:Java7以前,因为throw抛出的是Exception类型,所以throws抛出的必须是Exception类型,Java7之后,可以识别到try块里只可能抛出FileNotFoundException异常,所以throws可以直接抛出FileNotFoundException异常。

14、异常链

说明:

a、这种把原始异常信息隐藏起来,仅向上提供必要的异常提示信息的处理方式,可以保证底层异常不会扩散到表面层,可以避免向上暴露太多的细节。

b、这种捕获一个异常然后接着抛出另一个异常,并把原始异常信息保存下来的处理方式,称为异常链(23种设计模式之一:责任链模式)。

时间: 2024-11-03 21:57:19

【Java】异常处理_学习笔记的相关文章

Java基础_学习笔记_14_异常

1 class Test 2 { 3 public int devide(int x,int y) 4 { 5 int result=x/y; 6 return result; 7 } 8 } 9 class TestException 10 { 11 public static void main(String [] args) 12 { 13 Test t=new Test(); 14 t.devide(2,0); 15 System.out.println("the program is

Java基础_学习笔记_16_线程

1.进程与线程 进程,在多任务操作系统中,每个独立执行的程序称为进程,也就是“正在进行的程序”.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配的最小单元. 线程,是进程中的一部分,是一个程序内部的一条执行线索.在网络或多用户环境下,一个服务器需要接受大量且不确定用户数量的并发请求,为每一个请求创建一个进程显然是行不通的,因此引入了线程.线程是最小的调度单元.通常在一程序中实现多段代码同时交替运行时,需要产生多个线程,并制定每个线程上所要运行的程序代码块,这就

Java基础_学习笔记_13_类的多态性(二)

1 class Animal 2 { 3 private String name; 4 Animal(String name) 5 { 6 this.name=name; 7 } 8 public void enjoy() 9 { 10 System.out.println("叫声..."); 11 } 12 } 13 class Cat extends Animal 14 { 15 private String eyeColor; 16 Cat(String n,String eye

python基础教程_学习笔记23:图形用户界面

图形用户界面 丰富的平台 在编写Python GUI程序前,需要决定使用哪个GUI平台. 简单来说,平台是图形组件的一个特定集合,可以通过叫做GUI工具包的给定Python模块进行访问. 工具包 描述 Tkinter 使用Tk平台.很容易得到.半标准. wxpython 基于wxWindows.跨平台越来越流行. PythonWin 只能在Windows上使用.使用了本机的Windows GUI功能. JavaSwing 只能用于Jython.使用本机的Java GUI. PyGTK 使用GTK

java动态代理学习笔记

没事的时候翻看lang.reflect包下的代码,发现有两部分内容:涉及反射和动态代理. 很多地方都可以看到动态代理的影子,只是一直没仔细看下. 在学习之前,先提出几个问题,带着问题来看代码: 1.什么是动态代理? 2.为什么使用动态代理? 3.使用它有哪些好处? 4.哪些地方需要动态代理? --------------------分隔线----------------------------- 和动态代理有关的有两个类 1.interface InvocationHandler Object

python基础教程_学习笔记13:标准库:一些最爱——sys

标准库:一些最爱 sys sys这个模块让你能够访问与python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描述 argv 命令行参数,包括脚本名称 exit([arg]) 退出当前程序,可选参数为给定的返回值或者错误信息 modules 映射模块名字到载入模块的字典 path 查找模块所在目录的目录名列表 platform 类似sunos5或者win32的平台标识符 stdin 标准输入流--一个类文件对象 stdout 标准输出流--一个类文件对象 stde

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对