Exception in thread "main" java.lang.NoSuchMethodError

本文详细解析了在Java编程中遇到NoSuchMethodError异常的原因及解决方法,主要关注于jar包冲突引发的问题,并提供了检查和解决冲突的具体步骤。

原文链接:https://blog.youkuaiyun.com/yzl_8877/article/details/53216923

今天编程又碰到了这个异常。以前碰到了也很少总结,今天就来说一下这个异常发生的几种情况:

(1).第一个常见原因jar包中确实没有这个方法,所以虚拟机根本没有加载这个方法。

(2).第二个常见原因是jar包冲突了。导致虚拟机不知道加载哪一个,所以就导致了加载失败,从而找不到这个方法。

(3).第三个,也许就是包含在第二种情况中,该方法只有抽象定义,而没有具体实现。我今天的遇到的是第二种吧。

闲话不说,直接贴出异常:

Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
 at org.apache.commons.logging.impl.SLF4JLocationAwareLog.debug(SLF4JLocationAwareLog.java:133)
 at org.apache.http.client.protocol.RequestAuthCache.process(RequestAuthCache.java:76)
 at org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java:132)
 at org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor.java:166)
 at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:485)
 at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882)
 at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
 at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
 at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:498)
 at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:262)
 at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:251)
 at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:149)
 at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:106)
 at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:71)
 at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:85)
 at com.solr.insertData.InsertProgarm.main(InsertProgarm.java:40)

出现这样的问题,如何去追踪:

(1).当然是看看我们引入的jar包是否有冲突,按快捷键ctrl+shift+T,输入类名,看看工程下面有几个jar包包含该类:

我的工程是solr_web,所以有三个地方出现了org.slf4j.spi.LocationAwareLogger这个类,不过我不知道工程是加载的哪一个?因此使用下面的语句来查询工程实际加载的是哪一个:

URL urlOfClass = InsertProgarm.class.getClassLoader().getResource("org/slf4j/spi/LocationAwareLogger.class"); //InsertProgarm是该语句所在的类
 System.out.println(urlOfClass);

输出结果:

jar:file:/E:/Program%20Files/myeclipse/plugins/com.genuitec.eclipse.j2eedt.core_11.5.0.me201311281640/data/libraryset/EE_6/bean-validator.jar!/org/slf4j/spi/LocationAwareLogger.class

因此加载的是myeclipse自带的包,去反编译下这个包:

这个jar包里有对该接口的实现,所以这个还是jar包冲突了。

我这里去掉了myeclipse自带的jar包。选中你的项目(我这里是solr_web),右键-->properties-->Java Build Path,修改JavaEE6.0 Gerneric Library,去掉MyEclipse自带的冲突jar

确定修改,重新运行,OK!

好的,这是一个关于线程优先级和动态创建静态创建线程的问题,需要结合操作系统的知识进行回答。下面是我的回答: 首先,利用RT-Thread设计三个线程,其中线程thread1动态创建,而线程thread2和Thread Flag3是静态创建。代码如下: ```c #include <rtthread.h> #include <rtdevice.h> /* thread1 entry */ static void thread1_entry(void* parameter) { while(1) { rt_thread_mdelay(1000); // 延时1s } } /* thread2 entry */ static void thread2_entry(void* parameter) { while(1) { rt_kprintf("thread2 is running!\n"); rt_thread_mdelay(500); // 延时0.5s } } /* thread flag3 entry */ static void thread_flag3_entry(void* parameter) { rt_uint32_t count = 0; rt_uint8_t flag = 0; while(1) { if(count < 5) { flag = 1; } else if(count >= 5 && count < 10) { flag = 0; } else { count = 0; flag = 1; } rt_thread_delay(10); // 延时10个OSTicks rt_hw_interrupt_set_flag(RT_THREAD_FLAG_GET(), flag); // 设置线程标志 count++; } } int main(void) { /* 创建thread1 */ rt_thread_t thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 512, 25, 5); if(thread1 != RT_NULL) { rt_thread_startup(thread1); } /* 创建thread2 */ rt_thread_t thread2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 512, 24, 5); if(thread2 != RT_NULL) { rt_thread_startup(thread2); } /* 创建thread flag3 */ rt_thread_t thread_flag3 = rt_thread_create("thread_flag3", thread_flag3_entry, RT_NULL, 512, 26, 5); if(thread_flag3 != RT_NULL) { rt_thread_startup(thread_flag3); } return 0; } ``` 其中,线程thread1的优先级为25,线程thread2的优先级为24,Thread Flag3的优先级高于thread1。 其次,优先级较高的Thread2抢占低优先级的thread1,执行完毕后自动被系统脱离。优先级较低的thread1被设计成死循环,循环中有让出CPU使用权的动作,使用了delay函数。该线程在Thread2退出运行之后开始运行,每隔一段时间运行一次,并一直循环运行下去。Thread Flag3实现一个周期为10个OSTicks的方波,要求在thread1和thread2中添加代码,能够在虚拟逻辑分析仪中观察到对应的状态。 在thread1和thread2中添加代码,能够在虚拟逻辑分析仪中观察到对应的状态,代码如下: ```c /* thread1 entry */ static void thread1_entry(void* parameter) { while(1) { rt_thread_mdelay(1000); // 延时1s rt_hw_interrupt_set_flag(RT_THREAD_FLAG_GET(), 1); // 设置线程标志 } } /* thread2 entry */ static void thread2_entry(void* parameter) { while(1) { rt_kprintf("thread2 is running!\n"); rt_thread_mdelay(500); // 延时0.5s rt_hw_interrupt_set_flag(RT_THREAD_FLAG_GET(), 0); // 设置线程标志 } } ``` 这样,在虚拟逻辑分析仪中就可以观察到对应的状态了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值