java异常笔记
* 异常:
*
* 我们的java程序也是会存在某些不正常的情况的,这些不正常情况统称为异常。
* 异常体系:
* Throwable
* Error
* Excetion
*Throwable常用的方法:
* toString() 返回此throwable的简短描述,异常对象的完整类名
* getMessage() 返回的是创建Throwable传入的字符串信息。
* printStackTrace() 打印异常的栈信息。
例子代码:
public class Demo1 {public static void main(String[] args) {/*//创建一个Throwable对象。Throwable t=new Throwable();//Throwable t=new Throwable("头晕");String info=t.toString();System.out.println("toString: "+info);//java.lang.Throwable 包名+类名=完整类名String message=t.getMessage();System.out.println("toString: "+message);*/test();}public static void test() {Throwable t=new Throwable();t.printStackTrace();}
}
疑问:下面的信息是通过printStackTrace方法打印出来的,那么异常对象从何而来?
*Exception in thread "main" java.lang.ArithmeticException: / by zeroat cn.itcast.exception.Demo3.div(Demo3.java:15)at cn.itcast.exception.Demo3.main(Demo3.java:12)jvm运行到a/b语句的时候,发现b为0,除数为0在现实生活中是属于不正常的情况,
jvm一旦发现这种不正常的情况时候,那么jvm就会马上创建一个对应的异常对象,并且会调用这个异常对象的printStackTrace的方法来处理。
异常的处理:
方式一:捕获异常
捕获处理的格式:
try{
可能发生异常的代码
}catch(捕获的异常类型 变量名){
处理异常的代码。。。。
}
捕获处理要注意的细节:
1.如果try块中代码出了异常经过了处理之后,那么try-catch块外面的代码可以正常执行。
2.如果try块中出了异常的代码,那么在try块中出现异常代码后面的代码不会执行了。
3.一个try块后面是可以跟有多个catch块的,也就是一个try块可以捕获多种异常的类型。
4.一个try块可以捕获多种异常的类型,但是捕获的异常类型必须从小到大进行捕获,否则编译报错。
例子代码:
public class Demo3 {public static void main(String[] args) {// TODO Auto-generated method stubint[]arr=null;div(4,2,arr);}public static void div(int a,int b,int[] arr) {// int c=a/b;// System.out.println("c="+c);try{int c=a/b;//jvm在这句话的时候发现了不正常的情况,那么就会创建一个对应的异常对象System.out.println("长度"+arr.length);System.out.println("c="+c);}catch(ArithmeticException e) {//处理异常的代码System.out.println("toString"+e.toString());}catch(NullPointerException e) {System.out.println(e.toString());}
}
}
* 异常的处理方式-----抛出处理
*
* 抛出处理(throw throws)
*
* 抛出处理要注意的事项:
* 1.如果一个方法的内部抛出了一个异常对象,那么必须在方法上声明抛出。
*2.如果调用了一个声明抛出异常的方法,那么调用者必须处理异常。
*3.如果一个方法内部抛出了一个异常对象,那么throw语句后面的代码都不会再执行了。
*4.在有一种情况,只能抛出一种类型对象。
*throw与throws两个关键字:
*1.throw关键字是用于非法内部的,throws是用于方法声明的。
*2.throw关键字是用于方法内部抛出一个异常对象的,throws关键字是用于在方法声明抛出异常类型的。
*3.throw关键字后面只能有一个异常对象,throws后面一次可以声明抛出多种类型的异常。
public class Demo4 {public static void main(String[] args) {// TODO Auto-generated method stubtry {div(4,0);
}catch(Exception e) {System.out.println("异常");e.printStackTrace();}}public static void div(int a,int b)throws Exception {if(b==0) {throw new Exception();//抛出一个异常对象}int c=a/b;System.out.println("c="+c);}
}package cn.itcast.exception;
* 自定义异常类:
*sun提供了很多的异常类给我们用于描述程序中的不正常情况,但是sun给我们提供异常类还不足以描述我们现实生活中所有不正常情况,那么这时候我们就需要自定义异常。
*需求:模拟feiq上线的时候如果没有插上网线,那么就抛出一个没有插上网线的异常。
*如果已经插上网线,那么久正常显示好友列表。
*自定义异常类的步骤:自定义一个类继承Exception。
class NoIpException extends Exception{public NoIpException(String message) {super(message);//调用了Exception一个参数的构造方法。}}public class Demo5 {public static void main(String[] args) {// TODO Auto-generated method stubString ip="192.189.21.100";ip=null;try {feiq(ip);}catch(NoIpException e) {e.printStackTrace();System.out.println("马上");}
}public static void feiq(String ip) throws NoIpException{if(ip==null) {throw new NoIpException("没有插网线");}System.out.println("正常");}
}
* 自定义异常
*需求:模拟你去吃饭,如果带钱少于10块,那么久抛出一个没有带够钱的异常对象。
*如果带够了,那么就可以吃饭。
class NoMoneyException extends Exception{public NoMoneyException(String message) {super(message);}}public class Demo6 {public static void main(String[] args) {try {eat(0);}catch(NoMoneyException e) {System.out.println("洗碗");}
}public static void eat (int money) throws NoMoneyException{if (money<10) {throw new NoMoneyException("吃霸王餐");}System.out.println("吃饭");}}package cn.itcast.exception;
* finally关键字:
*finally块的使用前提是必须要存在try块才能使用
*
*finally块的代码在任何情况下都会执行的,除了jvm退出的情况。
*finally非常适合做资源释放的工作,这样子可以保证资源文件正在任何情况下都会被释放。
*
*try块的三种组合方式:
*第一种:比较适用于有异常要处理,但是没有资源释放的。
*try{
*可能发生异常的代码
*}catch(捕获的异常类型 变量名){
*处理异常的代码
}
*第二种:比较适用于既有异常要处理又要释放资源的代码。
*try{
*可能发生异常的代码
*}catch(捕获的异常类型 变量){
*处理异常的代码
*}finally{
*释放资源的代码
}
*第三种:比较适用于内部抛出的是运行时异常,并且有资源要释放。
*try{
*可能发生异常的代码
*
*}finally{
* 释放资源的代码
}
例子1:public class Demo7 {public static void main(String[] args) { // TODO Auto-generated method stub div(4,0);
} public static void div(int a,int b) { try {// if(b==0) {// System.exit(0);//退出jvm// } int c=a/b; System.out.println("c="+c); }catch(Exception e) { System.out.println("除数为0"); throw e; }finally { System.out.println("finally 块执行了"); } }
例子2:package cn.itcast.exception;
import java.io.File;import java.io.FileReader;import java.io.IOException;
public class Demo8 {
public static void main(String[] args) { // TODO Auto-generated method stub FileReader fileReader=null; try { //找到目标文件 File file=new File("f:a.text"); fileReader=new FileReader(file); //读取文件 char[]buf=new char[1024]; int length=0; length=fileReader.read(buf); System.out.println("读取到的文件"+new String(buf,0,length)); }catch(IOException e) { System.out.println("读取文件失败"); }finally { //关闭资源 try{ fileReader.close(); System.out.println("关闭资源成功"); }catch(IOException e) { System.out.println("关闭资源失败"); } }
}
}END
回复 1 获取python资料
回复 2 获取数学资料
回复 3 添加小编微信
回复 4 获取各种编程视频
回复 加群 获取群二维码
众号ID:gh_57e2066aaf8c扫码关注最新动态--end--
声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com