Java知识点学习(第7天)

什么是字节码?采用字节码的好处是什么?

编译器将Java源文件(.java)文件编译成字节码文件(.class),可以做到一次编译到处运行,windows上编译好的class文件,可以直接在linux运行,这种方式也就是我们所说的跨平台,但是Java的跨平台是有前提条件的,因为不同的操作系统上安装的JDK或JRE是不一样的,虽然字节码通用,但是需要把字节码解释成各个操作系统的机器码是需要不同的解释器的,所以针对各个操作系统需要有各自的JDK或JRE。

采用字节码的好处,一方面实现了跨平台,另一方面也提高了代码执行的性能,编译器在编译源代码时可以做一些编译期的优化,比如锁消除、标量替换、方法内联等。

Java的异常体系是怎样的?

  • Java中的所有异常都来自于顶级父类Throwable。

  • Throwable下有两个类Exception和Error。

  • Error表示严重的错误,比如java.lang.StackOverFlowError和java.lang.OutOfMemoryError,这种错误出现时,仅仅靠程序员是解决不了的,可能是虚拟机、磁盘、操作系统等层面出现了问题,这种Error错误不建议去进行捕获,因为捕获的意义不大,因为程序之外的外部原因可能导致程序根本运行不了。

  • Exception表示异常,出现异常时可以靠自己的程序进行解决的,比如NullPointerException、IllegalAccessException等,我们可以捕获这些异常来做特殊处理。

  • Exception的子类通常分为RuntimeException和非RuntimeException两类,RuntimeException表示这个异常在代码运行过程中抛出的,这个异常是非检查异常,程序中可以选择捕获异常,也可以不处理。这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽可能的避免这类异常的发生,比如NullPointerException、IndexOutOfBoundsException等。非RuntimeException表示非运行期异常,也就是我们常说的检查异常,是必须进行处理的异常,如果不处理,程序就不能检查异常通过。如IOException、SQLException等以及用户自定义的Exception异常。

在Java的异常处理机制中,什么时候应该抛出异常,什么时候捕获异常?

异常相当于一种提示,如果我们抛出异常,就相当于告诉上层,我抛了一个处理不了的异常,交给你来处理,而对于上层来说,它也要决定自己能不能处理这个异常,是否也需要交给它的上层。

所以我们在写一个方法时,需要考虑本方法是否能合理的处理该异常,如果处理不了就继续往上抛出异常,包括本方法中调用另一个异常,如果这个异常应该由自己处理,那就捕获异常并进行处理。

Java中有哪些类加载器?说说类加载器的双亲委派机制

JDK自带了三个类加载器:bootstrapClassLoader、ExtClassLoader、AppClassLoader。

  • bootstrap ClassLoader是ExtClassLoader的父类加载器,默认负责加载%Java_Home%lib下的jar包和class文件。
  • ExtClassLoader是AppClassLoader的父加载器,负责加载%Java_Home%lib/ext文件下的jar包和class类。
  • AppClassLoader是自定义类加载器的父类,负责加载classpath下的类文件。
    双亲委派机制是指,JVM加载一个类时,会调用AppClassLoader的loadClass方法来加载这个类,不过在这个方法中,会先使用ExtClassLoader的loadClass方法来加载类,通用ExtClassLoader的loadClass方法中会使用bootstrapClassLoader来加载类,如果bootstrapClassLoader加载到就直接成功,如果bootstrapClassLoader没有加载到,那么ExtClassLoader就会尝试加载该类,如果没有加载到,那么就会由AppClassLoader来加载这个类。

所以双亲委派机制是指,JVM在加载类时,会委派给Ext和Bootstrap进行加载,如果没有加载到才由自己进行加载。

你可能感兴趣的:(Java知识点,java)