异常:程序运行时发生的不被期望的事件,它阻止了程序按照程序员的预期,正常执行。
意外产生和处理过程概述运行时有许多因素引起出错,硬件失败,除法溢出,数组下标越界。出错的位置都在方法Method中,出错后方法生成一个Exception对象,并把它交给JVM。这个对象里包括:错误信息,错误位置。
public class Test{ public static void main(String[] args){ int k = 0; System.out.println(10/k); System.out.println("计算结果:"+10/k); } } //报错信息 Exception in thread "main" java.lang.ArithmeticException: / by zero异常
Java异常就是Java提供的用于处理程序中错误的一种机制
错误:是指在程序运行的过程中发生的一些异常情况,例如除0溢出、数组下标越界、所需读取的文件不存在设计良好的程序应该在异常发生时提供处理这些错误的情况,使得程序不会因为异常的发生二阻断或者产生不可预见的结果 异常分类
Java提供列额异常处理机制,为方法的异常终止和出错提供了清楚的接口
用来在发生运行异常是告诉程序如何控制自身的运行,以防止错误的进一步恶化每个方法必须对它可能抛出的异常进行预先声明,在定义方法时,必须声明这个方法可能会抛出的哪一种或几种异常
1、调用栈溢出StackOverFlowError
public class Test{ public static void main(String[] args){ func(); } public static void func(){ func(); } }
2、算术异常ArithmeticException
public class Test{ public static void main(String[] args){ int k = 0; //System.out.println(10/k);抛出异常 //解决方案 Scanner sc = new Scanner(System.in); int k = sc.nextInt(); if (k == 0) System.out.println("分母输入不合法"); else System.out.println(10/k); } }
3、空指针异常NullPointerException
public class Test{ public static void main(String[] args){ Object obj = null; System.out.println(obj); //System.out.println(obj.toString());异常报错 //解决方案,先进行判空 if(obj != null) System.out.println(obj.toString()); } }
4、下标越界IndexOutOdBoundsException
public class Test{ public static void main(String[] args){ String str = "qwertyuiopasdafghjklzxcvbnm"; //char c = str.charAt(str.length());下标长度大于字符串长度 System.out.println(c); //解决方案,下标合法性验证 String str1 = "abcde"; Scanner sc = new Scanner(System.in); int pos = sc.nextInt(); if (pos>-1 && pos5、将对象转换为非法类型ClassCastException
public class Test{ public static void main(String[] args){ Object obj = new Object(); System.out.println(obj); Integer num = (Integer)obj; System.out.println(num); //解决方案,进行窄化 *** 作之前进行对象类型判定 Object obj1 = new Date(); System.out.println(obj1); if (obj1 != null && obj1 instanceof Integer){ Integer num = (Integer)obj1; System.out.println(num); }else System.out.println("不可进行窄化 *** 作"); } }6、数据格式异常NumberFormatException
public class Test{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String str = sc.nextLine();//读取用户键盘输入的一行内容,以回车符结束 int num = Integer.parseInt(str); System.out.println(num); //解决方案,针对用户录入的数据进行合法性验证 int num1 = -1; while(true){ try{ String str1 = sc.nextLine(); num1 = Integer.parseInt(str1); break; }catch(Exception e){ System.out.println("您输入的数据不合法"); } } } }异常的捕获和处理受检时异常:指导存在这种异常的可能,但是没有办法杜绝,所以必须进行编码异常处理
非受检时异常:这种异常不需要进行处理,发现的越早越好try{ //用于监听,try代码段中包含可能产生异常的代码,在执行过程中国如果出现了异常,则异常之后的java语句不会继续 执行,转而执行catch部分代码 }catch(Exception e){ //用于捕获,当发生异常时,程序会终止当前的流程,根据获取异常的类型去执行响应的代码段 }finally{ //finally代码是不论是否发生异常都会被执行的代码段 }try后面必须跟一个finally或者catch,其中有一个特殊的写法可以省略后面的finally和catchtry后可紧邻0-n个catch,如果没有catch则必须有finallythrows用在方法签名中,用于声明该方法可能会抛出异常,要求生调用则谁处理这个异常。main方法上也可以使用throws抛出异常,如果在主方法上使用了throws抛出,就表示在主方法中可以不用轻质行进行异常处理,如果出现了异常,就交给JVVM进行默认处理,则此时会导致程序中断执行 Java多异常
//第一种形式 try{ }catch (RuntimeException e){ e.printStackTrace(); }catch (Exception e){ e.printStackTrace(); }catch (Throwable e){ e.printStackTrace(); } //第二种形式 try{ }catch (IndexOutOfBoundsException | NumberFormatException | ArithmeticException e) { }catch可以编写多个,但是需要先写小范围,再写大范围,如果先写大范围,则小范围不可达
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)