异常

1.异常

public class Demo1 {
    /*
    异常体系
    Throwable是所有异常的祖师爷

    Error :不需要处理,处理不了此异常

    Exception:程序员能处理的异常
    Exception分为两种,一种是运行时异常,一种是编译时异常
    */


    public static void main(String[] args) {
        int[] arr={10,20,30};
        try{
            System.out.print(arr[3]);
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
            System.out.println("报错了:"+e.getMessage());
        }
    }
}

代码2:

public class Demo1 {

    public static void main(String[] args) {

        System.out.println("this is main");
        show2();
        System.out.println("this is main2");

    }

    public static void show2(){
        show();
    }

    public static void show(){
        System.out.println("this is show");
        int[] arr = {20,30};
        try{
            System.out.println(arr[3]);
        }catch(ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
        }

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

输出

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=6660:D:\idea\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\idea\day07\out\production\optest;C:\Users\Administrator.PC-201911081504\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator.PC-201911081504\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.atguigu.day14.Demo1
this is main
this is show
java.lang.ArrayIndexOutOfBoundsException: 3
    at com.atguigu.day14.Demo1.show(Demo1.java:37)
    at com.atguigu.day14.Demo1.show2(Demo1.java:30)
    at com.atguigu.day14.Demo1.main(Demo1.java:24)
game over
this is main2

Process finished with exit code 0

代码3:

import java.util.Scanner;

public class Demo2 {
    /*
    异常处理:
           两种方案
           1.try{}catch(){}
           2.throw throws抛出异常

    注意:
        1.变量的作用域
          try中声明的变量仅仅在try中有效
        2.当发生异常后,try语句块内异常下面的代码不再执行,进入catch内,处理异常,进行try{}catch{}下的内容
        3.如果没有发生异常,则不会执行catch中的内容
        4.如果发生了没有捕获声明的异常,则程序立即终止,不会继续向下执行
        5.当try语句块代码可能发生多个异常时,我们可以声明多个异常
           5.1 catch(异常类型|异常类型|异常类型 标识符){}
           5.2 多重catch try{}catch(异常类型1 标识符){}catch(异常类型2 标识符){}

    */

    public static void main(String[] args) {
        double score[] = new double[2];
        double sum=0;

        try {
            System.out.println(score[3]);
            Scanner sc1 = new Scanner(System.in);
            for (int i = 0; i < score.length; i++) {
                System.out.println("input your " + (i + 1) + " num:");
                double s = sc1.nextDouble();
                score[i] = s;
                sum += s;
            }
        }catch (Exception e){
            System.out.println("出现了异常"+e.getMessage());
        }
        System.out.println("第一个学生的成绩:"+score[0]+"总分:"+sum+" 平均分:"+sum/score.length);
    }
}

输出

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=7333:D:\idea\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\idea\day07\out\production\optest;C:\Users\Administrator.PC-201911081504\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator.PC-201911081504\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.atguigu.day14.Demo2
出现了异常3
第一个学生的成绩:0.0总分:0.0 平均分:0.0

Process finished with exit code 0
注意:
1.在程序没有发生异常时,有return语句,要先执行finally再执行返回操作
2.在catch语句块内进行return,那么也要先执行finally再执行返回操作
3.如果在finally中存在return,那么无论前面在哪个位置有return,都会返回finally中的return值

代码4
import java.io.File;
import java.io.FileNotFoundException;

public class Demo3 {
    /*

    处理异常方式2
     通过throw抛
           throw new 异常的类型(自定义异常的输出信息)

     System.err.println(); //红颜色输出信息,位置可能会颠倒
    */

    public static void main(String[] args) {
        show(5);
        try{
            showMessage();
        }catch(FileNotFoundException e){
            System.out.println(e.getMessage());
        }

    }

    public static void show(int x){
        int[] arr = {10,20,30};
        if(x<0 || x>arr.length){
            throw new ArrayIndexOutOfBoundsException("数组下标越界了"+x);
        }
    }

    public static void showMessage() throws FileNotFoundException{
        File file= new File("xxxxxxxx");
        boolean exist=file.exists();
        if(!exist){
            throw new FileNotFoundException("文件不存在");
        }
        System.out.println(exist);
    }
}

输出

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=10523:D:\idea\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\idea\day07\out\production\optest;C:\Users\Administrator.PC-201911081504\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator.PC-201911081504\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.atguigu.day14.Demo3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 数组下标越界了5
    at com.atguigu.day14.Demo3.show(Demo3.java:33)
    at com.atguigu.day14.Demo3.main(Demo3.java:21)

Process finished with exit code 1

练习代码5:

public class Demo4 {

    private String account;
    private int balance;

    public Demo4() {
    }

    public Demo4(String account, int balance) {
        this.account = account;
        this.balance = balance;
    }

    public void quMoney(int money){
        if(money<0){
            throw new IllegalArgumentException("取款金额不能为负数"+money);
        }
        if (money>balance){
            throw new UnsupportedOperationException("取款金额不足,不支持当前操作");
        }
        balance-=money;
    }

    public void saveMoney(int money){
        if(money<0){
            throw new IllegalArgumentException("存款金额,不能为负数:"+money);
        }
        balance+=money;
    }

    public static void main(String[] args) {
        Demo4 d4= new Demo4("1233455",10000);
        try{
            //d4.quMoney(-90);
            d4.saveMoney(-20);
        }catch (Exception e){
            e.printStackTrace();
            e.getMessage();
        }
        System.out.println("game over");
    }
}

输出

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\idea\IntelliJ IDEA 2019.2.3\lib\idea_rt.jar=12144:D:\idea\IntelliJ IDEA 2019.2.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;D:\idea\day07\out\production\optest;C:\Users\Administrator.PC-201911081504\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\Administrator.PC-201911081504\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.atguigu.day14.Demo4
java.lang.IllegalArgumentException: 存款金额,不能为负数:-20
    at com.atguigu.day14.Demo4.saveMoney(Demo4.java:28)
    at com.atguigu.day14.Demo4.main(Demo4.java:37)
game over

Process finished with exit code 0

代码6

public class Demo5 {
    /*
    方法重写:
    1.权限修饰符不能比父类更严格
    2.返回值类型
      基本类型数据必须与父类保持一致
      引用类型数据可以是父类也可以是父类的孩子
      形参列表必须保持一致
      子类不能返回比父类更大的异常
    */


    public static void main(String[] args) throws Exception {
        Father f = new Son();
        try{
            f.show();
        }catch ( ArrayIndexOutOfBoundsException e){
            e.getMessage();
        }
    }

}

class Father{
    public void show() throws Exception{
        System.out.println("father show");
    }
}
class Son extends Father{
    @Override
    public void show() throws ArrayIndexOutOfBoundsException{
        System.out.println("son show");;
    }
}

代码7

package com.atguigu.day14;



public class Demo6 {
    /*
    自定义异常的步骤
    1.新建一个类
    2.继承一个异常类
    3.添加构造器
    */
    public static void main(String[] args) {
    try {
        Person p1 = new Person("linzi", "woman", 160);
        System.out.println(p1.toString());
    }catch (Exception e){
        e.printStackTrace();
        e.getMessage();

    }
    }
}

class SexException extends IndexOutOfBoundsException{
    public SexException() {
    }

    public SexException(String s) {
        super(s);
    }
}
class AgeException extends ArrayIndexOutOfBoundsException{
    public AgeException() {
    }

    public AgeException(String s) {
        super(s);
    }
}
class Person{
    String name;
    String gender;
    int age;

    public Person() {
    }

    public Person(String name, String gender,int age) {
        this.name = name;
        this.setGender(gender);
        this.setAge(age);
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) throws AgeException{
        if(age<150 && age>0){
        this.age = age;
        }else {
           throw new AgeException("年龄不对"+age);
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) throws SexException{
        if(gender.equals("woman")||gender.equals("man")){
        this.gender = gender;
        }else {
            throw new SexException("没有这个性别"+gender);
        }
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                '}';
    }
}

代码8

原文地址:https://www.cnblogs.com/hbxZJ/p/15679535.html