Java异常处理 “受控(checked)”的异常

示例程序:

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

为什么以上程序完全符合Java语法规范,但是却会报错呢?

修正:

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

throws语句表明某方法中可能出现某种(或多种)异常,但它自己不能处理这些异常,而需要由调用者来处理。

当一个方法包含throws子句时,需要在调用此方法的代码中使用try/catch/finally进行捕获,或者是重新对其进行声明,否则编译时报错。

受控与不受控的异常

throws语句中声明的异常称为受控(checked)的异常,通常直接派生自Exception类。

RuntimeException(其基类为ExceptionError(基类为Throwable)称为非受控的异常。这种异常不用在throws语句中声明。

CheckedExceptionDemo.java示例展示了上述两种异常的特性。

 

抛出多个受控异常的方法

一个方法可以声明抛出多个异常

int g(float h) throws OneException,TwoException { …… }

例如:

import java.io.*;
public class ThrowMultiExceptionsDemo {
    public static void main(String[] args)
        {
      try {
            throwsTest();
       }
        catch(IOException e) {
            System.out.println("捕捉异常");
        }
    }

    private static void throwsTest()  throws ArithmeticException,IOException {
        System.out.println("这只是一个测试");
        // 程序处理过程假设发生异常
        throw new IOException();
        //throw new ArithmeticException();
    }
}

结果截图:

注意一个Java异常处理中的一个比较独特的地方:

当一个方法声明平抛出多个异常时,再次方法调用语句处只要catch其中任意一个异常,代码就可以顺利编译。

子类抛出受控异常的限制:

一个子类的throws子句抛出的异常,不能是其基类同名方法抛出的异常对象的父类。

import java.io.*;

public class OverrideThrows
{
	public void test()throws IOException
	{
		FileInputStream fis = new FileInputStream("a.txt");
	}
}
class Sub extends OverrideThrows
{
	//如果test方法声明抛出了比父类方法更大的异常,比如Exception
    //则代码将无法编译……
	public void test() throws FileNotFoundException
	{
            //...
	}
}

Java 7 及以后的版本,允许在一个catch块中捕获多个异常。

例如:

try {
            //...
            throw new SocketException();
    }
    catch (SocketException | SecurityException | NullPointerException e) {
            //exception handler
    }
时间: 2024-11-03 22:33:07

Java异常处理 “受控(checked)”的异常的相关文章

Java异常处理总结Exception\Error

Java异常处理总结Exception\Error 2012-12-28 08:17:17|  分类: JAVA |  标签:java  |举报|字号 订阅 Java异常处理总结 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当的麻烦! Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,

基础知识《十一》Java异常处理总结

Java异常处理总结 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当的麻烦! Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,所有的异常都可以用一个类型来表示,不同类型的异常对应不同的子类异常(这里的异常包括错误概念),定义异常处理的规范,在1.4版本以后增加了异常链机制,从而便于跟

【软帝学院】Java异常处理的机制,语法规则和技巧

一.Java异常处理机制 对于可能出现异常的代码,有两种处理办法: 1.在方法中用try...catch语句捕获并处理异常,catach语句可以有多个,用来匹配多个异常. 2.对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常. 如果每个方法都是简单的抛出异常,那么在方法调用方法的多层嵌套调用中,Java虚拟机会从出现异常的方法代码块中往回找,直到找到处理该异常的代码块为止.然后将异常交给相应的catch语句处理. 如果Java虚拟机追溯到方法调用栈最底部main()

java异常处理(父子异常的处理)

我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”.那个时候还不知道子类方法为什么要这样子抛出异常,后来通过学习<Thinking in Java>,我才明白其中的道理,现在我再来温习一下. 一.子类方法只能抛出父类方法的异常或者是其子异常 对于这种限制,主要是因为子类在做向上转型的时候,不能正确地捕获异常 package thinkinginjava; public abst

程序有异常不知道咋办?来学习Java异常处理知识点和异常链机制

Java异常处理知识点和异常链机制异常处理是程序设计中一个非常重要的方面,毕竟人无完人,不可能永不犯错,程序中有异常是很正常的, Java语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,下面是我对Java异常知识和异常链的一个总结.一.Java异常的基础知识异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.有些异常需要做处理,有些则不需要捕获处理,在编程过程中,首先应当尽可能去避免错误和异常发生,对于不可避免.不可预测的情况则在考虑异常发生时如何处理.J

深入理解Java异常处理机制

1. 引子 try-catch-finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的"教训"告诉我,这个东西可不是想象中的那么简单.听话.不信?那你看看下面的代码,"猜猜"它执行后的结果会是什么?不要往后看答案.也不许执行代码看真正答案哦.如果你的答案是正确,那么这篇文章你就不用浪费时间看啦. <span style="background-color: rgb(255, 255, 255

java异常处理和设计

在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻找出错的根源?但是如果一个项目异常处理设计地过多,又会严重影响到代码质量以及程序的性能.因此,如何高效简洁地设计异常处理是一门艺术,本文下面先讲述Java异常机制最基础的知识,然后给出在进行Java异常处理设计时的几个建议. 若有不正之处,请多多谅解和指正,不胜感激. 请尊重作者劳动成果,转载请标明

Java中的Checked Exception——美丽世界中潜藏的恶魔?

在使用Java编写应用的时候,我们常常需要通过第三方类库来帮助我们完成所需要的功能.有时候这些类库所提供的很多API都通过throws声明了它们所可能抛出的异常.但是在查看这些API的文档时,我们却没有办法找到有关这些异常的详尽解释.在这种情况下,我们不能简单地忽略这些由throws所声明的异常: 1 public void shouldNotThrowCheckedException() { 2 // 该API调用可能抛出一个不明原因的Checked Exception 3 exception

Java提高篇——Java 异常处理

异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出java.lang.ArithmeticException的异常. 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据. 要打开的文件不存在. 网络通信时连接中断,或者JVM内存溢出. 这些异常有的是因为用户错误