java异常学习整理

java 异常
体系结构:
java.lang.Object
|---java.lang.Throwable
|---java.lang.Error 错误。java程序对此无能为力,不显示的处理
|---java.lang.Exception 异常。需要进行处理
|---RuntimeException 运行时异常
|---ArrayIndexOutOfBoundsException 数组下标越界异常 NullPointerException 空指针异常 ArithmeticException 算术异常 ClassCastException 类型转换异常
|---非RuntimeException 编译时异常


导致异常的可能原因:
客户输入数据化的格式
读取的文件是否存在
网络是否始终保持畅通


Java程序在执行过程中所发生的异常事件可分为两类:
Error:Java虚拟机无法解决的严重问题,如JVM系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
如:空指针访问
试图读取不存在的文件
网络连接中断


异常的解决方法:1.终止运行
2.编写时,考虑到错误的检测,错误消息的提示,以及错误的处理。


分类:编译时异常:执行javac.exe命令时
 运行时异常:执行java.exe时


编写的是.java 文件 ,通过编译(javac命令)生成字节码文件(.class)再运行(java命令)生成结果


当执行一个程序时,若出现异常,则异常之后的代码不再执行了


异常的处理 代码详见HandleException
java采用异常处理机制,将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简介,并易于维护


Java提供的是异常处理的 抓抛模型
1.抛
2.抓:抓住上一步抛出来的异常类的对象,如何抓,即为异常处理的方式
java提供了两种方式用来处理一个异常类的对象
方式一:
try{
可能出现异常的代码
}catch(Exception1 e){
处理的方式1
}catch(Exception2 e){
处理的方式2
}
finally{
一定要执行的代码
}
注:
1.try中声明的变量相当于局部变量,出了try语句就没有作用了
2.catch语句内部是对异常对象的处理,有两种方法
getMessage()或者 printStackTrace()
3.finally是可选的,可有可无,按需选择
4.可以有多个catch语句,try中抛出的异常类对象从上往下去匹配catch中的异常类的类型,一旦满足就执行catch中的代码,执行完,就跳过后面的多条catch语句

5.如果异常处理了,后面的代码继续执行


下面是一些测试代码,仅供参考

package exception;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * author:kangshengjie
 * date:2017/7/7
 * 处理异常
 * Java提供的是异常处理的 抓抛模型
 * 1.抛:当我们执行代码时,一旦出现异常,就会在异常的代码处生成一个对应的异常类型的对象,并将此对象抛出。
 *    一旦抛出此异常类的对象,那么程序就终止执行
 *    此异常类的对象抛给方法的调用者。
 * 2.抓:抓住上一步抛出来的异常类的对象,如何抓,即为异常处理的方式
 *   java提供了两种方式用来处理一个异常类的对象
 *   try{
 *
 *   }catch(){
 *
 *   }
 */
public class HandleException {

    @Test
    public void test1(){
        Scanner s =new Scanner(System.in);
        try{
            int i = s.nextInt();
            System.out.println(i);
        }catch (InputMismatchException e){
            System.out.print("出现类型不匹配的异常了");
        }

    }

    //常见的运行时异常
    /**
     * 1.数组下标越界的异常
     * java.lang.ArrayIndexOutOfBoundsException
     */
    @Test
    public void test2(){
        try{
            int[] i =new int[10];
            System.out.println(i[10]);//只有0-9
        }catch (Exception e){
            System.out.print("出现异常");
//            e.printStackTrace();
        }

    }

    /**
     * 2.算术异常
     * java.lang.ArithmeticException: / by zero
     */
    @Test
    public void  test3(){
        try {
            int i=10;
            System.out.print(i/0);
        } catch (Exception e) {
//            e.printStackTrace();
            System.out.print(e.getMessage());
        }
    }

    /**
     * 3.类型转换异常
     * java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String
     */
    @Test
    public void test4(){
        try {

            Object obj = new Date();
            String str = (String)obj;
        } catch(ClassCastException e){
            //catch语句从上向下依次执行,一旦符合要求了,就不再进入其他catch
            System.out.println("类型转换异常");
        } catch(Exception e) {
//            e.printStackTrace();
            System.out.print("什么异常我都收");
        }
    }

    /**
     * 4.空指针异常
     *  java.lang.NullPointerException
     */
    @Test
    public void test5(){
//        Person p ;
//        p = null;
//        System.out.print(p.toString());

        try {
            String str = "aa";
            str = null;
            System.out.print(str.length());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    class Person{

    }

    /**
     * 编译时异常
     * (有异常未处理)
     */
    @Test
    public void test6 (){
        FileInputStream file = null;
        try{//异常处理
            file =new FileInputStream(new File("F:\\workspace\\hello.txt"));
            int b;
            while((b = file.read())!=-1){
                System.out.print((char)b);
            }
//            file.close();
        }catch(FileNotFoundException e){
            System.out.print(e.getMessage());
        }
        catch (IOException e){
            e.printStackTrace();
        }
        finally {
            try {
                file.close(); //流一定要关,所以放在了finally里卖弄
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值