异常处理
一、异常的分类:
1、 检查性异常:java.lang.Exception(编译时候检查出的),外在条件不满足引发的,不是程序、的错,很可能是远程机器名出错,如果不处理程序就不能被编译。
2、运行期异常:java.lang.RuntimeException,意味着程序存在Bug,如数组越界,0被除,入参不满足规范……需要更改程序来处理
3、错误:java.lang.Error,一般很少,很难通过程序解决,可能源于程序的Bug,但是一般更可能源于环境问题,如内存耗尽,错误在程序中无需处理,而由运行环境处理。
二、try & catch块 异常处理:
1、try块中包含可能存在异常的代码,catch块中包含了对应异常的处理机制。
2、设置了捕获,而且真的捕获到了异常,后面的异常就检测不到,遵循一个先后的顺序,但是程序还是会继续执行,正常程序和e.printStackTrace();执行后显示的顺序貌似有点乱了,所以书上推荐用System.out.println("message:="+e.getMessage());显示顺序不会乱
3、在出现异常的地方就中止执行代码,然后直接进入到catch语句,如果有多个catch语句,就进入匹配异常的那个catch语句。
4、
try
{
FileReader fr=new FileReader("d:\\12334.txt");
}
catch (Exception e) //或者Exception e,Exception e是捕获所有的
{
System.out.println("message:="+e.getMessage());
e.printStackTrace();
}
5、finally:如果把finally块置try…catch语句后,finally块一般都会得到执行,相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行
6、文件被打开一直没有关闭是很恐怖的!所以就有了finally语句,不管有没有异常都会执行,一般说,把需要关闭的资源[文件,连接,内存……]
7.以下情况finally将不被执行:
Finally块中发生了异常
程序所在的线程死亡了
使用了System.exit(-1)
关闭CPU
8、
import java.io.*;
import java.net.*;
public class Demo7_6
{
public static void main(String[] args)
{
//检查异常1.打开文件
FileReader fr=null;
try
{
//在出现异常的地方就中止执行代码,然后直接进入到catch语句
//如果有多个catch语句,就进入匹配异常的那个catch语句
fr=new FileReader("d:\\1234.txt");//如果找不到咋办啊?你必须处理
//Socket s=new Socket("192.1638.0.1",8080);
}
catch (Exception e) //或者Exception e,Exception e是捕获所有的
{
//要输出异常的信息,利于排错
System.out.println("message:="+e.getMessage());
e.printStackTrace();
//处理
}
// catch (IOException e2)
// {
// e2.printStackTrace();
// }
finally
{
System.out.println("进入finally");
//这个语句块,不管有没有异常,都会执行
//一般说,把需要关闭的资源[文件,连接,内存……]
if(fr!=null)
{
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//
System.out.println("kankan");
//2.连接一个192.168.12.12 ip的端口号:4567
//Socket s=new Socket("192.168.0.1",78);
//运行异常
//int a=4/0;
//数组越界
//int arr[]={1,2,3};
// System.out.println(arr[23]);
}
}
三、抛出异常
1、原理:不断的将异常向上一个等级抛出,子类向父类抛,直至JVM。
2、格式:在方法后面写throws exception,注意,在主函数main之后也能够这样做。
3、示例:
import java.io.FileReader;
public class Demo7_7
{
public static void main(String[] args) throws Exception
{
Father father=new Father();
father.test1();
}
}
class Father
{
private Son son;
public Father()
{
son=new Son();
}
public void test1() throws Exception
{
System.out.println("1");
try {
son.test2();
} catch (Exception e) {
System.out.println("父亲");
e.printStackTrace();
}
}
}
class Son
{
public void test2() throws Exception
{
FileReader fr=null;
fr=new FileReader("d:\\123d4.txt");
}
}