内部类和异常

内部类

  1. 一个类内定义一个类。

  2. 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) {
           //这里面可以写一个测试类
      }
    }
  3. 代码二:

    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

      }
    }

     

  4. 代码三:

    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
               //这个就是实现了这个接口的类,但是这个类没有名字
               @Override
               public void hello() {   //重写方法

              }
          };
      }
    }

    class Apple{
       public void eat(){
           System.out.println("1");
      }
    }

    interface UserService{
       void hello();
    }

异常

  1. 异常:可能程序到打开的文件不存在,内存满了(栈溢出),用户输入不合法,都会导致异常。

  2. 检查性异常:用户错误引起的异常。

  3. 运行时异常:运行时就会报错,最容易避免。编写时不会报错。

  4. 错误error:JVM造成的。致命的,JVM直接终止程序。

  5. java把异常当做对象来处理,并定义了一个基类java.lang.Throwable作为所有异常的超类。

  6. 在java API中定义了许多异常类,分为两大类,错误error(无法预见的)和异常exception(可以预见的)。

  7. Error类对象一般是由java虚拟机生成并抛出,一般与我们编码者无关。

  8. 当JVM运行错误,JVM会直接终止运行,程序结束。不允许出现。

  9. 运行时异常时Exception分支中的一个子类RuntimeException(运行时异常):包含NullPointerException(空指针异常),ClassNotFoundException(找不到类)等。这些异常是不检查异常,程序中可以选择捕获,也可以不处理。可以被程序处理的。

  10. 异常处理机制:五个关键字:try catch finally throw throws

  11. 抛出异常 捕获异常

  12. 代码如下:假设要捕获多个异常,要从小到大,否则会报错。

    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,一般在方法中使用
      }
       
  }
}
  1. 自定义异常:正常定义的一些异常消息就是detail,根据需求传递不同的东西。可以自己写一个异常类,然后extends继承exception类就可以了,这个类中处理你觉得可能会出现异常的问题,最后把消息打印toString出来。别人只要抛出了这个异常,我们把它捕获到,我们打印信息,就可以得到结果了。

  2. 处理运行时异常,采用逻辑去合理规避同时辅助try catch处理,程序不至于卡死。

  3. 多重catch后可以加一个catch(Exception)来处理可能遗漏的异常,对于不确定的代码,可以加上try catch处理潜在的异常。

  4. 尽量去处理异常,切记简单调用printStackTrace()去打印输出

  5. 尽量添加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 + '}';
          }
      }
    }
posted @ 2021-02-07 17:36  爱罗翔的张三  阅读(89)  评论(0编辑  收藏  举报