java异常笔记

网友投稿 2019-06-01 13:16

https://cdn.china-scratch.com/timg/190603/131AMJ1-0.gif

 * 异常:

 *

 * 我们的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("关闭资源失败");     }   }
 }
}ENDhttps://cdn.china-scratch.com/timg/190603/131AQ354-1.jpg

回复 1 获取python资料

回复 2 获取数学资料

回复 3 添加小编微信

回复 4 获取各种编程视频

回复 加群 获取群二维码

众号ID:gh_57e2066aaf8c扫码关注最新动态

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com