Java day9 内部类,异常 2019.7.18

  • 内部类
  • 匿名内部类
  • 匿名内部类2
  • 匿名内部类测试
  • 异常处理
  • 异常处理2
  • 多异常处理
  • 自定义异常
  • RuntimeException

内部类


/*
1.内部类可以直接访问外部类中的成员,包括私有
2.外部类要访问内部类,必须先建立内部对象

访问格式:
1.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中
可以直接建立内部类对象
格式
	外部类名.内部类名 变量名=外部类对象.内部类对象;
	Outer.Inner in=new Outer().new Inner();

2.当内部类在成员位置上,就可以被成员修饰符所修饰
  比如:private:将内部类在外部类中进行封装。
        static:内部类就具备了静态类的特性
		当内部类被static修饰后就只能访问外部类中的静态成员,出现了访问限制


	在外部或其他类中,如何直接访问static内部类的非静态成员呢?
	new Outer.Inner().function();

	在外部或其他类中,如何直接访问static内部类的静态成员呢?
	Outer.Inner().function();

	注意:当内部类中定义了静态成员,该内部类必须是static的
*/

class Outer
{
	private int num=3;
	private class Inner//只有内部类才可以加上private
	{
		//int num=5;
		void function()
		{
			//int num=6;
			System.out.println("inner:"+num);//num前省略了outer.this
		}//输出顺序653
	}

	void method()
	{
		//Inner in=new Inner();
		//in.function();

		Outer.Inner in=new Outer().new Inner();
		in.function();
	}
}

class InnerClass 
{
	public static void main(String[] args) 
	{
		Outer a=new Outer();
		a.method();
	}
}

匿名内部类

/*
内部类定义在局部时,
1.不可以被成员修饰符修饰
2.可以直接访问外部类中的成员,因为还持有外部类钟中的引用
  但是不可以访问他所在的局部中的变量。只能访问被final修饰的局部变量

*/


class Outer
{
	int x=3;
	void method(final int a)//连参数也要被final修饰,但是jdk8以后会自动帮你加上,所以可以不写
	{
		final int y=4;//必须要加上final 但是jdk8以后会自动帮你加
		class Inner//不可以被修饰符修饰,局部类
		{
			void function()
			{
				System.out.println(y);
			}
		}
		new Inner().function();
	}
}

class  InnerClass2
{
	public static void main(String[] args) 
	{
		new Outer().method(6);
	}
}

匿名内部类2

/*
匿名内部类:
1.匿名内部类其实就是内部类的简写格式。
2.定义匿名内部类的前提:
内部类必须是一个继承类或者实现接口

3.匿名内部类的格式:new 父类或者接口(){定义子类内容}
4.其实匿名内部类就是一个匿名内部子类对象
5.匿名内部类中定义的方法最好不要超过三个
*/
abstract class Demo
{
	abstract void show();
}

class Outer
{
	int x=3;

	/*class Inner extends Demo 
	{
		void show()
		{
			System.out.println("method:"+x);
		}
	}*/


	public void function()
	{
		//new Inner().show();

		new Demo()//这是一个Demo建立的对象,这是注释掉的内容的简化写法
		{//匿名内部类
			void show()
			{
				System.out.println("method:"+x);
			}
		}.show();//其实就是new Inner().show()


		//还可以给匿名对象起名字
		//Demo a=new Demo(){定义子类内容},这就是多态,父类引用指向子类。因为Demo(){}其实就是子类
		//匿名内部类是有局限的,只能调用父类方法,不能调用子类特有的,匿名内部类就是用来复写的

	}
}


class InnerClass3 
{
	public static void main(String[] args) 
	{
		new Outer().function();//匿名对象
	}
}

匿名内部类测试

interface Inter
{
	abstract void method();
}

class Test
{
	/*static class Inner implements Inter
	{
		public void method()
		{
			System.out.println("method run");
		}
	}

	static Inter function()
	{
		Inter a=new Inner();
		return a;
	}*/
	
	static Inter function()
	{
		return new Inter()
		{
			public void method()//不给public无法访问,权限过小
			{
				System.out.println("method run");
			}
		};
	}

}

class InnerClassTest  
{
	public static void main(String[] args) 
	{

		//理解:Test.function() 没有new,说明function()是静态方法
		//.method又调用了方法,而只有对象可以调用方法,所以function()返回的是一个对象
		//而接口中才有method方法,所以返回的必是一个Inter对象
		Test.function().method();
	}
}

异常处理

/*
异常:就是程序在运行时出现不正常情况
异常由来:问题也是现实生活中一个具体的事物,也可以通过Java的类的形式来进行没描述,并封装成对象
      其实就是Java对不正常情况进行描述后的对象体现


对于问题的划分:两种:严重与非严重

对于严重的:Java通过Error类进行描述
   对于Error,一般不编写针对性的代码对其进行处理

对于非严重的:Java通过Exception进行描述
   对于这种Exception可以使用针对性方式进行处理

Throwable
	|--Error
	|--Exception 



2.异常的处理
try
{
	需要被检测的代码
}

catch(异常类 变量)
{
	处理异常的代码:(处理方式)
}

finally
{
	一定能会执行的语句
}

3.对捕获到的异常惊喜常见方法的操作

*/

class Demo
{
	int div(int a,int b)throws Exception
	{
		return a/b;
	}
}

class ExceptionDemo 
{
	public static void main(String[] args) 
	{
		Demo a=new Demo();
		try
		{
			int b=a.div(4,0);
			System.out.println(b);
		}
		catch (Exception e)
		{
			System.out.println("除零啦");//Exception e=new ArithmeticException();多态
			System.out.println(e.getMessage());//  / by zero
			System.out.println(e.toString());//异常名称+信息
			e.printStackTrace();//异常名称+异常信息+异常位置
			//其实jvm默认调用的异常处理机制,就是在调用printStrackTrace方法
			//打印异常的堆栈的跟踪信息
		}


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

异常处理2

/*
异常:就是程序在运行时出现不正常情况
异常由来:问题也是现实生活中一个具体的事物,也可以通过Java的类的形式来进行没描述,并封装成对象
      其实就是Java对不正常情况进行描述后的对象体现


对于问题的划分:两种:严重与非严重

对于严重的:Java通过Error类进行描述
   对于Error,一般不编写针对性的代码对其进行处理

对于非严重的:Java通过Exception进行描述
   对于这种Exception可以使用针对性方式进行处理

Throwable
	|--Error
	|--Exception 



2.异常的处理
try
{
	需要被检测的代码
}

catch(异常类 变量)
{
	处理异常的代码:(处理方式)
}

finally
{
	一定能会执行的语句
}

3.对捕获到的异常惊喜常见方法的操作

*/

class Demo
{
	int div(int a,int b)throws Exception//在功能上通过throws的关键字申明了该功能会可能出现问题
	{
		return a/b;
	}
}

class ExceptionDemo2
{
	public static void main(String[] args) //throws Exception//抛给虚拟机
	{
		Demo a=new Demo();
		try
		{
			int b=a.div(4,0);
			System.out.println(b);
		}
		catch (Exception e)
		{
			System.out.println(e.toString());//异常名称+信息
		}
		

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

多异常处理


/*
在函数上申明异常
便于提高安全性,让调用进行处理,不让编译失效。


对于异常的处理
1.申明异常时,建议申明更为具体的异常,这样处理的可以更具体。
2.对方申明几个异常,就应该对应catch快,不要定义多余的catch块
如果多个catch块中的异常出现继承关系,父类异常catch块应该放在最下面
*/
class Demo
{
	int div(int a,int b)throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通过throws的关键字申明了该功能会可能出现问题
	{
		int[] arr=new int[4];
		System.out.println(arr[4]);
		return a/b;
	}
}

class ExceptionDemo3
{
	public static void main(String[] args) //throws Exception//抛给虚拟机
	{
		Demo a=new Demo();
		try
		{
			int b=a.div(4,0);
			System.out.println(b);
		}
		catch (ArithmeticException e)//尽量要详细,不要用Exception
		{
			System.out.println(e.toString());//异常名称+信息
			System.out.println("分母为0啦");
		}
		catch(ArrayIndexOutOfBoundsException e)
		{
			System.out.println(e.toString());
			System.out.println("角标越界啦");
		}
		

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

自定义异常

/*
因为项目中会出现特有的问题。
而这些问题并未被Java所描述并封装对象。
所以对于这些特有的问题可以按照Java的对问题封装的思想
将所有的问题,进行自定义的异常封装

自定义异常
需求:在本程序中,除数时负数,也视为时错误的,时无法进行预算的
那么就需要对这个问题进行自定义的描述。

当在函数内部出现了throw抛出异常对象,那么就必须要给对于的处理动作
(若函数内有throw,那么函数上必须要throws)
要么早内部太容易try catch处理
要么在函数申明上让调用者处理

一般情况下,在函数内部出现异常,函数上需要申明


如何自定义异常信息?

class Throwable
{
	private String message;
	Throwable(message)
	{
		this.message=message;
	}

	public String getMessage()
	{
		return message;
	}
}

class Exception//java已经处理过的异常,就是已经传递过信息了,所以自定义的异常继承exception后需要自己传递
{//就是说没必要自己单独拎出来进行复写
	Exception(String message)
	{
		super(message);
	}
}

因为父类中已经把异常信息的操作都完成了
所以子类只要在构造时,将异常的信息传递给父类通过super语句
那么就可以直接通过getMessage方法获取自定义的异常


自定义异常:
必须时自定义类继承Exception。

继承Exception原因:
异常体系有一个特点:因为异常类和异常对象都被抛出。
他们都具有可抛性,这个可抛性时throwable这个体系中独有特点

只有这个体系中的类和对象才可以被throws和throw操作





throws 和throw的区别:
throws使用在函数上
throw使用在函数内

thrwos后面跟的异常类,可以跟多个,用逗号隔开
throw后跟的时异常对象
*/
class FuShuException extends Exception//这样FuShuException也变成了Exception的一个子类,所以可以被catch住
{
	private String mes;
	private int value;
	FuShuException(String mes,int value)//没必要单独复写了
	{
		super(mes);
		this.value=value;
	}

	public int getValue()
	{
		return value;
	}
	
}

class Demo
{
	int div(int a,int b)throws FuShuException
	{
		if(b<0)
			throw new FuShuException("除数出现了负数",b);//手动通过throw关键字抛出一个自定义异常对象
		return a/b;
	}
}

class  ExceptionDemo4
{
	public static void main(String[] args) 
	{
		Demo d=new Demo();
		try
		{
			int x=d.div(4,-2);
			System.out.println("x="+x);
		}
		catch (FuShuException e)
		{
			System.out.println(e.toString());
			System.out.println("错误的除数是:"+e.getValue());
		}
		
		System.out.println("over");
	}
}



RuntimeException

/*
因为项目中会出现特有的问题。
而这些问题并未被Java所描述并封装对象。
所以对于这些特有的问题可以按照Java的对问题封装的思想
将所有的问题,进行自定义的异常封装

自定义异常
需求:在本程序中,除数时负数,也视为时错误的,时无法进行预算的
那么就需要对这个问题进行自定义的描述。

当在函数内部出现了throw抛出异常对象,那么就必须要给对于的处理动作
(若函数内有throw,那么函数上必须要throws)
要么早内部太容易try catch处理
要么在函数申明上让调用者处理

一般情况下,在函数内部出现异常,函数上需要申明


如何自定义异常信息?

class Throwable
{
	private String message;
	Throwable(message)
	{
		this.message=message;
	}

	public String getMessage()
	{
		return message;
	}
}

class Exception//java已经处理过的异常,就是已经传递过信息了,所以自定义的异常继承exception后需要自己传递
{//就是说没必要自己单独拎出来进行复写
	Exception(String message)
	{
		super(message);
	}
}

因为父类中已经把异常信息的操作都完成了
所以子类只要在构造时,将异常的信息传递给父类通过super语句
那么就可以直接通过getMessage方法获取自定义的异常


自定义异常:
必须时自定义类继承Exception。

继承Exception原因:
异常体系有一个特点:因为异常类和异常对象都被抛出。
他们都具有可抛性,这个可抛性时throwable这个体系中独有特点

只有这个体系中的类和对象才可以被throws和throw操作





throws 和throw的区别:
throws使用在函数上
throw使用在函数内

thrwos后面跟的异常类,可以跟多个,用逗号隔开
throw后跟的时异常对象
*/
class FuShuException extends Exception//这样FuShuException也变成了Exception的一个子类,所以可以被catch住
{
	private String mes;
	private int value;
	FuShuException(String mes,int value)//没必要单独复写了
	{
		super(mes);
		this.value=value;
	}

	public int getValue()
	{
		return value;
	}
	
}

class Demo
{
	int div(int a,int b)throws FuShuException
	{
		if(b<0)
			throw new FuShuException("除数出现了负数",b);//手动通过throw关键字抛出一个自定义异常对象
		return a/b;
	}
}

class  ExceptionDemo4
{
	public static void main(String[] args) 
	{
		Demo d=new Demo();
		try
		{
			int x=d.div(4,-2);
			System.out.println("x="+x);
		}
		catch (FuShuException e)
		{
			System.out.println(e.toString());
			System.out.println("错误的除数是:"+e.getValue());
		}
		
		System.out.println("over");
	}
}



附上一张异常继承关系图片
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值