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