Throwable(异常根类) | Error(错误) | VirtualMachineError 虚拟机错误 | |
OutOfMemoryError内存溢出 | |||
ThreadDeath线程死锁 | |||
Exception(异常) |
RuntimeException(运行时异常) |
NullPointerException(空指针异常) | |
ClassCastException(类型转换异常) | |||
ArraylndexOutOfBoundException (下标越界异常) |
|||
ArithmeticException(算数异常) | |||
Checked Exceptions(检查异常) |
IOException(IO异常) | ||
SQLException(SQL异常) |
代码形式:
try{ //代码段1 //产生异常的代码段2 }catch(异常类型 ex){ //对异常进行处理的代码段3 }finally{ //代码段四 }
import java.util.InputMismatchException; import java.util.Scanner; public class TryDemoOne { /** * 多重catch语句,与执行顺序有关,当捕获到了一个异常时,剩下的catch语句就不再进行匹配。 * @param args */ public static void main(String[] args) { // 要求:定义两个整数,接受用户的键盘输入,输出两数之商 Scanner input=new Scanner(System.in); try{ System.out.print("请输入第一个整数:"); int one=input.nextInt(); System.out.print("请输入第二个整数:"); int two=input.nextInt(); System.out.println("one和two的商是:"+ (one/two)); }catch(ArithmeticException e){ System.exit(1);//终止程序运行 System.out.println("除数不允许为零"); e.printStackTrace();//打印错误的描述、类型、位置 }catch(InputMismatchException e){ System.out.println("请输入整数"); e.printStackTrace(); }catch(Exception e){ System.out.println("出错啦~~"); e.printStackTrace(); }finally{//无论是否有异常,都会执行finally的语句块 System.out.println("=====运算结束====="); } } }
public void method()throws Exception1,Exception2,....,ExceptionN{ //可能产生异常的代码 }
实例:
import java.util.InputMismatchException; import java.util.Scanner; public class test { public static void main(String[] args) { try{ int result = test(); System.out.println("one和two的商是:" + result); }catch(ArithmeticException e){ }catch(InputMismatchException e){ }catch(Exception e){ } int result2=test(); } /*通过throws抛出异常时,针对可能出现的多种异常情况,解决方案: * 1、throws后面接多个异常类型,中间用逗号分隔 * 2、throws后面接Exception * */ /** * 测试接收数据相除结果的方法 * @return 两个接收数据的商 * @throws ArithmeticException * @throws InputMismatchException */ public static int test() throws ArithmeticException,InputMismatchException{ Scanner input = new Scanner(System.in); System.out.println("=====运算开始====="); System.out.print("请输入第一个整数:"); int one = input.nextInt(); System.out.print("请输入第二个整数:"); int two = input.nextInt(); System.out.println("=====运算结束====="); return one / two; } }
实例:
import java.util.Scanner; public class TryDemoFour { public static void main(String[] args) { // TODO Auto-generated method stub try { testAge(); } catch (HotelAgeException e) { System.out.println(e.getMessage()); System.out.println("酒店前台工作人员不允许办理入住登记"); }catch(Exception e){ e.printStackTrace(); } } /* * throw抛出异常对象的处理方案: * 1、通过try..catch包含throw语句--自己抛自己处理 * 2、通过throws在方法声明出抛出异常类型--谁调用谁处理--调用者可以自己处理,也可以继续上抛 * 此时可以抛出与throw对象相同的类型或者其父类 */ //方法1:自己处理异常 // 描述酒店的入住规则:限定年龄,18岁以下,80岁以上的住客必须由亲友陪同 /*public static void testAge() { try { System.out.println("请输入年龄:"); Scanner input = new Scanner(System.in); int age = input.nextInt(); if (age < 18 || age > 80) { throw new Exception("18岁以下,80岁以上的住客必须由亲友陪同"); } else { System.out.println("欢迎入住本酒店"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }*/ //方法2:方法调用处去处理异常 public static void testAge() throws HotelAgeException { System.out.println("请输入年龄:"); Scanner input = new Scanner(System.in); int age = input.nextInt(); if (age < 18 || age > 80) { //throw new ArithmeticException(); //throw new Exception("18岁以下,80岁以上的住客必须由亲友陪同"); throw new HotelAgeException(); } else { System.out.println("欢迎入住本酒店"); } } }
1. 使用Java内置的异常类可以描述在编程时出现的大部分异常情况。
2. 也可以通过自定义异常描述特定业务产生的异常类型。所谓自定义异常,就是定义一个类,去继承Throwable类或者它的子类。
public class HotelAgeException extends Exception { public HotelAgeException(){ super("18岁以下,80岁以上的住客必须由亲友陪同"); } } class SubException extends HotelAgeException{ }
public class test { public static void main(String[] args) { // TODO Auto-generated method stub try { testAge(); } catch (HotelAgeException e) { System.out.println(e.getMessage()); System.out.println("酒店前台工作人员不允许办理入住登记"); }catch(Exception e){ e.printStackTrace(); } } public static void testAge() throws HotelAgeException { System.out.println("请输入年龄:"); Scanner input = new Scanner(System.in); int age = input.nextInt(); if (age < 18 || age > 80) { //throw new ArithmeticException(); //throw new Exception("18岁以下,80岁以上的住客必须由亲友陪同"); throw new HotelAgeException(); } else { System.out.println("欢迎入住本酒店"); } } }
1、异常链:有时候我们会捕获一个异常后再抛出另一个异常,将异常发生的原因一个传一个串起来,即把底层的异常信息传给上层,逐层抛出,这就是异常链。
2、抛出最上层异常时仍旧保留底层异常信息的方法:
1)可以调用Throwable(String message,Throwable cause)的构造方法来保留底层异常的异常信息
2)或者采取"Throwable对象.initCause(Throwable cause) "的方法用来获取原始异常的描述信息,其中cause是原始异常的对象
public class TryDemoFive { public static void main(String[] args) { // TODO Auto-generated method stub try { testThree(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void testOne() throws HotelAgeException { throw new HotelAgeException(); } public static void testTwo() throws Exception { try { testOne(); } catch (HotelAgeException e) { throw new Exception("我是新产生的异常1",e); } } public static void testThree() throws Exception { try { testTwo(); } catch (Exception e) { Exception e1=new Exception("我是新产生的异常2"); e1.initCause(e); throw e1; // throw new Exception("我是新产生的异常2",e); } } }
原文:https://www.cnblogs.com/haifeima/p/13050241.html