大家好,欢迎来到IT知识分享网。
抛出异常
1.在捕获异常之前,必须有一段代码生成并抛出一个异常对象。
2.异常类型不同,抛出异常的方法也不同,分为:系统自动抛出的异常、指定方法抛 出的异常。
3.系统定义的异常由系统抛出;指定方法抛出的异常需使用关键字throw或throws;
我们主要讨论由方法抛出的异常用法。
1.抛出异常的方法与调用方法处理异常
- 异常的产生和处理可以在一个方法内进行;
- 异常的产生和处理也可以不在一个方法中,即一个方法产生异常,由该方法的调用者去处理异常
相对应地,异常有关的方法就有两个:有抛出异常的方法 和处理异常的方法。
2.抛出异常的方法
- 在方法体内使用throw抛出异常:throw 由异常类产生的对象;
- 在方法头部添加throws抛出异常:
[修饰符] 返回值类型 方法名([参数列表]) throws 异常列表{ … … }
由上述两种方式抛出异常,在该方法内就不必提供try-catch-finally 块去处理异常,有调用者的程序处理。
3.处理异常的方法
1.如果程序设计者调用了一个会抛出异常的方法,要么处理这个异常,要么将异常继续抛出。
示例1:方法内部抛出异常、处理异常
package ch09; public class Demo{ public static void main(String[] args){ int a=5,b=0; try{ if(b==0) throw new ArithmeticException(); //抛出异常 else System.out.println(a+"/"+b+"="+a/b); }catch(ArithmeticException e){ //方法内处理异常 System.out.println("异常:"+e+" 被抛出了!"); e.printStackTrace(); } } }
示例2:
package ch09; public class Demo{ public static double multi(int n){ if(n<0) //该方法将抛出非法参数异常 throw new IllegalArgumentException("求负数阶乘异常"); double s=1; for(int i=1;i<=n;i++) s=s*i; return s; } public static void main(String[] args){ try{ int m=Integer.parseInt(args[0]); System.out.println(m+"!="+multi(m)); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("命令行中没提供参数!"); }catch(NumberFormatException e){ System.out.println("应输入一个【整数】!"); }catch(IllegalArgumentException e){ //main方法捕获并处理非法参数异常 System.out.println("出现的异常是:"+e.toString()); }finally{ System.out.println("程序运行结束!!"); } } }
示例3:
package ch09; public class Demo{ static void check(String str1) throws NullPointerException{ if(str1.length()>2){ str1=null; System.out.println(str1.length()); //将抛出空指针异常 } char ch; for (int i=0;i<str1.length();i++){ ch=str1.charAt(i); if(!Character.isDigit(ch)) throw new NumberFormatException(); } } public static void main(String[] args) throws Exception{ int num; try{ check(args[0]); num=Integer.parseInt(args[0]); if (num>60) System.out.println("成绩为:"+num+" 及格"); else System.out.println("成绩为:"+num+" 不及格"); }catch(NullPointerException e){ System.out.println("空指针异常:"+e.toString()); }catch (NumberFormatException ex){ System.out.println("输入的参数不是数值类型"); }catch (Exception e){ System.out.println("命令行中没有提供参数"); } } }
2.由方法抛出的异常交给系统处理(需要明确Java对异常强制检查要求的知识)
- Java 对 Exception 类中的异常可分为受检查型异常和非检查型异常两大类。
- 所有非检查型异常都是RuntimeException类的子类,Java编译器对非检 查型异常不要求进行捕获和处理也能通过编译;而对不是RuntimeException类子类的异常则都是受检查型异常,即如方法 抛出这类异常,调用者必须处理该异常。
- 对于受检查型异常,如果调用者不处理,则必须在最后的 main 方法中将 异常提交给系统。
示例1:异常最后由main方法提交给系统 package ch09; import java.io.FileInputStream; import java.io.IOException; public class Demo{ public static void main(String[] args) throws IOException{ //删掉异常将不能通过编译 FileInputStream fis=new FileInputStream("12.txt"); } }
示例2:
package ch09; import java.io.*; import java.util.Scanner; public class Demo{ public static void main(String[] args) throws IOException{ String str; //以下注释部分用Scanner方式替代 //BufferedReader buf; //buf=new BufferedReader(new InputStreamReader(System.in)); Scanner sc=new Scanner(System.in); while (true){ try{ System.out.print("请输入字符串:"); //str=buf.readLine(); str=sc.nextLine(); if(str.length()>0) break; else throw new IOException(); }catch (IOException e){ System.out.println("必须输入字符串!!"); continue; } } String s=str.toUpperCase(); System.out.println("转换后的字符串为:"+s); sc.close(); } }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/52207.html