【异常处理】

    xiaoxiao2022-07-07  216

    一、异常处理

          异常处理即就是判断错误,并把错误打印出来。

          对于程序Caculate1,用户在使用时常出现三种异常:① 没有在控制台输入命令行参数;②  输入的两个命令行参数不为数字类;③输入的数字类除数为零,不满足运算规则。程序员在收到用户反馈时,就必须改写和处理异常。

    public class Caculate1 { /** * 对两个数求商 * @param args */ public static void main(String[] args) { String num1 = args[0]; String num2 = args[1]; int n1 = Integer.parseInt(num1); int n2 = Integer.parseInt(num2); System.out.println((double) n1 / n2); } }

        处理异常后的代码满足客户的需求,但代码行数过多,布局和逻辑也过于冗杂,不建议程序员为了处理异常而写异常。 

    package edu.xalead; //判断错误 并把错误打印出来 public class Caculate { /** * 对两个数求商 * @param args */ private static boolean isNum(String num){ for(int i=0;i<num.length();i++){ //遍历数组 char t = num.charAt(i); // 把数组中的每一个元素取出来 if(t<48 || t>57){ // 比较 看是否为数字0-9 return false; } } return true; } public static void main(String[] args) {// String[] args 接受命令行参数 if(args !=null && args.length>=2) { String num1 = args[0]; String num2 = args[1]; if(isNum(num1) && isNum(num2)) { // 满足必须为数字 //包装类 把字符串转换为整数类 int n1 = Integer.parseInt(num1); int n2 = Integer.parseInt(num2); if(n2!=0) System.out.println((double) n1 / n2); else{ System.err.println("除数不能为零"); } }else{ System.err.println("两个参数必须为数字"); } }else { System.err.println("必须有命令行参数,且参数必须为两个");; } } }

    二、常见异常

       1、空指针异常

          解决方法:对数组进行实例化

    package edu.xalead; public class 常见异常 { public static void main(String[] args) { //空指针异常 String s = null; //String s = "gzdhfxngm"; //new 字符串 System.out.println(s.length()); String[] ss = new String[100]; //100个引用 保存地址 for(int i=0;i<ss.length;i++){ ss[i] = new String("gszvgkmnbvhjkvctgh"); //实例化异常 System.out.println(ss[i].length()); } } }

     

        2、类型转换异常

               解决方法: 转换时要注意类型匹配,例如多态、继承中,要调用子类继承父类或子类重写的方法.

    package edu.xalead; public class Animal { } package edu.xalead; public class Bird extends Animal { public void out(){ System.out.println("dbxhnx "); } } package edu.xalead; public class Fish extends Animal { public void in(){ System.out.println("szdxfckgvhlmn"); } } package edu.xalead; public class 常见异常2 { /** * ClassCastException: 类型转换异常 Cast(转换) * @param args */ public static void main(String[] args) { //类转换异常 Animal a = new Bird(); ((Bird) a).out(); a = new Fish(); ((Fish) a).in(); ((Bird) a).out();//a保存的时鱼的地址 没有out方法 } }

     

     3、数字化异常

         对于Caaulate中两个数相除,除数不能为0就属于数字化异常。

        解决方法:遵循数学计算规则.

    三、异常处理的方法

        1、try  ... catch ...方法

    package edu.xalead; import java.io.FileNotFoundException; import java.io.FileOutputStream; //虚拟机认识的异常 Java捕获异常 public class Caculate1 { public static void main(String[] args) { //封装异常对象 String num1 = args[0]; String num2 = args[1]; int n1 = Integer.parseInt(num1); int n2 = Integer.parseInt(num2); System.out.println((double) n1 / n2); //受控异常 非运行时异常 逼的程序员不得不改异常 try { FileOutputStream fout = new FileOutputStream("C:/aa.txt"); } catch (FileNotFoundException e) { e.printStackTrace(); } // catch(Exception e){ //Throwable object 不是异常类 // e.printStackTrace(); // } // catch(ArrayIndexOutOfBoundsException e){ //数组越界异常 数组越界捕获 // // System.out.println(e); 异常消息少 // e.printStackTrace(); //打印异常信息 打印栈帧信息 // }catch(NumberFormatException e){ //数字化异常 // e.printStackTrace(); // }catch(ArithmeticException e){ //数学异常 // e.printStackTrace(); // } /** * object * Throwable * Error(不能解决的异常,如:虚拟机异常) Exception(可处理的异常) * RuntimeException(运行时异常 非受控异常) 非运行时异常 */ } }

     

     在Java中,所有异常类的父类是Throwable类,Error类是error类型异常的父类,Exception类是exception类型异常的父类,RuntimeException类是所有运行时异常的父类,RuntimeException以外的并且继承Exception的类是非运行时异常。

       2、throw 方法  抛掷异常

            通过构造自定义异常

    package edu.xalead; public class 抛出关键字 { //运行时异常 public static void main(String[] args) { try { String num1 = args[0]; String num2 = args[1]; int n1 = Integer.parseInt(num1); int n2 = Integer.parseInt(num2); if(n2==5){ //System.err.println("除数不能为5"); throw new RuntimeException("除数不能为5"); //通过构造自定义异常消息 } System.out.println((double) n1 / n2); } catch (NumberFormatException e) { e.printStackTrace(); } } }

     

     

     

     

     

     

     

     

    最新回复(0)