JAVA学习第二十课(异常的应用和注意事项(三))

十、异常的应用

import java.util.Random;

import javax.rmi.CORBA.Stub;

/*
 *老师用电脑上课
 *用面向对象思考问题
 *问题设计两个对象
 *老师,电脑
 *
 *可能发生的问题:
 *电脑蓝屏、电脑冒烟
 */
class Lan extends Exception//蓝屏
{
	Lan(String problem)
	{
		super(problem);
	}
}
class Fir extends Exception//冒烟
{
	Fir(String problem)
	{
		super(problem);
	}
}
class No extends Exception
{
	No(String problem)
	{
		super(problem);
	}
}
class Computer
{//定义一个电脑运行的状态
	private int stu = 3; //stu为1正常,2是蓝屏,3是冒烟
	//stu = Random()%2+1;
	public void run()throws Lan,Fir
	{
		switch (stu)
		{
		case 2:
			throw new Lan("Computer is Lan!!!");
			//此处就不用break了,因为已经抛出了
		case 3:
			throw new Fir("Computer is Fir!!!");
		case 1:
			System.out.println("Computer is running");
			break;
		}

	}
	public void rest()//电脑重启
	{
		stu = 0;
		System.out.println("Computer is rest");
	}
}
class Teacher
{
	private String name = null;
	private Computer C;
	Teacher(String name)
	{
		this.name = name;
		C = new Computer();
	}
	public void lesson()throws Fir,No
	{
		try
		{
			C.run();
			System.out.println(name+" teacher is teaching");
		}
		catch(Lan a)
		{
			System.out.println(a.toString());//打印信息
			C.rest();
			lesson();
		}
		catch(Fir b)
		{
			System.out.println(b.toString());//打印信息
			test();
			//能处理的已经处理了,处理不了的继续向外抛
			//找人,对电脑进行维修,并告知学校并带原因,不告知,就是异常异常
			throw new No("课时无法进行,"+b.getMessage());

		}

	}
	public void test()//做练习
	{
		System.out.println("student is exciesing");
	}
}
public class Main
{
	public static void main(String[] args)
	{
		Teacher B = new Teacher("BLF2");
		try
		{
			B.lesson();
		}
		catch (Fir e)
		{
			System.out.println(".....");
		}
		catch (No e)
		{
			System.out.println(e.toString());

		}
		finally
		{//无论课上发生什么,但是还是会下课
			System.out.println("到点下课");
		}

	}
}

/*

* 异常的转换,也就叫异常的封装

* 数据库

* class Nosuess extends Exception

* {

*  .....//将异常转换,只需要告知出现异常

* }

* void adddata()throws Nosuess

* {

*  1.连接数据库

*  try

*  {

*  添加数据,出现异常  SQLException,但是添加数据的人不知道SQLException是什么

*  }

*  catch

*  {

*  内部处理

*  throw new Nosuess();

*  }

*  finally

*  {

*  关闭数据库

*  }

* }

* */

十一、异常的注意事项

(1).子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出子类的异常或者该异常的子类(见下述代码)

(2).如果父类抛出多个异常,那么子类只能抛出父类异常的子集

简单说:子类覆盖父类只能抛出父类的异常或者父类异常的子类或者子集

注意:如果父类的方法没有抛出异常,那么子类的覆盖时绝对不能抛

下述代码解释注意事项(1)

 class A extends Exception
{}
class B extends A
{}
class C extends Exception
{}
class FU
{
	void show()throws A
	{
	}
}
class Test
{
	void method(FU f)
	{
		try
		{
			f.show();
		}
		catch (A a)
		{

		}
	}
}
class ZI extends FU
{
	void show()throws A,B //也可以不抛,但是不可以抛出其他异常
	{}
}
public class Main
{
	public static void main(String[] args)
	{
		Test t = new Test();
		t.method(new ZI());//用多态就可以解释为什么不能抛其他的异常
	}
}

下述代码解释注意事项(2)

interface in
{
	abstract void show();
}
class BB implements in
{
	public void show()//throws Exception,因为父类没有出现异常,子类就不能抛
	{
			//如果真的出现异常,那么只能try,不能抛
	}
}

异常到此就结束了,内容很多,自己需要多复习,消化才是。。。

时间: 2024-08-28 05:16:14

JAVA学习第二十课(异常的应用和注意事项(三))的相关文章

