第10章-异常处理 --- Checked异常和Runtime异常体系

第10章-异常处理 --- Checked异常和Runtime异常体系

  Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常).所有的RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为Checked异常.

  对于Checked异常的处理方法有如下两种:

  (1)当前方法明确知道如何处理该异常,程序应该用try...catch块来捕获该异常,然后在对应的catch块中修复该异常.

  (2)当前方法不知道如何处理这种异常,应该在定义该方法时声明抛出该异常.

(一)使用throws声明抛出异常

  使用throws声明抛出异常的思路是,当前方法不知道如何处理这种类型的异常,该异常应该由上一级调用者处理;如果main方法也不知道如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常将交给JVM处理.
JVM对异常的处理方法是,打印异常的跟踪栈信息,并中止程序运行。

  throws声明抛出只能在方法签名中使用,throws可以声明抛出多个异常类,多个异常类之间以逗号隔开。

  throws声明抛出的语法格式如下:

    throws
ExceptionClass1,ExceptionClass2...

  上面throws声明抛出的语法格式仅跟在方法签名之后,一旦使用throws语句声明抛出该异常,程序就无须使用try...catch块来捕获该异常了.


import java.io.FileInputStream;
import java.io.IOException;

public class ThrowsTest
{
public static void main(String[] args) throws IOException
{
FileInputStream fis = new FileInputStream("a.txt");
}
}

上面程序声明不处理IOException异常,将该异常交给JVM处理,所以程序一旦遇到该异常,JVM就会打印该异常的跟踪栈信息,并结束程序.

----------------------------------------------------------------------------------------------

(注:如果某段代码中调用了一个带throws声明的方法,该方法声明抛出了Checked异常,则表明该方法希望它的调用者来处理该异常.也就是说,调用该方法时要么放在try块中显示捕获该异常,要么放在另一个带throws声明抛出的方法中)

  下面举例:  


import java.io.FileInputStream;
import java.io.IOException;

public class ThrowsTest2
{
public static void main(String[] args) throws Exception
{
//因为test()方法声明抛出IOException异常
//所以调用该方法的代码要么处于try...catch块中
//要么处于另一个带throws声明抛出的方法中
test();
}

public static void test() throws IOException
{
//因为FileInputStream的构造器声明抛出IOException异常
//所以调用FileInputStream的代码要么处于try...catch块中
//要么处于另一个带throws声明抛出的方法中
FileInputStream fis = new FileInputStream("a.txt");
}
}

------------------------------------------------------------------------------------------------------

使用throws声明抛出异常时有一个限制,就是方法重写时"两小"中的一条规则:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多.

下面举例:


import java.io.FileInputStream;
import java.io.IOException;

public class OverrideThrows
{
public void test() throws IOException
{
FileInputStream fis = new FileInputStream("a.txt");
}
}

class Sub extends OverrideThrows
{
//子类方法声明抛出了比父类方法更大的异常
//所以下面的方法出错
@Override
public void test() throws Exception
{
// TODO Auto-generated method stub
super.test();
}
}

上面程序中Sub子类中的test()方法声明抛出Exception,该Exception是其父类声明抛出异常IOException类的父类,这将导致程序无法通过编译.

由此可见,使用Checked异常至少存在如下两大不便之处:

(1)对于程序中Checked异常,Java要求必须显示捕获并处理该异常,或者显示声明抛出该异常.这样就增加了编程的复杂度

(2)如果在方法中显示声明抛出Checked异常,将会导致方法签名与异常耦合,如果该方法是重写父类的方法,则该方法抛出的异常还会受到被重写方法所抛出异常的限制.  

第10章-异常处理 --- Checked异常和Runtime异常体系,布布扣,bubuko.com

时间: 2024-10-27 12:00:38

第10章-异常处理 --- Checked异常和Runtime异常体系的相关文章

第10章-异常处理 --- 使用throw抛出异常

第10章-异常处理 --- 使用throw抛出异常 (一)抛出异常 如果需要在程序中自行抛出异常,则应使用throw语句,throw语句可以单独使用,throw语句抛出的不是异常类,而是一个异常实例,而且每次只能抛出一个异常实例. throw语句的语法格式如下: throw ExceptionInstance; 如果throw语句抛出的异常是Checked异常,则该throw语句要么处于try块里,显示捕获该异常,要么放在一个带throws声明抛出的方法中,即把该异常交给该方法的调用者处理;如果

9.2 Checked异常和Runtime异常

Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常).所有RuntimeException类及其子类的实例被称为Runtime异常:不是RuntimeException类及其子类的异常实例则被称为Checked异常. Java认为Checked异常都是可以被处理(修复)的异常,所以Java程序必须显式处理Checked异常.如果程序没有处理Checked异常,该程序在编译时将会发生错误,无法通过编译. 对于Checked异常的处理方式有如下两种: 1.当前方法明确知道

运行时异常和一般异常

Java提供了两类主要的异常:runtime exception和checked exception. checked 异常,一般异常,就是我们经常遇到的IO异常,SQL异常. 对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch声明. 所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常. runtime 异常,运行时异常,我们可以不处理. 当出现这样的异常时,总是由虚拟机接管.比如:我们从来没有人去处理过NullPointerExcepti

第25章 SEH结构化异常处理_未处理异常及向量化异常

25.1 UnhandledExceptionFilter函数详解 25.1.1 BaseProcessStart伪代码(Kernel32内部) void BaseProcessStart(PVOID lpfnEntryPoint) //参数为线程函数的入口地址 { DWORD retValue; DWORD currentESP; DWORD exceptionCode; currentESP = ESP; //lpfnEntryPoint被try/except封装着,这是系统安装的默认的异常

【Oracle】第四章异常处理

第四章异常处理 PL/SQL 块是构成 PL/SQL 程序的基本单元 将逻辑上相关的声明和语句组合在一起 PL/SQL 分为三个部分,声明部分.可执行部分和异常处理部分 [DECLARE declarations] BEGIN executable statements [EXCEPTION handlers] END; 以下示例演示了如何使用PL/SQL 语句: declare area integer; width integer; height integer; currentdate d

第10章:IO流

IO流 IO流 |--字节流 |--字节输入流 InputStream int read():一次读取一个字节 int read(byte[] bys):一次读取一个字节数组 |--FileInputStream |--BufferedInputStream |--字节输出流 OutputStream void write(int by):一次写一个字节 void write(byte[] bys,int index,int len):一次写一个字节数组的一部分 |--FileOutputStr

零基础学Python--------第9章 异常处理及程序调试

第9章 异常处理及程序调试 9.1 异常概述 在程序运行过程中,经常会遇到各种各样的错误,这些错误统称为“异常”.这些异常有的是由于开发者将关键字敲错导致的,这类错误多数产生的是SyntaxError:invalid syntax(无效的语法),这将直接导致程序不能运行.这类异常是显式的,在开发阶段很容易被发现.还有一类是隐式的,通常和使用者的操作有关. 实例01:模拟幼儿园分苹果 def division(): '''功能:分苹果''' print("\n===================

夯实Java基础系列10:深入理解Java中的异常体系

目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调用链 自定义异常 异常的注意事项 当finally遇上return JAVA异常常见面试题 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 - Java异常 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.c

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简单的模块 #hello.py print ("Hello,World!") >>> import hello Traceback (most recent call last): File "<pyshell#56>", line 1, i