java学习(16)异常处理

/**
 * 笔记:
 * 异常处理
 * 一、当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,Java就会用异常对象来描述。
 * 二、Java用两种方法处理异常
 *    1.在发生异常的地方直接处理。
 *    2.将异常抛给调用者,让调用者处理。
 * 三、异常分类
 *    1.检查性异常(编译异常):java.lang.Exception
 *      在没有运行的时候就知道有异常,必须要处理。程序正确,但因为外在的环境条件不满足引发。这不是程序本身的逻辑错误,
 *      而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,程序开发人员必须考虑并处理这个问题,
 *      java编译器强制要求处理这类异常,如果不捕获这类异常,程序将不能被编译。
 *      例如:用户错误及I/O问题——程序试图打开一个并不存在的远程Socket端口,或打开不存在文件。
 *      
 *    2.运行期异常:java.lang.RuntimeException
 *      编译的时候,编译器不能发现,只有运行的时候才能发现。这意味着程序存在bug,如数组越界,0被除,入参不满足规范...
 *      这类异常需要更改程序来避免,Java编译器强制要求处理这类异常。
 *    3.错误:java.lang.Error
 *      最严重,很难通过程序来解决,可能源于源程序的bug,但一般更可能源于环境问题,如内存耗尽。但是一般很少见。
 *      错误在程序中无需处理,由运行环境处理。
 *    注:顶层是java.lang.Throwable类,检查性异常,运行期异常,错误都是这个类的子孙类。
 *       java.lang.Exception和java.lang.Error继承自java.lang.Throwable,
 *       java.lang.RuntimeException继承自java.lang.Exception。
 * 四、异常处理
 *    1.try ... catch
 *      程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。
 *    2.finally
 *      如果把finally块置于try ... catch 语句后,finally块一般都会得到执行。 他相当于一个万能保险,即使前面的try块发生异常,
 *      而又没有对应异常的catch块,finally块将马上执行。
 *      注:以下情形,finally块将不会被执行。
 *         (1)finally块中发生了异常。
 *         (2)程序所在线程死亡
 *         (3)在前面代码有System.exit();
 *         (4)关闭CPU
 *    3.将异常抛给调用者,让调用者处理异常throws。
 * 五、多个异常处理的规则
 *    定义多个catch可以精确定位异常。如果为子类的异常定义了特殊的catch块,而父类的异常则放在另一个catch块中。此时必须满足以下规则:
 *    子类异常的处理块必须在父类异常处理块的前面,否则会发生编译错误。所以越特殊的异常越在前面处理,越普遍的异常越在后面处理。
 *    这类似于制订防火墙的规则次序:较特殊的规则在前,较普遍的规则在后。

 */

package com.shuiyixin1;
import java.io.*;
import java.net.*;
public class learnJ_007yichang {

	/**
	 * @作者:shuiyixin
	 * @日期:2018.02.15
	 * @内容:异常
	 * 
	 */
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//检查异常1.打开文件
		//错误提示:Unhandled exception type FileNotFoundException
		//FileReader fr = new FileReader("D:\\aa.text");
		//处理方式  使用try ... catch
		FileReader fr = null;
		try {
			fr = new FileReader("D:\\aa.txt");
			//在出现异常的地方会终止执行代码,会直接进入到catch,如果有多个catch语句,则进入匹配异常的那个。
			//System.out.println("hello try");
		} catch (Exception e) {
			//捕获异常可以直接在最大情况下捕获,也可以捕获最小异常。即catch(FileNotFoundException e)
			//输出异常信息,利于排错,排除bug
			//System.out.println("hello catch");
			e.printStackTrace();
		} finally{
			//不管有没有异常,一定会执行。一般用于把需要关闭的资源[文件,连接,内存...]
			//注意 如果没有catch,直接是try ,finally也是可以的。
			System.out.println("调用Finally");
			if (fr!=null) {
				try {
					fr.close();
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		}
		
		//检查异常2.连接一个端口:192.168.12.12 ip 的端口号是 4567
		//在运行,cmd黑窗口中ping www.baidu.com
		//提示错误:Unhandled exception type UnknownHostException
		//Socket a = new Socket("192.168.1.23",78);
		
		//运行异常1.零被除
		//提示错误:java.lang.ArithmeticException: / by zero
		//int a = 4/0;
		//运行错误2.数组越界
		//提示错误:java.lang.ArrayIndexOutOfBoundsException: 3
		//int arr[] = {1,2,3};
		//System.out.println(arr[3]);
		
		//如果上面捕获异常,下面语句还会执行,例如:
		System.out.println("hello world");
		
		
		
		//异常抛出
		Father f1 = new Father();
		f1.test1();
//		at com.shuiyixin1.Son.test2(learnJ_007yichang.java:96)  错误第一次出现
//		at com.shuiyixin1.Father.test1(learnJ_007yichang.java:83)   调用Son类时调用错误
//		at com.shuiyixin1.learnJ_007yichang.main(learnJ_007yichang.java:63)  在主函数中调用错误函数。
		
		
		
	}

}

class Father {
	private Son son = null;
	
	public Father(){
		son = new Son();
	}
	public void test1(){
		//父类可以继续抛出,最后会交给虚拟机去做。
		System.out.println("father test1");
		try {
			son.test2();
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("Father test1 catch");
			e.printStackTrace();
		}
	}
}

class Son{
	public void test2()throws Exception{
		//错误我不负责,谁调用我谁解决。
		FileReader fr = null;
		fr = new FileReader("d:\\dd.txt");
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值