首页
学习
活动
专区
圈层
工具
发布

ClassNotFoundException和NoClassDefFoundError的区别

最近看到一个面试题,问ClassNotFoundException和NoClassDefFoundError的区别。平时没有专门思考过这个问题,藉此机会分析一下。...ClassNotFoundException 当应用尝试在类路径中用全限量名去加载某个类时,如果找你不到它的定义就会报CLassNotFoundException 。它是一个可检测异常。...我们在使用反射的时候,要特别注意这个异常。 下面这个例子,我们尝试加载的JDBC驱动没有添加到类路径中(没有添加依赖),将会报ClassNotFoundException。...他们的主要原因是运行时类路径中类文件不可用。 下面是几点具体的原因: 排查所需的jar包是否在类路径中,如果没有就添加进去。...如果发现类在classpath里面,很有可能是classpath被重写了,需要再次确定应用准确的classpath 依赖包发生了冲突,比如应该依赖高版本jar包,但又其它包传递依赖了低版本jar包,导致高版本中某些类找不到

1.9K20

ClassNotFoundException 和 NoClassDefFoundError 的区别

今天在看 「极客时间」的 《Java 核心技术 36 讲》 中又有提到。...ClassNotFoundException 和 NoClassDefFoundError 首先,正如它们的名字所说明的: NoClassDefFoundError是一个错误(Error),而 ClassNOtFoundException...在Java中错误和异常是有区别的:我们可以从异常中恢复程序,但却不应该尝试从错误中恢复程序。...如果这个类在类路径中没有被找到,那么此时就会在运行时抛出 ClassNotFoundException 异常。 要解决这个问题,就要确保所需的类连同它依赖的包存在于类路径中。...解决这个问题的办法就是:查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类 二者的区别 ClassNotFoundException 发生在装入阶段。

