0
点赞
收藏
分享

微信扫一扫

异常类


异常类分为:异常(Exception)和错误(Error),它们都继承Throwable父类。
用法:

try {
        // 有可能抛出异常的代码
    } catch (Exception e) {
        // 异常处理
    } finally {
        // 无论是否捕获到异常都会执行的程序
    }

Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能中止运行,例如JAVA虚拟机出现错误。在程序中不用捕获Error类型的异常。一般情况下,在程序中也不应该抛出Error类型的异常。

Exception是应用层面上最顶层的异常类,包含RuntimeException(运行时异常)和 Checked Exception(受检异常)。
——RuntimeException是一种Unchecked Exception,即表示编译器不会检查程序是否对RuntimeException作了处理,在程序中不必捕获RuntimException类型的异常,也不必在方法体声明抛出RuntimeException类。一般来说,RuntimeException发生的时候,表示程序中出现了编程错误,所以应该找出错误修改程序,而不是去捕获RuntimeException。常见的RuntimeException有NullPointException、ClassCastException、IllegalArgumentException、IndexOutOfBoundException等。
——Checked Exception是相对于Unchecked Exception而言的,Java中并没有一个名为Checked Exception的类。它是在编程中使用最多的Exception,所有继承自Exception并且不是RuntimeException的异常都是Checked Exception。JAVA 语言规定必须对checked Exception作处理,编译器会对此作检查,要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exception进行处理,不然不能通过编译。常用的Checked Exception有IOException、ClassNotFoundException等。

异常如果没有解决,会出现以下两种情况:
1. 当前线程会停止运行,异常触发点后面的代码将得不到运行。
2. 异常栈信息会通过标准错误流输出。

处理手段:
1)标准格式:try…catch…finally:捕获异常!

处理单个异常:
  try{
        //可能有很多行代码---->一旦有出现问题了
  }catch(异常类名 变量名){
    输出语句处理
  }

处理多个异常:
try{
                        可能会出现问题的多个语句
                    }catch(异常类名1 变量名){
                        输出语句处理
                    }catch(异常类名2 变量名){
                        输出语句处理
                    }

private static void method1() {
        //定义一个变量
        int a = 10 ;
        int b = 0 ;

        //第一个异常
        try {
            System.out.println(a/b);
        } catch (ArithmeticException e) {
            //输出语句处理
            System.out.println("除数不能为0");
        }

        //定义一个数组
        int[] arr = {1,2,3} ;
        try{
            System.out.println(arr[3]);
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("您访问了数组中不存在的索引");
        }

        System.out.println("over");
    }

2)throws 抛出异常

throws:抛出异常
        在方法声明上抛出异常,由于,编译时期异常,调用者必须要处理

private static void method2() throws Exception {
        int a = 10 ;
        int b = 0 ;
        if(b==0){
            System.out.println(a/b);
            throw new ArithmeticException() ;//跟的异常对象
        }else{
            System.out.println("不会出现问题");
        }
    }

    private static void method() throws ParseException {
        String str = "2017-11-19" ;

        //创建SimpleDataFormat对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;

        //解析
        Date d = sdf.parse(str) ;

        System.out.println(d);
    }

throws要比throw用的比较多,而try…catch…又比throws用的比较多!

捕获异常的标准格式: try…catch…finally
finally用在数据库IO流中,作用是释放资源。

final,finalize,和finally的区别?
 *          区别:
 *              final:表示最终的,终态的意思
 *              可以修饰类:类不能继承
 *              可以修饰成员方法:成员方法被重写
 *              可以修饰成员变量:此变量是一个常量   :自定义常量:  public static final int ORANGLE = 100 ;
 *              finalize:它表示通过gc垃圾回收器回收不用的对象或者是变量,System.gc():实质,调用的是重写了Object类中的
 * finalize()方法,表示回收没有跟多引用对象或者变量等等...
 *              finally:不能单独使用,和try...catch...finally中一块使用,(异常,IO,数据库中中使用的),是用来释放资源
 *                      finally中的代码一定会执行,并且除非Java虚拟机Jvm退出了,才不会执行!

public static void main(String[] args) {

        //String--->Date
        String s = "2014-5-20" ;

        //创建SimpleDateFormat对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;

        Date d = null ;

        try {
            d = sdf.parse(s) ;
            System.out.println("d:"+d);
        } catch (ParseException e) {
//          e.printStackTrace();
            System.out.println("解析出问题了...");
            System.exit(0) ;
        }finally{
            System.out.println("这里的代码一定会执行...");
        }

        System.out.println("over");
    }

如何自定义一个异常类?
自定义一个类,继承自Exception或者继承自RuntimeException

测试类
package Day17_Exception;

import java.util.Scanner;

/**
 * @author Aoman_Hao
 */
public class ExceptionTest {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个分数:");
        int num = sc.nextInt();

        Score  score= new Score();

            try{
                score.check(num);
            }
            catch(MyException s){
                System.out.println();
            }
//          finally{
//              System.out.println("正常输入");
//          }

    }

}

对象类
package Day17_Exception;
/**
 * @author Aoman_Hao
 */
public class Score  {
    public void check(int num)throws MyException{
    if(num>100&&num<0){
        //如果分数不对,抛出异常
        throw new MyException("分数异常,应该在0-100之前");
    }else{
        System.out.println("正常分数录入");
    }
}}

继承的类
package Day17_Exception;
/**
 * @author Aoman_Hao
 */
public class MyException extends Exception {
    public MyException(){

    }
    //提示用户错误类型(string语句)
    public MyException(String s){
        super(s);
    }

}


输出:
输入一个分数:
12
正常
正常输入

异常的注意事项:
* 1)子类在重写父类中的方法的时候,如果父类中方法有抛出异常,那么子类重写的这个方法,
* 抛出异常不能够比父类中该方法异常大,(要么是父类中该方法异常的子类)(最起码应该保存一致)(父亲坏了,儿子不能比父亲更坏)
* 2)子类继承父类,要重写父类中的方法的时候,如果本身父类中该方法没有异常,那么在子类中重写该方法的时候,不能抛出异常,只能捕获异常!


举报

相关推荐

0 条评论