在 catch 子句中,我想打印异常的跟踪:
try {
...
} catch (Exception exc) {
exc.printStackTrace();
...
}
但在某些情况下,我没有得到堆栈跟踪,而是看到类似这样的内容:
Exception in thread "pool-1-thread-2" java.lang.AbstractMethodError: java.lang.Exception.printStackTrace()V
...
通常,如果库在运行时的版本与编译时的版本不同,就会发生此异常,但在这种情况下,我使用的是 Java 库中的类。 printStackTrace 是在 Throwable 中实现的,所以这个方法在 Exception 或任何派生类中都不能是抽象的。此外,这个 AbstractMethodError 并不总是被抛出,有时在这个特定的 catch 子句中还有其他异常(程序流取决于文件中的数据和当前时间,所以有时会发生其他事情,例如我自己的代码中抛出的 ArrayIndexOutOfBoundsExceptions 或 IllegalStateExceptions并且我期望而不是奇怪的错误)。
因此,问题是:特定的 AbstractMethodError 怎么可能发生?
PS:我在 Linux 上使用 Eclipse Helios 并使用 JDK 1.6.0_24 作为运行时环境来启动我的应用程序。
编辑 有一个拼写错误 (printStrackTrace),我更正了它。只是出于我的想法而写的,与我的问题没有任何关系。它是(或应该是)一个独立的应用程序,没有 Web 应用程序,没有 Eclipse RCP 应用程序,只是一个普通的旧 Java 应用程序(或多或少)。该问题也发生在另一台计算机上 - 也发生在 Eclipse Helios 上,也发生在 Fedora Linux 上,但使用的是 JDK 1.6.0_21。
令我惊讶的是,确实可以调用 getClass().getName() (但我没有尝试过其他方法),异常类型为 java.lang.ArrayIndexOutOfBoundsException .我只是尝试使用 OpenJDK 1.6.0(因为它已经安装在我的系统上)并得到了不同的结果。而不是抛出 AbstractMethodError , printStackTrace只打印一个空行和 getMessage()返回 null (而不是抛出错误)。所以我不知道异常到底是在哪里抛出的,因为层次结构中较高的 try-catch-block 捕获异常只是为了优雅地停止应用程序的一部分。我可能会在某些点上捕捉到这种异常类型,以了解它的来源。但这并不能解释异常本身的奇怪行为。
编辑 2: 最后我找到了问题所在。原来是昨天在同一行发生在我身上的异常,但有时异常本身表现得很奇怪。我调用get(int)在 List 上(更准确地说:使用 ArrayList 包装的 Collections.unmodifiableList(List) )索引为 -1 (这是初始值,在循环中应该更改此索引,但无论出于何种原因都不会更改)。至少现在我知道去哪里修复 ArrayIndexOutOfBoundsException ,但我仍然不知道为什么异常本身表现得很奇怪。
编辑 3: 我试过 Throwable.class.getMethod("printStackTrace").invoke(exc);而不是 exc.printStackTrace();得到一个 java.lang.NoSuchMethodError: java.lang.Throwable.printStackTrace()V而不是 java.lang.AbstractMethodError .我还尝试使用 javac 从 shell 编译 java 文件和 jar (只有一个异常来自一个库,因为手动编译所有 jar 会很乏味)。结果是一样的。如果我抛出 IndexArrayOutOfBoundsException我自己在那一行,堆栈跟踪将被打印得很好。也许我不得不希望这个问题非常罕见,永远不会在其他任何地方发生。
最佳答案
据我所知,您已经在 Eclipse Helios 中启动了您的应用程序。这可能是因为 Eclipse 具有 OSGi 和专用类加载器的模块化原因:用于运行应用程序的 ClassLoader 层次结构可能会导致无效链接。这主要取决于所关注的异常类以及您在应用程序类路径中包含哪些 jar 文件 - 您自己的 jar 之一可能与 Eclipse 本身使用的 jar 文件冲突。您可以提供更多详细信息吗?
我猜你用“java 应用程序”运行配置来启动它。您是否选中了复选框之一,例如“包括系统库”或“包括继承的主要”或任何其他选项?
顺便说一句,您的应用程序最终将作为独立的 Java 虚拟机运行,并且它应该在该上下文中完美运行。
如果不是这种情况,请使用 -verbose:class 命令行选项运行您的 java 应用程序并在崩溃前检查输出中的最新行,您可能会得到有关冲突库的线索 (与编译时相比,运行时不同)。
关于java - 调用 Exception.printStackTrace 时出现 AbstractMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6777710/
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt