Java中的异常分类
Java中异常分为两类:checked execption(检查异常)和unchecked execption(未检查异常)
“检查”二字是说,代码编译时,编译器会去检查一下有没有进行异常处理,对于归类为需要检查的异常,若没处理,编译就不通过。 Java中的未检查异常也叫运行时异常(RuntimeException)。
下面Thinking in Java里面比较好的一个例子:
class BaseballException extends Exception {
}
class Foul extends BaseballException {
}
class Strike extends BaseballException {
}
abstract class Inning {
public Inning() throws BaseballException {
}
public void event() throws BaseballException {
}
public abstract void atBat() throws Strike, Foul;
public void walk() {
}
}
class StormException extends Exception {
}
class RainedOut extends StormException {
}
class PopFoul extends Foul {
}
interface Storm {
public void event() throws RainedOut;
public void rainHard() throws RainedOut;
}
public class StormyInning extends Inning implements Storm {
/**
* 对构造器器添加新的异常是可以的,但是你必须处理基类构造器的异常
*/
public StormyInning() throws RainedOut, BaseballException {
}
public StormyInning(String s) throws Foul, BaseballException {
}
// 常规方法必须符合基(否则编译报错)
// @Override
// public void walk() throws PopFoul{
//
// }
// 接口不能向基类中的现有方法添加异常
// @Override
// public void event() throws RainedOut{
//
// }
/**
* 重写的方法可以抛出继承的异常
*/
@Override
public void atBat() throws PopFoul {
}
/**
* 如果基类中不存在该方法,则异常为OK。
*/
@Override
public void rainHard() throws RainedOut {
}
/**
* 您可以选择不抛出任何异常,即使基本版本也不例外。
*/
@Override
public void event() {
}
public static void main(String[] args) {
try {
StormyInning si = new StormyInning();
si.atBat();
} catch (PopFoul e) {
System.out.println("Pop foul");
} catch (RainedOut e) {
System.out.println("Rained out");
} catch (BaseballException e) {
System.out.println("Generic baseball exception");
}
try {
Inning i = new StormyInning();
i.atBat();
} catch (Strike e) {
System.out.println("Strike");
} catch (Foul e) {
System.out.println("Foul");
} catch (RainedOut e) {
System.out.println("Rained out");
} catch (BaseballException e) {
System.out.println("Generic baseball exception");
}
}
}
面试常问问题ClassNOtFoundException和NoClassDefFoundError的区别
NoClassDefFoundError是一个错误,而ClassNOtFoundException是一个异常。
Java的异常和错误是有区别的,我们可以从异常中恢复程序,但不应该从错误中恢复程序。
ClassNOtFoundException产生的原因
1.Java支持实用Class.forName方法来动态的加载类,任何一个类的类名如果被作为参数传递给这个方法都导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNOtFoundException。
解决办法:确保所需的类连同它依赖的包存在于类路径中。
2.当一个类已经被某个类加载器加载到内存中了,此时另一个类的加载器友尝试着动态地从同一个包中加载这个类。
解决办法:我们可以选择捕获这个异常。
NoClassDefFoundError产生的原因
要查找的类在编译的时候是存在的,运行的时候却找不到了。
解决办法:查找那些在开发期间存在于类路径下但在运行期间却不在类路径下面的类。
二者区别
ClassNotFoundException发生在装入阶段。
当应用程序试图通过类的字符串名称,使用常规的三种方法装入类,但却找不到指定名称的类定义时就抛出该异常。
NoClassDefFoundError当目前执行的类已经编译,但是找不到它的定义时。
也就是说你如果编译了一个类B,在类A中调用,编译完成以后,你又删除掉B,运行A的时候那么就会出现这个错误。
加载时从外存储器找不到需要的class就出现ClassNotFoundException。 连接时从内存找不到需要的class就出现NoClassDefFoundError。