java异常笔记

发布日期:2019-11-20 19:27 本文摘要:* 异常:** 我们的java程序也是会存在某些不正常的情况的,这些不正常情况统称为异常。* 异常体系:* Throwable*Error*Excetion*Throwable常用的方法:*toString()返回此throwable的简短描述,异常对象的完整类名*getMessage()返回的是创建Throwable传入的字

  * 异常:** 我们的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("头晕g.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("关闭资源失败"); } }}

少儿编程培训课程java异常笔记