7.1K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    理解ClassNotFoundException与NoClassDefFoundError的区别

    上篇文章已经介绍过Java的类加载机制,在类加载的过程中我们最常遇到的异常就是: ClassNotFoundException NoClassDefFoundError 但是你知道他们的区别吗?...String[] args)throws Exception { Class.forName("oracle.jdbc.driver.OracleDriver"); } } 就会抛出异常ClassNotFoundException...: Exception in thread "main" java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver at...总结: 本文主要对比介绍了ClassNotFoundException与NoClassDefFoundError的区别和发生条件,从上面的测试我们可以分析出,直接采用反射或者类加载器的loadClass...方法去动态加载一个所有classpath里面的都不存在的类,类加载器在运行时的load阶段就会直接抛出ClassNotFoundException异常。

    9.9K30

    【译】NoClassDefFoundError和ClassNotFoundException的不同

    NoClassDefFoundError和ClassNotFoundException之间存在一些细微的不同点。...另外一方面,ClassNotFoundException和编译期没什么关系,当你在程序运行时利用反射加载类时,就可能遇到ClassNotFoundException异常,例如加载SQL驱动时,对应的类加载器找不到驱动类...除了这些基本的不同,我们可以看看别的不同,以加深对NoClassDefFoundError和ClassNotFoundException的理解。...下找不到对应的类而引起的,通常是缺少对应的jar包,不过,JVM认为:(1)当应用运行时没有找到对应的引用,则会抛出java.lang.NoClassDefFoundError;(2)当你在代码中显式加载类...如果你在J2EE开发中遇到NoClassDefFoundError,那么最有可能的原因就是存在多个类加载器和多个目标类,即我们常说的Jar包冲突——关于Jar包冲突,一般可以使用下面两种方法解决: 使用

    1.7K10

    深入理解 Java 中的 ClassNotFoundException 和 NoClassDefFoundError 及排查技巧

    实战干货:编程严选网 0 前言 在 Java 开发中,ClassNotFoundException 和 NoClassDefFoundError 是两种常见的运行时问题,通常与类加载有关。...1 特定环境中的类加载问题 数据库环境中加载 Java 类(如通过 Oracle 的 JVM 使用 loadjava 工具)。...之后,当应用程序试图使用这些加载失败的类时,就可能在运行时遇到 ClassNotFoundException 或 NoClassDefFoundError。...动态生成的类名无效:程序中构造了错误或不存在的类名。 模块系统问题(Java 9 及以上):类所在的模块未声明为依赖,或者未导出类所在的包。 排查建议: 检查类名及包名是否正确拼写。...和 NoClassDefFoundError 都表示 JVM 无法使用某个类,但它们的含义不同: ClassNotFoundException 通常表示:“我在你指定的位置找不到这个类文件。”

    1.8K21

    java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别

    ClassNotFoundException   ClassNotFoundException这个错误,比较常见也好理解。 原因:就是找不到指定的class。   ...常见的场景就是:   1 调用class的forName方法时,找不到指定的类   2 ClassLoader 中的 findSystemClass() 方法时,找不到指定的类   3 ClassLoader...中的 loadClass() 方法时,找不到指定的类   开发者平时会有这样一种使用方法,类似JDBC加载驱动!...而如果这个类中包含包名,那么按照上面的方法编译,使用时就会报错!...很明显,报错信息中指出了包的信息!那么怎么办呢?   在编译时,加上【   -d .   】这样可以把当前的目录加入到classpath中。 ?   在使用时,加上包名就可以了!

    5.8K50

    Jar 命令打包 jar包

    比如我的应用程序用到了Sun 的 Javamail classes ,在classpath中我需要包含activation.jar 和 mail.jar,这样在运行程序时,相比上面的例子,我们要增加一些...: java -classpath mail.jar:activation.jar -jar myapplication.jar 在不同的操作系统中,jar包间的分隔符也不一样,在UNIX用“:”,在...: com.example.myapp.MyAppMain Class-Path: mail.jar activation.jar (加入了Class-Path: mail.jar activation.jar...文件名中要对特定的字符使用逃逸符,比如空格,要表示成" ",在路径的表示中,都采用“/” 来分隔目录(),无论是在什么操作系统中,(即使在window中),而且这里用的是相对路径(相对于本身的JAR文...ClassPath下的文件这种方式载入的,比如在Spring中载入classpath:config.properties,则在MF文件的配置文件的ClassPath中添加“./”,然后将这个配置文件与jar

    6.4K30

    一个一年没解决的ClassNotFoundException|类加载机制探索

    背景 在一开始写Android的时候经常碰到一些ClassNotFoundException,大部分情况下是少导入了什么包导致的。...类的验证 验证阶段是链接阶段的第一步,目的就是确保class文件的字节流中包含的信息符合虚拟机的要求,不能危害虚拟机自身安全。...符号引用验证 符号引用中通过字符串描述的权限定名是否能找到对应的类、符号引用类中的类,字段和方法的访问性(private protected public default)是否能被当前类访问。...加载 这个阶段我个人看法,就是在ClassLoader的构造函数执行的过程。从安卓出发应该就是BaseClassLoader初始化过程中把所有.dex文件读入到ClassLoader内存中。...结论 首先要多尊重下字节码,因为在插桩过程中并没有代码的有效性检查的情况下,我们没法保证我们插入的字节码是一个没有错误的代码,特别是在安卓中,因为多个.class文件会被打成一个.dex,如果其中有一个

    2.5K41

    Java应用程序的打包和发布-Java快速入门教程

    比如我的应用程序用到了Sun 的 Javamail classes ,在classpath中我需要包含activation.jar 和 mail.jar,这样在运行程序时,相比上面的例子,我们要增加一些...: java -classpath mail.jar:activation.jar -jar myapplication.jar 在不同的操作系统中,jar包间的分隔符也不一样,在UNIX用“:”,在window...Class-Path: mail.jar activation.jar (加入了Class-Path: mail.jar activation.jar,用空格分隔两个jar包) 这样我们仍然可以使用和上例中相同的命令来执行该程序...: java -jar myapplication.jar Class-Path属性中包含了用空格分隔的jar文件,在这些jar文件名中要对特定的字符使用逃逸符,比如空格,要表示成"%20",在路径的表示中...,都采用“/”来分隔目录,无论是在什么操作系统中,(即使在window中),而且这里用的是相对路径(相对于本身的JAR文件): Manifest-Version: 1.0 Created-By: JDJ

    36600

    关于自动发送邮件的常见错误解决方法

    解决方法: 这里是myeclipse8.6自带的javaee.jar里面的mail.jar 和另外引入的mail.jar冲突 解决方法是找myeclipse自带的jar删除mail.jar和activition.jar...javax.mail和javax.activation这两个包已经在javaEE5当中属于基础包了,就是JDK中自带了已经,但是里面的方法与现在外面的mail.jar和activation.jar有一些出入...,所以初学者在直接copy别人代码的时候往往会出现上面的错误。...com.genuitec.eclipse.j2eedt.core_6.5.0.zmyeclipse650200806\data\libraryset\EE_5 这个路径里,可以看到javaee.jar,用rar把这个文件打开,然后进到javax文件夹里,删除mail.jar...和activation.jar(我的javaee.jar里,这两个东西是文件夹,总之删掉就OK,不过要注意备份一下) 删掉之后运行下面的代码,经行简单的修改以后就可以实现接收邮件的功能了!

    97120

    Java Mail---SMTP协议-Java发邮件(带附件)演示过程

    需要的jar包 mail.jar和activation-1.1.0.jar链接: https://github.com/chenhaoxiang/Java/tree/master/JavaMail...Session对像从Properties中获取信息,如IP、协议、用户名密码等。 Javax.mail.Message类,它的一个重要子类为MimeMessage....MailSSLSocketFactory-负责SSL加密(如果有邮箱是用ssl加密传输的,就需要用到这个类,否则不需要-以前的老版本jar包中没有此类) 演示用QQ邮箱给网易126邮箱发邮件: 为什么要用...发送有附件的邮件 相对于没带附件的:用MimeBodyPart来构建体,向体中添加内容,附件。最后利用MimeMultipart —addBodyPart(body); 把体加入。...小知识点: 1.必须先启用QQ邮箱里POP3/STMP服务;然后生成授权码 2.导入mail.jar包和activation包 mail.jar和activation-1.1.0.jar链接:

    2.7K20

    Java Mail(二):JavaMail介绍及发送一封简单邮件

    JavaMail是SUN提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持常用的邮件协议,如SMTP、POP3、IMAP,开发人员使用JavaMail编写邮件程序时...使用JavaMail,我们可以实现类似OutLook、FoxMail的软件。虽然JavaMail(仅支持JDK4及以上)也是Java的API之一,但是却没有直接加入到JDK中,所以我们需要另行下载。...在使用JavaMail时,通常我们只需将mail.jar放在classpath下使用,它包含了JavaMail API部分和SUN自己实现的service provider部分。...可能也有特殊的时候,我们应用程序中需要自己实现service provider部分,那我们只需要mailapi.jar。...由于我们开启了debug调试,在控制台可以看到JavaMail和服务器之间的交互信息记录,可以发现,和Java Mail(一):telnet实现发送收取邮件中telnet下的命令及服务器反馈信息基本一致

    1.9K70
    领券