内部类和异常
-
一个类内定义一个类。
-
package oop.demo01.demo11;
public class Outer {
private int id=10;
public void out(){
class B{ //局部内部类,在方法内的类
public void o(){ //其中也可以写方法
}
}
System.out.println("这是外部类");
}
public class Inner{ //成员内部类 //一旦Inner类前面加上static,就变成了静态内部类,内部类就拿不到id了,因为先实例化了内部类,id还没有出生,所以不能调用。
public void in(){ //静态内部类无法直接访问非静态的属性
System.out.println("这是内部类");
}
//可以获得外部类的私有属性,私有方法。
public void getID(){
System.out.println(id);
}
}
}
//一个java类中可以有多个class类,但是只能有一个public class。
class A{
public static void main(String[] args) {
//这里面可以写一个测试类
}
} -
代码二:
package oop.demo01.demo11;
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
outer.out();
//通过外部类来实例化内部类
Outer.Inner inner = outer.new Inner(); //成员内部类的实例化
inner.in();
inner.getID(); //可以获得外部类的私有属性 10
}
}
-
代码三:
package oop.demo01.demo11;
public class Test {
public static void main(String[] args) {
new Apple().eat(); //匿名内部类,没有名字初始化类,匿名对象的使用,不用将实例保存到变量中。也可以调用方法。
Apple apple = new Apple(); //new Apple()实例化这个对象,并且把new Apple()的值赋值给了apple
new UserService(){ //Implement method //这个方法其实会返回一个对象userService
//这个就是实现了这个接口的类,但是这个类没有名字
异常
-
异常:可能程序到打开的文件不存在,内存满了(栈溢出),用户输入不合法,都会导致异常。
-
检查性异常:用户错误引起的异常。
-
运行时异常:运行时就会报错,最容易避免。编写时不会报错。
-
错误error:JVM造成的。致命的,JVM直接终止程序。
-
java把异常当做对象来处理,并定义了一个基类java.lang.Throwable作为所有异常的超类。
-
在java API中定义了许多异常类,分为两大类,错误error(无法预见的)和异常exception(可以预见的)。
-
Error类对象一般是由java虚拟机生成并抛出,一般与我们编码者无关。
-
当JVM运行错误,JVM会直接终止运行,程序结束。不允许出现。
-
运行时异常时Exception分支中的一个子类RuntimeException(运行时异常):包含NullPointerException(空指针异常),ClassNotFoundException(找不到类)等。这些异常是不检查异常,程序中可以选择捕获,也可以不处理。可以被程序处理的。
-
异常处理机制:五个关键字:try catch finally throw throws
-
抛出异常 捕获异常
-
代码如下:假设要捕获多个异常,要从小到大,否则会报错。
package exception;
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 0;
try { //try监控区域
new Test().a();
}catch(Error e){ //捕获异常 (catch(想要捕获的异常类型Throwable>error=Exception))
System.out.println("程序出现异常,变量a不能为0,禁止套娃"); //异常被捕获了,不会爆出异常。try catch必有,其他可以没有。
}catch(Exception e){ //e是这个异常类型的实例
System.out.println("aa");
}catch(Throwable t){ //最大的异常要写在最下面,上面的捕获了,就不会执行后面的捕获了。只能生效一个。
}finally { //处理善后工作 假设IO流这类东西,需要关闭,用finally。
System.out.println("finally");
}
}
public void a(){b();}
public void b(){a();}
}
代码二:
public class test2 {
public static void main(String[] args) {
int a = 1;
int b=0;
//选中代码,ctrl + alt + T --》surround with 选择对应方法--> try/catch/finally,自动生成代码。
try {
if(b==0){//主动的抛出异常 throw throws
throw new ArithmeticException();//主动抛出一个异常 throw
}
System.out.println(a/b);
} catch (Exception e) {
e.printStackTrace(); //打印错误的栈信息
} finally {
}
}
代码三:抛出,捕获异常
package exception;
public class test2 {
public static void main(String[] args) {
try {
new test2().test(2,0);
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
//假设在方法中,处理不了这个异常,在方法上抛出异常
public void test(int a,int b)throws ArithmeticException{ //在方法上抛出异常,叫throws
if(b==0){//主动的抛出异常 throw throws
throw new ArithmeticException();//主动抛出一个异常 throw,一般在方法中使用
}
}
}
-
自定义异常:正常定义的一些异常消息就是detail,根据需求传递不同的东西。可以自己写一个异常类,然后extends继承exception类就可以了,这个类中处理你觉得可能会出现异常的问题,最后把消息打印toString出来。别人只要抛出了这个异常,我们把它捕获到,我们打印信息,就可以得到结果了。
-
处理运行时异常,采用逻辑去合理规避同时辅助try catch处理,程序不至于卡死。
-
-
尽量去处理异常,切记简单调用printStackTrace()去打印输出
-
尽量添加finally释放资源
package exception.demo02;
public class Test {
//可能存在异常的方法
static void test(int a) throws MyException {
System.out.println("传递的参数为:"+a);
if(a>10){
throw new MyException(a); //存在异常,抛出,可以选择在方法体alt+enter surround with try/catch和方法名add exception to method signature处抛出,任选其一。
}
System.out.println("OK");
}
public static void main(String[] args) {
try {
test(11);
} catch (MyException e) { //alt+enter try/catch捕获异常
//可以增加一些处理异常的代码块if(){}
e.printStackTrace();
System.out.println("MyException=>"+e); //e就是MyException类中toString方法中的结果return "MyException{" + detail + '}';
}
}
}