局部内部类: 在一个类的方法内部定义另一个类,那么另外一个类被称作为局部内部类。
局部内部类要注意的细节:
1,如果局部内部类访问了一个局部变量,那么该变量必须使用final修饰。
代码演示:
class Outer{
String name = "外部类的name";
public void text(){
final int y = 199;
class inner{
int x = 10;
public void print(){
System.out.println("这个是局部内部类的print方法"+name);
}
}
inner inner = new inner();
inner.print();
}
}
class Demo02{
public static void main(String[] age){
Outer Outer = new Outer();
Outer.text();
}
}
运行结果:
匿名内部类:没有类名的类就称作为匿名内部类。
匿名内部类的好处:简化书写。
匿名内部类的使用前提:必须存在继承或者实现关系才能使用。
匿名内部类的格式:匿名内部类与其外部类是继承关系,目前是创建改父类的子类的对象。
比如:
new Animal(){
public void run(){
System.out.println("春婷在写字");
}
} .run();
代码示例:
abstract class Animal5{
public abstract Animal5 run();
public abstract void sleep();
}
class Out{
public void print(){
Animal5 a = new Animal5() {
@Override
public Animal5 run() {
System.out.println("春婷在放屁");
return this;
}
@Override
public void sleep() {
System.out.println("春婷睁着眼睛睡觉");
}
};
a.run();
a.sleep();
}
}
class Demo36 {
public static void main(String[] age){
Out out = new Out();
out.print();
}
}
运行结果:
异常:
我们的java程序也是会存在某些不正常的情况的,这些统称为异常
异常的图像分析:
异常体系:
所以异常体系的父类: Throwable 所有异常或者错误类的超类
Throwable的子类: Error 错误 错误一般是用于jvm或者是硬件引发的问题,所以我们一般不会通过代码去处理错误的
Exception 异常 是需要通过代码去处理的、
Throwable的常用方法:
toString() 返回当前异常对象的完整类名+病态信息
getMessage() 返回的是创建Throwable传入的字符串信息
printStackTrace() 打印异常的栈信息
代码示例:
public class Demo37 {
public static void main(String[] ages){
Throwable y = new Throwable("你好像有那个大病");
String info = y.toString();
String me = y.getMessage();
System.out.println("toString:"+info);
System.out.println("getMessage:"+me);
test();
}
public static void test(){
Throwable y = new Throwable();
y.printStackTrace();
}
}
运行结果:
如何区分错误与异常:
如果程序出现了不正常的信息,不那么不正常的信息的类名是以Error结尾的,那么肯定是一个错误。
如果是以Exception结尾的,那么肯定是一个异常。
疑问:错误的信息是通过printStaticTrace方法打印出来的,那么异常从何而来?
jvm运行到a/b这个语句的时候。发现b为0,除数为0在我们现实生活中是属于不正常的情况,jvm一旦发现这种不正常的情况时候
那么jvm就会马上创建一个对应的异常对象,并调用这个异常对象的printStaticTrace的犯法来处理
异常处理:
方式一:捕获处理
捕获处理的格式:
try{
可能发生异常的代码;
}catch(捕获的异常类型 变量名){
处理异常的代码、、、
}
捕获处理要注意的细节:
1,如果try块中代码出了异常经过了处理后,那么try-catch块外面的代码可以正常的执行。
2,如果try块中出现了异常的代码,那么在try块中出现异常代码后面的代码是不会执行的。
3,一个try块可以捕获多种异常类型,但是捕获的异常类型必须要从小到大进行捕获,否则编译报错
疑问一:异常的处感觉没有多大的作用,因为都是输出一个话而已?
异常处理非常有用,只不过是由于我们目前所接触的知识点太过于局限而已。
疑问二:以后捕获处理的时候是否就是捕获Exception即可?
错的,因为我们在现实开发中遇到不同的异常类型的时候,我们往往会有不同的处理方式。
所以要分开不同的异常处理。
代码演示:
public class Demo37 {
public static void main(String[] ages){
int[] arr = null;
div(4,0,arr);
}
public static void div(int a,int b,int[] arr){
int c= 0;
try {
c = a/b;
System.out.println("数组的长度:"+arr.length);
}catch (ArithmeticException e){
System.out.println("异常处理了、");
System.out.println("toString:"+e.toString());
}catch (NullPointerException e){
System.out.println("出现了空指针异常、、");
}catch (Exception e){
System.out.println("包治百病");
}
System.out.println("c ="+c);
}
}
运行结果: