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

解密 `java.lang.ClassNotFoundException`:从JVM类加载机制到实战排错(Java小白必读)

对于初学者来说,这个异常尤其令人沮丧,因为代码在编译时可能一切正常,没有任何错误提示,但一运行就“翻车”。这到底是为什么呢?难道编译器“欺骗”了我们吗? 并非如此。...(); // 打印详细的堆栈跟踪 } } } 运行上述代码,你会得到类似以下的输出: 糟糕,类没有找到!...工作流程: 当一个类加载器收到加载类的请求时,它首先不会自己尝试去加载这个类。 而是把这个请求委派给它的父类加载器去完成。...仔细核对类名和包名的拼写及大小写: 这是个低级错误,但也常犯。...IDE特定的检查与调试: 在IDE中设置断点,在即将发生 Class.forName() 或其他类加载操作之前停下来,检查此时传递的类名字符串是否正确。

1.4K11

和各种诡异 Bug 打交道 13 年,我总结了 18 个经验

最近我重新浏览了这所有的 194 个条目(历时 13 年),看看我从这些 bug 中学到了学到了那些重要的经验教训。我分为编码、测试和调试三大类。...当我们处理这个问题时,我们通常假设它处在空闲列表状态时被标记为断开(但是当时它为什么没有从这个列表上撤下?) 没考虑到事情有时发生过早是由于我们没有想到。...另一个例子:当遇到一个错误元素时,直接返回而不是给出错误的解析代码。调用在故障的状态下持续了一段时间,使得调试的难度加大。一旦故障被检测出,最好要及时返回这个错误。...所以这些天,我认真对待他们的反馈。当然,我仍然反复测试所有的一切被正确地设置了。...我使用的语言包括 C++、Ruby、Java 和 Python,若干类的 bug 在我使用 C++ 的日子里就已经不再出现了。像堆栈溢出,内存损坏,字符串的问题以及某些形式的内存泄漏。

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

    和各种诡异 Bug 打交道 13 年,我总结了 18 条经验

    我分为编码、测试和调试三大类。 ? 编码 这些都是过去给我带来棘手 bug 的问题: 1. 事件顺序 当处理事件时,问以下问题富有成效:事件是否可以以不同的顺序到达?如果没收到这些事件怎么办?...当我们处理这个问题时,我们通常假设它处在空闲列表状态时被标记为断开(但是当时它为什么没有从这个列表上撤下?) 没考虑到事情有时发生过早是由于我们没有想到。 3....另一个例子:当遇到一个错误元素时,直接返回而不是给出错误的解析代码。调用在故障的状态下持续了一段时间,使得调试的难度加大。一旦故障被检测出,最好要及时返回这个错误。 4....另一个例子:在发送任何数据(零字节)之前,测试 TCP 连接的断开。没有使用这些组合来测试是 bug 悄然出现的头号原因,我在测试时是原本可以发现这些 bug 的。 9....所以这些天,我认真对待他们的反馈。当然,我仍然反复测试所有的一切被正确地设置了。

    1.1K80

    Java开源博客My-Blog之mysql容器重复初始化的严重bug修复过程

    取而代之的是schema.sql中的几条初始化数据,当时也认真确认是否存在错误操作导致了数据被清空,结果就是一切流程都正常,过程中并没有误操,这个问题也只有在重启时会出现,这是流程设计的问题而且是一个十分致命的问题...过程记录 一开始并没有意识到严重性,因此也并没有投入特别多的精力在这个问题上,而是把重点更多的放在其他bug的修复上,但是随着自己博客数据的增多,及使用此项目的朋友渐渐增多,有一天我忽然有种重压在心头的感觉...一开始是根本没思路,通过一点点的动手实践,整个思路也渐渐清晰,通过shell脚本执行mysql命令,并根据得到的输出判断是否已经存在项目数据库,如果已经存在,就不再进行初始化,而是不进行任何操作即可,如果不存在...如图,在执行'mysql > use tale;'sql命令时,每次都有此错误返回,虽然是预想中的返回,如果针对此错误返回值即可正确的判断是否已存在tale数据库,但是shell在执行到此语句时,收到此错误信息就直接退出进程了...如图所示,最终得到了想要的结果,重启时可以正确的判断容器中的mysql服务器中是否已经存在tale数据库,如果已经存在则不再重新初始化数据,修复了这个较为严重的bug。

    1.1K70

    独家 | 你的神经网络不起作用的37个理由(附链接)

    “我做错了什么?”——我问我的电脑,但它没有回答我。 你从哪里开始检查是否你的模型输出了垃圾(例如,预测输出了平均值,或者它的准确性真的很差)? 由于许多原因,神经网络可能不会进行训练。...在许多调试过程中,我经常发现自己在做同样的检查。我把我的经验和最好的想法整理在这个便利的列表中,希望它们对你也有用。 目录 1. 如何使用本指南? 2. 数据集问题 3....确保输入连接到输出 检查一些输入样本是否有正确的标签。同时确保对输入样例进行打乱的方式与输出标签的相同。 5. 输入和输出之间的关系是否过于随机?...试着解决这个问题的简单版本 这将有助于找到问题所在。例如,如果目标输出是一个对象类和坐标,则尝试将预测限制为对象类。 17....例如,如果我们有10个类,随机意味着我们将在10%的时间内得到正确的类,而Softmax损失是正确类的概率的对数的相反数,所以:-ln(0.1) = 2.302。

    1.1K10

    教程|Python Web页面抓取:循序渐进

    URL2.png 如果收到错误消息表明文件丢失,再次检查驱动程序“ webdriver.*”中提供的路径是否与webdriver可执行文件的位置匹配。...没有缩进的循环将输出“IndentationError”,并用“arrow”指出有问题的语句。...输出数据 Python页面抓取需要对代码进行不断的检查 输出1.jpg 即使在运行程序时没有出现语法或运行错误,也仍然可能存在语义错误。...应该检查实际上是否有分配给正确对象的数据,并正确地移动到数组。 检查在前面步骤中采集数据是否正确的最简单方法之一是“打印”。...所以,直接打印结果是完全可行的: 输出3.png 到目前为止,编码应该如下所示: 输出4.png 现在运行程序应不会显示任何错误,并且会在调试器窗口中显示获取的数据。

    11.8K50

    最佳PHP代码审查关键原则与实践技巧

    检查是否有不合逻辑的步骤、错误的计算,或者流程可能会意外停止的地方。 检查输入:代码是否正确处理了它可能接收到的所有类型的数据?这包括用户输入、数据库数据或来自外部系统的信息。...检查输出:验证代码产生的结果是否正确,并且格式符合预期。输出数据是否符合要求? 彻底的测试是确保功能的关键。...在这个步骤中,我发现能够将代码发布到审查应用程序或暂存服务器,并确认我在代码审查中的发现及其实际工作方式是很有帮助的。对于棘手的部分,我也倾向于搜索添加的单元测试。...是否有不正确的行为或缺少任何东西?接下来,仔细地逐步执行代码的逻辑。执行是否遵循从接收到的输入到最终输出的合理路径?寻找任何无意义的分支(比如总是为假的if语句)、无限循环或潜在的崩溃。...寻找特定于框架的输入清理函数或方法。 预处理语句:数据库查询是否始终使用预处理语句构建?检查框架方法,这些方法有助于防止SQL注入。 错误处理:代码是否避免向用户暴露原始错误消息或堆栈跟踪?

    60410

    独家 | 你的神经网络不起作用的37个理由(附链接)

    一切看起来都很好:梯度是逐渐变化的,损失在减少。但接下来的预测:都是零,所有的图像背景都没有被检测到。“我做错了什么?”——我问我的电脑,但它没有回答我。...你从哪里开始检查是否你的模型输出了垃圾(例如,预测输出了平均值,或者它的准确性真的很差)? 由于许多原因,神经网络可能不会进行训练。在许多调试过程中,我经常发现自己在做同样的检查。...确保输入连接到输出 检查一些输入样本是否有正确的标签。同时确保对输入样例进行打乱的方式与输出标签的相同。 5. 输入和输出之间的关系是否过于随机?...试着解决这个问题的简单版本 这将有助于找到问题所在。例如,如果目标输出是一个对象类和坐标,则尝试将预测限制为对象类。 17....例如,如果我们有10个类,随机意味着我们将在10%的时间内得到正确的类,而Softmax损失是正确类的概率的对数的相反数,所以:-ln(0.1) = 2.302。

    1.1K20

    12 Python 基础: 如何优化代码质量,错误、调试和测试你必须要懂.md

    此外,我们也需要跟踪程序的执行,查看变量的值是否正确,这个过程称为调试。Python的pdb可以让我们以单步方式执行代码。...用错误码来表示是否出错十分不便,因为函数本身应该返回的正常结果和错误码混在一起,造成调用者必须用大量的代码来判断是否出错: [image.png] 处理多种错误类 错误应该有很多种类,如果发生了不同类型的错误...调用堆栈 如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。...二分法: 简单来说就是,把长长的程序分成上下两部分来调试(从中间开始)。在中间进行输出,如果不能运行则向上继续使用二分法,能则向下使用二分法。以此类推,一直缩小范围,最大效率调试代码。...小结 写程序最痛苦的事情莫过于调试,程序往往会以你意想不到的流程来运行,你期待执行的语句其实根本没有执行,这时候,就需要调试了。

    1.6K30

    一文看懂 .NET 的异常处理机制、原则以及最佳实践

    然而大多数情况下我们都考虑使用 .NET 中自带的异常类,因此可以充分利用 Exception 类中的已有属性在特殊情况下报告更详细的利于调试的异常信息。...当然如果任务已全部完成,仅仅在对外通知的时候出现了异常,那么这个时候不需要恢复状态,因为实际上已经完成了任务。 你可能会有些担心如果我没有任何手段可以恢复错误怎么办?那这个时候就不要处理异常!...一段异常处理代码中可能没有 catch 块而有 finally 块,这个时候的重点是清理资源,通常也不知道如何正确处理这个错误。...而一些被认为是异常的情况下收到此事件则是正常的。...任何情况下都不应该抛出这些异常: 过于抽象,以至于无法表明其含义 Exception 这可是顶级基类,这都抛出来了,使用者再也无法正确地处理此异常了 SystemException 这是各种异常的基类,

    1.8K41

    你的神经网络不起作用的37个理由

    一切看起来都很好:梯度是逐渐变化的,损失在减少。但接下来的预测:都是零,所有的图像背景都没有被检测到。“我做错了什么?”——我问我的电脑,但它没有回答我。...你从哪里开始检查是否你的模型输出了垃圾(例如,预测输出了平均值,或者它的准确性真的很差)? 由于许多原因,神经网络可能不会进行训练。在许多调试过程中,我经常发现自己在做同样的检查。...试着解决这个问题的简单版本 这将有助于找到问题所在。例如,如果目标输出是一个对象类和坐标,则尝试将预测限制为对象类。 17....例如,如果我们有10个类,随机意味着我们将在10%的时间内得到正确的类,而Softmax损失是正确类的概率的对数的相反数,所以:-ln(0.1) = 2.302。...检查损失函数 如果你实现了自己的损失函数,请检查它是否有错误并添加单元测试。通常情况下,我的损失值会略微不正确,并小程度的降低网络的性能。 19.

    1.2K00

    Python 测试基础

    你怎么知道自己编写的程序管用呢?能指望你在任何时候编写的代码都没有缺陷吗?恕我直言,我想这不太可能。...诚然,在大多数情况下使用 Python 都很容易编写出正确的代码,但代码出现 bug 并非没有可能。 调试是程序员躲不开的宿命,是编程工作的有机组成部分。...这样以后就很容易核实需求是否确实得到了满足。不过很多程序员不喜欢撰写报告,更愿意让计算机替他们完成尽可能多的工作。好消息是,你可使用 Python 来描述需求,并让解释器检查是否满足了这些需求!...如果测试有错误,导致在任何情况下都能成功(这样的情况我遇到过很多次),那么它实际上什么都没有测试。不断重复这个过程:确定测试失败后,再试图让它成功。 编写让测试刚好能够通过的代码。...注意 如果这里编写的是真实函数,我将(或者说应该)根据前面制定的规则先编写文档字符串,再使用 doctest 运行脚本看看是否会失败,然后添加刚好让测试得以通过的代码(如使用测试语句来处理文档字符串中的具体输入

    1.8K10

    Spring MVC中@RequestParam参数绑定失败的排查与解决

    这次我遇到了一个在Spring MVC中非常常见的问题:使用@RequestParam注解获取请求参数时,参数值始终为null。这个问题虽然不复杂,但在特定环境下却容易被忽视,导致调试时间较长。...这让我感到非常困惑,因为代码看起来没有问题,而且之前类似的接口也正常工作过。问题分析首先,我怀疑是前端传参方式有问题。比如是否使用了GET方法?参数名是否正确?...request.getParameterMap()输出为空,说明请求参数根本没有被正确解析。...不过,由于项目使用的是默认配置,我暂时没有发现明显问题。4. 添加日志输出为了进一步确认问题,我在控制器类上添加了日志输出,观察请求是否到达该方法。结果发现请求确实到达了,但参数始终为null。5....于是,我查看了项目的配置类,发现确实有一个自定义的WebMvcConfigurer,用于处理某些特殊参数。但经过检查,这个配置并没有影响到@RequestParam的处理。10.

    36410

    Python学习笔记(八)·错误、调试和测试

    此外,我们也需要跟踪程序的执行,查看变量的值是否正确,这个过程称为调试。Python的pdb可以让我们以单步方式执行代码。 最后,编写测试也很重要。...8.1.2 调用栈 如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。...pdb单步调试效率要高很多,但也高不到哪去。...小结: 写程序最痛苦的事情莫过于调试,程序往往会以你意想不到的流程来运行,你期待执行的语句其实根本没有执行,这时候,就需要调试了。...并且,Python内置的“文档测试”(doctest)模块可以直接提取注释中的代码并执行测试。 doctest严格按照Python交互式命令行的输入和输出来判断测试结果是否正确。

    1.7K30

    我的第一个Linux内核贡献,被剥夺了!

    内核确实接收到所有信号,但仅在错误情况下响应其中的一些信号。 然后,它与我的“ps”输出相匹配,因为我看到某些线程未处于 pthread_stop 状态,然后 gdbserver 被挂起。...古老的问题往往源于简单的错误 Ariel 花了 3-4 天阅读 PowerPC 架构相关的提交描述以及task_struct的版本变化,却发现这个问题并没有在后续的内核版本得到解决。...这导致重要字段被 task_struct覆盖,例如__state存储进程状态的字段,内核还使用它来跟踪调试器停止了哪些进程等等。...又或者即便提交者的代码很糟糕,但也不应该很不屑的回复一句:我想用不同的方式修复它。毕竟,如果没有没有原始代码,我们连重构修复的机会都没有。...一旦他对我的工作的正确性感到满意,他就合并了补丁,一切都很好。我从未要求过,也没有得到过任何荣誉。” 希望这样的情况能够得到改善,否则会让一些开源贡献者们失去对“开源”的热爱。

    68310

    Java常见的几大代码

    在过去我曾经注意过一个方法,并且相信它是被调用的,花了很多时间去找这个错误。这个错误的表现就是你的方法不会被调用,你以为你的方法已经被跳过了。一种可行的解决方法就是增加一条打印输出语句。...或者是使用跟踪调试程序(例如VJ++或者是Borland JBuilder)来一行一行的调试。如果你的方法还不能被调用,那很可能就是你的方法名键入错误了。...这个函数结束以后,将会返回到控制调用函数去,这时候那个“真正的”值没有收到影响,没有任何改变被存储。 如果你想修改一个简单的数据类型,可以将这个数据类型定位一个返回值或者将它封装到一个对象中。...但是如果真的发生了错误,你不会得到一个错误信息的输出,它使得不太可能发现错误的原因。甚至是最简单的一场处理都是很有用处的。...他是很简单的,但是有时我们看着一个没有大写的变量或者方法却并不能发现这个错误。我自己也常常感到困惑,因为我认为这些方法和变量都是存在的,但是却发现不了他们没有大写。

    62030

    【深度学习】深度学习中的单元测试

    提高了对单元本身的信心,因为如果它通过了单元测试,我们可以确定逻辑没有明显的错误,并且单元按预期运行。 调试变得更容易,因为你可以知道哪个单元失败了,以及哪些特定的测试用例失败了。...TestCase子类的测试方法应该在名称中有test前缀,并执行特定的测试代码。 为了执行测试,TestCase基类有几个assert方法,允许你对照被测试单元的输出检查测试用例的输出。...任何其他异常都将被视为错误。 有两种类型的setup方法可用于为测试设置类。 setUp -这将在类中的每个测试方法之前调用。 setUpClass-整个类只运行一次。...如果所有的测试方法都通过了,那么最后会收到一条OK消息。 但是,如果任何一个测试方法失败,你将得到一条失败消息,其中指定了失败的测试。你会知道哪个断言失败了。...如前所述,这对调试和查找破坏代码的原因非常有帮助。在本例中,我更改了正在读取的图像,但没有更改正在比较的张量,这导致了错误。

    2.6K20

    笨办法学 Python · 续 练习 30:有限状态机

    这很好很强大,因为这意味着即使没有发生任何事情,你也可以将 FSM 转换到新的状态。然而,实际上,“没有”往往是隐含的事件“再来一次”或“醒来”。...在其他情况下,这个状态的意思是,“不确定,也许下一个事件会告诉我是什么状态。” FSM 的力量是能够明确地说明每个事件,事件只是正在接收的数据。...这使得它们非常容易进行调试,测试和正确实现,因为你确切地知道每个状态的可能性,以及在每个状态中,对于每个事件可能发生的情况。...最后,你可以使用一个设计,其中有一个FSMRunner类,它只知道如何运行这样设计的模块。这比一个知道如何运行自身实例的单一类有一些优点,但也有一些问题。例如,FSMRunner如何跟踪当前状态?...使用 FSM 处理事件的最大优点之一是,可以存储和记录 FSM 收到的所有事件和状态。这可以让你调试,为什么它达到你不需要的状态。 深入学习 你应该仔细研究 FSM 背后的数学。

    74520

    写了个数据查询为空的 Bug,你会怎么办?

    遇到此类问题,其实是有经典的解决套路的,下面鱼皮给大家分享如何高效解决这个问题。只需 4 个步骤:解决步骤1、定位问题边界首先要定位数据查询为空的错误边界。说简单一点,就是要确认是前端还是后端的锅。...可以多用 debugger 或 console.log 等方式输出信息,便于调试。...星球同学可以免费阅读前端嘉宾神光的《前端调试通关秘籍》:https://t.zsxq.com/13Rh4xxNK如果发现后端未返回数据,那么前端需要先确认下自己传递的参数是否正确。...即使前端说自己请求是正确的,但也必须要优先验证,而不是一上来就去分析数据库和后端程序逻辑的问题。验证请求参数对象没问题后,接着逐行 Debug,直到要执行数据库查询。...比较典型的错误场景是查询出的结果设置到了错误的字段中、或者由于权限问题被过滤和脱敏掉了。最后以后再遇到数据查询为空的情况,按照以上步骤排查问题即可。

    74510

    keil调试程序的断点设置技巧

    这几天整同事留下来的项目的BOM,很简单的错误,弄的头大,看下文章分下神, 值得尝试一下这个调试方法。 程序运行过程中,有些数据被莫名修改了,在哪里修改的?又是怎么修改的?...这个代码我只想知道是否运行过,或者运行了多少次,但是不想让程序停下来,或者仅打印调试信息,怎么办?当这个变量设置成某个数据后,我想让程序自动暂停下来进行分析,怎么办?...;比如两个设备通信,一方采用常规断点的方式调试,肯定会打断正常的通信过程,而这可不是我们想要的,我们只想知道在收到或发送数据后得到环境快照,而并不想让程序停下来。...原因就在于打印输出时间太久,打乱了程序运行的节奏(而这也是我推荐使用 ITM 调试的一个原因,因为它的输出效率比串口要高得多),或者打印函数本身有问题,也会导致程序运行出现问题。...d) 表达式错误 检查你的表达式是否正确,注意如果你使用了运算符,那么对于浮点变量的支持好像并不正常,不管你怎么设置,都说表达式错误。

    6.1K12
    领券