Exception子类的继承关系 Exception ClassNotFoundException ClassNotSupportedException IllegalAccessException InstantiationException InterruptedException NoSuchMethodException RuntimeException ArithmeticException ArrayStoreException ClassCastException IllegalArgumentException
Exception子类(续) IllegalThreadStateException NumberFormatException IllegalMonitorStateException IndexOutOfBoundsException ArrayIndexOutOfBoundsException StringIndexOutOfBoundsException NegativeArraySizeException NullPointerException SecurityException
13周-上机作业1 设计一个java程序,有数组a()={10,20,30,40,50};b()={0,2,30};求数组c()=a[i]/b[i],i=0-4.请处理此程序所发生的任何异常(ArrayIndexOutofBoundsException) (ArithemeticException)
1关于异常的含义,下列描述正确的是 A 程序编译错误 B 程序语法错误 C 程序自定义的异常 D 程序编译或者运行时发生的异常事件 D
A 5 对于try和catch子句的排列方式,下列哪一项是正确的? A 子类异常在前,父类异常在后 B 父类异常在前,子类异常在后 D 父类异常和子类异常不能同时出现在同一个类中 A
使用null对象引用方法或变量将产生该异常 7 关于java语言中常用的异常类的说法,错误的一个是 A在不合法的数学运算发生时,会出现ArithmeticException类异常 B 如果字符串转换成数字,需要准备处理NumberFormatException异常 C 如果使用非法的索引值来访问数组,ArrayIndexOutOfBoundsException异常会被抛出 D如果指针变量为空,NullPointException异常就会被抛出 D Java中没有指针 使用null对象引用方法或变量将产生该异常
C public class test14 { public static void main(String[] args) { int x=0; int y=2/x; int z[]={1,2,4,6}; int p=z[4]; } 14 运行下列程序,将产生什么异常? A ArrayIndexOutOfBoundsException B NumberFormatException C ArithmeticException D ArithmeticException和ArrayIndexOutOfBoundsException C
抛出异常语句 通常情况下,异常是由系统自动捕获的。但程序员也可以自己通过throw语句抛出异常。throw语句的格式为: throw new 异常类名(信息) 其中异常类名为系统异常类名或用户自定义的异常类名,“信息”是可选信息。如果提供了该信息,toString()方法的返回值中将增加该信息内容。
【任务8-3】抛出异常 注意异常类型的捕获顺序 public class Deposit { public static double discount(int n) { if (n<0){ throw new IllegalArgumentException("n应该为正整数");} return n*0.08; } public static void main(String args[]){ try { int i=Integer.parseInt(args[0]); System.out.println("用户消费"+i+"元,可优惠"+discount(i)+"元"); catch(ArrayIndexOutOfBoundsException e1){ System.out.println("异常:没有输入参数"); catch(NumberFormatException e2){ System.out.println("异常:参数不能转换为整型"); catch (IllegalArgumentException e3){ System.out.println("自定义异常:"+e3.toString()); finally{ System.out.println("程序结束"); }}} 【任务8-3】抛出异常 注意异常类型的捕获顺序
异常:没有输入参数 程序结束 异常:参数不能转换为整型 程序结束 自定义异常:java.lang.IllegalArgumentException: n应该为正整数 程序结束 用户消费800元,可优惠64.0元 程序结束
抛出异常选项 在有些情况下,一个方法并不需要处理它所生成的异常,而是向上传递,由调用该方法的其他方法来捕获该异常,这时就要用到throws子句。 为了明确指出某方法不捕获某类异常,而让调用该方法的其他方法捕获该类异常,可以在申明该方法的时候,使用throws语句 其格式如下: 返回类型 方法名([参数表]) throws 异常类型名 { 声明部分 }
举例:考试过程异常情况 监考老师处理不了怎么办? 举例:考试过程异常情况 监考老师处理不了怎么办? 向上级报告! 在java中 :抛出异常 自己不处理,由调用它的函数来处理 public static double discount(int n) { if (n<0){ throw new IllegalArgumentException("n应该为正整数");} return n*0.08; }
自定义异常类 自定义异常类可以通过继承Exception类来实现。其一般形式为: { 异常类体; } class 自定义异常类名 extends Exception { 异常类体; }
【任务8-4】在程序中自定义一个异常 类并使用它 【任务8-4】在程序中自定义一个异常 类并使用它 import javax.swing.JOptionPane; class PasswdException extends Exception{ PasswdException(){ System.out.println(" 密码不能小于六位"); } public class Passwd { public static int x=10000; public static boolean checkpasswd(String passwd) throws PasswdException{ if(passwd.length()<6){ throw new PasswdException(); else return true; //main函数 密码不能小于六位 ch8.eg8_4.PasswdException 程序结束 密码已经设置 程序结束
public static void main(String args[]){ try{ String passwd =JOptionPane.showInputDialog(" 请设置初始密码"); checkpasswd(passwd); System.out.println("密码已经设置"); } catch(PasswdException e){ System.out.println(e); finally{ System.out.println("程序结束");
该任务中自己定义了一个异常如下: class PasswdException extends Exception{ PasswdException(){ System.out.println(" 密码不能小于六位"); }
综合演示:使用已有的bank1类自定义异常并使用 步骤 1:创建异常类OverDrawnException———当取出钱后余额小于10的情况。 该类继承Excoption类,并覆盖该类的public String toString ()方法,返回提示信息 “余额不能为负数” 2: 创建异常类DepositException———当无效钱数(小于0)存入时。 该类继承Excoption类,并覆盖该类的public String toString ()方法,返回提示信息“存入款项不能为负数” package ch6.ex6_8; public class Bank { String countNo; //帐号 String address;//地址 double balance;//余额 static double min=10;//最小存款 String name;//储户姓名 Bank (String aCountNo,String aName,String aAddress,double aBalance){ countNo=aCountNo; name=aName; balance=aBalance; address=aAddress; } // 存款 void save(double num){ balance=balance+num; // 取款 boolean take(double num){ if ((balance-num)<min){ return false; }else { balance=balance-num; return true; // 查询 double query(){ return balance; public static void main(String[] args){ Bank b1=new Bank("001","张三","天源路789号",200); b1.save(90.00); System.out.println(b1.query()); if (b1.take(290)) else System.out.println("取款不成功,最小保留"+Bank.min+"元"); 提示:take方法要求返回boolean值的语句应该放在catch语句的最后
3 在Bank1类的boolean take(double num)方法中,如果发现(余额-num<=10) 则抛出一个OverDrawnException,并在take方法在进行捕获,捕获后打印异常的toString返回的信息 4 在void save(double num)方法中,发现num小于0,则抛出一个DepositException异常,并在方法头中申明take方法自身不处理该异常,由调用它的函数处理(提示:TestBank1类的main函数处理) 5 写一个测试程序,写代码实现下列过程: 新建一个帐户,开户信息为【“001”,“张三”,“天源路789号”,200】, 存入90元,再存入-90元,取款290元。 捕获所有可能发生异常
14周上机作业1 处理备注中 计算器 中所有可能出现的异常。 1:输入的操作数为字符串的异常 2: 第二个操作数为0时候出现的算数异常 2: 第二个操作数为0时候出现的算数异常 3:自定义异常类ex1:如果第一个操作数大于100认为是一种越界异常, 写一个方法去判断,如果发现该异常,则抛出一个ex1类的异常对象,由main函数去捕获 import java.awt.*; implements ActionListener public class work2 extends Frame import java.awt.event.*; static Button but1 ,but2,but3,but4; static TextField txt1,txt2,txt3; { this.setLayout(new GridLayout(4,2)); this.setBounds(300, 200, 300, 200); work2(){ txt2=new TextField(25); this.add(txt1); txt1=new TextField(25); but2=new Button("-"); but1=new Button("加"); this.add(txt2); this.add(but1); but4=new Button("/"); but3=new Button("*"); this.add(but4); this.add(but3); this.add(but2); but3.addActionListener(this); but2.addActionListener(this); but1.addActionListener(this); this.add(txt3); txt3=new TextField(25); but4.addActionListener(this); public static void main(String[] args) { } this.setVisible(true); new work2(); public void actionPerformed(ActionEvent arg0) { @Override // TODO Auto-generated method stub int a=Integer.parseInt(txt1.getText()); if (arg0.getSource()==but1){ int b=Integer.parseInt(txt2.getText()); ; txt3.setText(tmp); String tmp=String.valueOf(c); int c=a+b; if (arg0.getSource()==but2){ int c=a-b; if (arg0.getSource()==but3){ int c=a*b; if (arg0.getSource()==but4){ int c=a/b;
2抛出异常时,应该使用哪个子句 A throw B catch C finally D throws A
3自定义异常时,可通过对下列哪一项进行继承? A Error类 B Applet类 C Exception类 D AssertionError类 C
4 当方法产生该方法无法确定如何处理的异常时,应该如何处理? A 申明异常 B 捕获异常 C 抛出异常 D 嵌套异常
public static void main(String[] args) { method (); } public class test6 { public static void main(String[] args) { method (); } static void method() throws Exception { try { System.out.println("test6"); finally { System.out.println("finally"); 6 对下面程序描述正t确的是 A 代码编译成功,输出test和finally B 代码编译成功,输出test C 代码实现选项A的功能,之后Java停止运行,抛出异常,但是不进行处理 D 代码不能编译通过 D
A 在catch代码段中可以使用return语句返回到异常抛出点 B 异常机制可以用于流程控制 15 下列描述正确的是 A 在catch代码段中可以使用return语句返回到异常抛出点 B 异常机制可以用于流程控制 C catch(Exception e)可以捕获异常的任何类型 D 程序发生异常时,如无法进行合适的异常处理,则该程序恢复正常运行 C
8.5习题 一、选择题 1.下列描述正确的是( ) A) 在catch代码段中可以使用return语句返回到异常抛出点 1.下列描述正确的是( ) A) 在catch代码段中可以使用return语句返回到异常抛出点 B) 异常机制可以用于流程控制 C) catch(Exception e)可以捕获异常的任何类型 D) 程序发生异常时,如无法进行合适的异常处理,则该程序恢复正常运行 2.关于异常的含义,下列描述正确的是( ) A) 程序编译错误 B) 程序语法错误 C) 程序自定义的异常 D) 程序编译或者运行时发生的异常事件 3.抛出异常时,应该使用哪个子句( ) A) throw B)catch C)finally D)throws
4.自定义异常时,可通过对下列哪一项进行继承?( ) A) Error类 B) Applet类 C) Exception类 D) AssertionError类 5.当方法产生该方法无法确定如何处理的异常时,应该如何处理?( ) A) 声明异常 B) 捕获异常 C) 抛出异常 D) 嵌套异常 6.对于try和catch子句的排列方式,下列哪一项是正确的?( ) A)子类异常在前,父类异常在后 B)父类异常在前,子类异常在后 C) 只能有子类异常 D)父类异常和子类异常不能同时出现在同一个类中
二、填空题 1.异常类的最上层为 类,此类又有两个子类: 和 。 2.Java在执行时期的错误处理功能,称为 。 3.Java由内部系统所产生的错误,称为 ,由程序本身或环境所产生的错误,称为 。 4.处理异常分为两种情况,捕获异常和 。 三、简答题: 1、为什么要有自定义异常? 2、java程序中如何处理多种异常?