博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java学习(16)异常处理
阅读量:4074 次
发布时间:2019-05-25

本文共 3420 字,大约阅读时间需要 11 分钟。

/**
 * 笔记:
 * 异常处理
 * 一、当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,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");	}}

转载地址:http://jyyni.baihongyu.com/

你可能感兴趣的文章
链接点--数据结构和算法
查看>>
servlet中请求转发(forword)与重定向(sendredirect)的区别
查看>>
Spring4的IoC和DI的区别
查看>>
springcloud 的eureka服务注册demo
查看>>
eureka-client.properties文件配置
查看>>
MODULE_DEVICE_TABLE的理解
查看>>
platform_device与platform_driver
查看>>
platform_driver平台驱动注册和注销过程(下)
查看>>
.net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法
查看>>
c# 如何调用win8自带的屏幕键盘(非osk.exe)
查看>>
build/envsetup.sh 简介
查看>>
Android framework中修改或者添加资源无变化或编译不通过问题详解
查看>>
linux怎么切换到root里面?
查看>>
linux串口操作及设置详解
查看>>
安装alien,DEB与RPM互换
查看>>
编译Android4.0源码时常见错误及解决办法
查看>>
Android 源码编译make的错误处理
查看>>
linux环境下C语言中sleep的问题
查看>>
ubuntu 12.04 安装 GMA3650驱动
查看>>
新版本的linux如何生成xorg.conf
查看>>