JAVA学习第二十四课(多线程(三))- 线程的同步

继续以卖票为例 一.线程安全问题的解决 同步的第一种表现形式:同步代码块 思路: 将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程是不允许参与运算的,必须要当期线程把代码执行完毕后,其他线程才可以参与运算 在java中用同步代码块解决这个问题 同步代码块格式: synchronized(对象) { 需要被同步的代码部分 } class Ticket implements Runnable { private int num = 100; Object god = ne

JAVA学习第二十二课(多线程(二))- (多线程的创建方式一 :继承Thread类)

线程是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 创建新执行线程有两种方法. 一种方法是将类声明为 Thread 的子类.该子类应重写Thread 类的run 方法.另一种方法是声明实现 Runnable 接口的类.该类然后实现run 方法. 创建线程方式一:继承Thread类 一.创建线程的步骤: 1.定义一个类继承Thread类 2.覆盖Thread中的run()方法 3.直接创建Thread类子类的对象 4.调用start方法开启线程,并调用线程的任务run方法

JAVA学习第二十八课(多线程(七))- 停止线程和多线程面试题

重点掌握 /* * wait 和 sleep 区别? * 1.wait可以指定时间也可以不指定 * sleep必须指定时间 * 2.在同步中,对CPU的执行权和锁的处理不同 * wait释放执行权,释放锁    sleep释放执行权,不释放锁 */ //同步里具备执行资格的线程不止一个,但是能得到锁的只有一个,所以能执行的也只有一个 一.停止线程的方式 不可能让线程一直在运行,所以需要让线程停止 1.定义循环结束标记 一般而言,线程运行代码都是循环的,只要控制了循环就可以结束任务 2.使用int

JAVA学习第二十六课(多线程(六))- 多生产者多消费者问题

多生产者多消费者问题 以生产馒头 消费馒头为例. class Resource { private String name; private int count = 1; private boolean flag = false; public synchronized void set(String name) { if (flag) { try { this.wait(); } catch (Exception e) { // TODO: handle exception } } this.

JAVA学习第二十八课(常用对象API)- String类

多线程告一段落,开始常用对象API的涉及,背也要背下来!!! 日后开发,遇见最多的对象是文字,也就是字符串 String类 字符串是一个特殊对象 字符串一旦初始化就不可以被改变 一.特点 public class Main { public static void main(String[] args) { Demo1(); System.out.println("--------------"); Demo2(); } /*演示字符串的第一种定义方式,并明确字符串常量池的特点*/ p

JAVA学习第二十九课(经常使用对象API)- String类

多线程告一段落,開始经常使用对象API的涉及,背也要背下来!.! 日后开发,遇见最多的对象是文字,也就是字符串 String类 字符串是一个特殊对象 字符串一旦初始化就不能够被改变 一.特点 public class Main { public static void main(String[] args) { Demo1(); System.out.println("--------------"); Demo2(); } /*演示字符串的第一种定义方式,并明白字符串常量池的特点*/

JAVA学习第二十六课(多线程(五))- 多线程间的通信问题

一.线程间的通信 实例代码: 需求是:输入一个姓名和性别后,就输出一个姓名和性别 class Resource { String name; String sex ; } class Input implements Runnable { Resource r; Input(Resource r) { this.r = r; } public void run() { int x = 0; while(true) { synchronized (r) { if(x==0) { r.name =

JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题

一.多线程下的单例设计模式 利用双重判断的形式解决懒汉式的安全问题和效率问题 //饿汉式 /*class Single { private static final Single t = new Single(); private Single(){} public static Single getInstance() { return t; } } */ //懒汉式 class Single { private static Single t = null; private Single()

JAVA学习第二十三课(多线程(二))- (多线程的创建方式二 :实现Runnable接口(常用))

当一个类有父亲,但是其中的功能还希望实现线程,那么就不能采用继承Thread的方式创建线程 那么就可以通过接口的方式完成 准备扩展Demo类的功能,让其中的内容可以作为线程的任务执行 实现Runnable接口,Runnable接口中只有一个方法run 一.创建线程的第二种方法 Runnable的出现仅仅是将线程的任务进行了对象的封装 /* * 创建线程的第二种方法 * 1.定义类实现Runnable接口 * 2.覆盖接口中的fun方法,将线程的任务代码封装到run方法中 * 3.通过Thread