NoSuchMethodError
আমার জাভা প্রোগ্রামটি চালানোর সময় আমি একটি ত্রুটি পাচ্ছি। কী ভুল এবং আমি কীভাবে এটি ঠিক করব?
NoSuchMethodError
আমার জাভা প্রোগ্রামটি চালানোর সময় আমি একটি ত্রুটি পাচ্ছি। কী ভুল এবং আমি কীভাবে এটি ঠিক করব?
উত্তর:
কোনও তথ্য ছাড়াই সমস্যাটি চিহ্নিত করা কঠিন, তবে এর মূল কারণটি হ'ল আপনি সম্ভবত ক্লাসের বিভিন্ন সংস্করণের বিপরীতে একটি ক্লাস সংকলন করেছেন যা কোনও পদ্ধতি অনুপস্থিত রয়েছে, চালনার সময় আপনি যেটি ব্যবহার করছেন তার চেয়ে বেশি।
স্ট্যাক ট্রেসটি দেখুন ... লাইব্রেরির কোনও অবজেক্টে কোনও পদ্ধতি কল করার সময় যদি ব্যতিক্রমটি উপস্থিত হয়, আপনি সংকলন এবং চলমান অবস্থায় সম্ভবত লাইব্রেরির পৃথক সংস্করণ ব্যবহার করছেন। আপনার উভয় জায়গাতেই সঠিক সংস্করণ রয়েছে তা নিশ্চিত করুন।
আপনি তৈরি ক্লাস দ্বারা তাত্ক্ষণিকভাবে অবজেক্টগুলিতে কোনও পদ্ধতি কল করার সময় যদি ব্যতিক্রমটি উপস্থিত হয়, তবে আপনার বিল্ড প্রক্রিয়াটি ত্রুটিযুক্ত বলে মনে হচ্ছে। আপনি কম্পাইল করার সময় আপনি যে ক্লাসের ফাইলগুলি চালাচ্ছেন সেগুলি আপডেট হয়েছে তা নিশ্চিত করুন।
Caused by
অপরাধী শ্রেণি /
আমার আপনার সমস্যা ছিল, এবং আমি এটি ঠিক করেছি। নিম্নলিখিত পদক্ষেপগুলি একটি লাইব্রেরি যুক্ত করার একটি কার্যকরী উপায়। আমি প্রথম দুটি পদক্ষেপটি ঠিকঠাক করেছি, তবে আমি আমার ग्रहण প্রকল্পের ".jar" ফাইলটি সরাসরি ফাইল সিস্টেম থেকে সরাসরি "লিবিব" ফোল্ডারে টেনে নিয়ে গিয়েছিলাম না। অতিরিক্তভাবে, আমাকে বিল্ড পাথ এবং "লিবিব" ফোল্ডার উভয় থেকে গ্রন্থাগারের পূর্ববর্তী সংস্করণটি সরিয়ে ফেলতে হয়েছিল।
মনে রাখবেন যে প্রতিবিম্বের ক্ষেত্রে আপনি NoSuchMethodException
অ-প্রতিবিম্বিত কোড সহ একটি পাবেন NoSuchMethodError
। একজনের বিপরীতে যখন আমার মুখোমুখি হয় তখন আমি খুব আলাদা জায়গায় সন্ধান করি।
আপনার যদি জেভিএম প্যারামিটারগুলি পরিবর্তন করার অ্যাক্সেস থাকে তবে ভার্বোজ আউটপুট যুক্ত করার ফলে কোন জেআর ফাইলগুলি থেকে কোন ক্লাসগুলি লোড হচ্ছে তা আপনাকে দেখার অনুমতি দেওয়া উচিত।
java -verbose:class <other args>
আপনার প্রোগ্রামটি চলাকালীন, জেভিএমকে স্ট্যান্ডার্ড আউট তথ্য যেমন:
...
[জুনিট.ফ্রেমে ওয়ার্ক লোড করা হয়েছে file ফাইল থেকে সন্নিবেশ: / সি: / প্রোগ্রাম ১০০ ফাইলেস / জুনিট 3.৮.২ / জুনিট.জার]
...
এটি সাধারণত অ্যাপাচি পিঁপড়ার মতো বিল্ড সিস্টেম ব্যবহার করার সময় ঘটে থাকে যখন জাভা ফাইলগুলি ক্লাস ফাইলের চেয়ে নতুন হয় কেবল তখনই জাভা ফাইলগুলি সংকলন করে। যদি কোনও পদ্ধতিতে স্বাক্ষর পরিবর্তন হয় এবং ক্লাসগুলি পুরানো সংস্করণ জিনিসগুলি ব্যবহার করা হত তবে সঠিকভাবে সংকলন করা যাবে না। স্বাভাবিক ফিক্সটি হল একটি সম্পূর্ণ পুনর্নির্মাণ (সাধারণত "পিঁপড়া পরিষ্কার" তারপরে "পিঁপড়ে")।
কখনও কখনও এটি একটি লাইব্রেরির একটি সংস্করণের বিপরীতে সংকলন করার সময় কিন্তু ভিন্ন সংস্করণের বিপরীতে চলার সময়ও হতে পারে।
যদি মাভেন বা অন্য কোনও কাঠামো ব্যবহার করে থাকেন এবং আপনি প্রায় এলোমেলোভাবে এই ত্রুটিটি পান তবে একটি পরিষ্কার ইনস্টল চেষ্টা করুন ...
clean install
আপনি যদি বস্তুটি লিখে থাকেন এবং আপনি জানেন যে এটির পদ্ধতি রয়েছে তবে এটি কাজ করে especially আমার জন্য কাজ করেছেন।
এটি প্রতিবিম্ব ব্যবহারের ফলাফলও হতে পারে। যদি আপনার এমন কোড থাকে যা কোনও শ্রেণিতে Class.getDeclaredMethod("someMethodName", .....)
প্রতিবিম্বিত হয় এবং নাম অনুসারে একটি পদ্ধতি বের করে (উদাহরণস্বরূপ: সাথে ) তবে যে কোনও সময় সেই পদ্ধতির নাম পরিবর্তিত হয়, যেমন একটি রিফ্যাক্টরের সময়, আপনাকে ম্যাচটি মেলে প্রতিফলনের পদ্ধতিতে পরামিতিগুলি আপডেট করতে হবে নতুন পদ্ধতি স্বাক্ষর, বা getDeclaredMethod
কল একটি নিক্ষেপ করবে NoSuchMethodException
।
যদি এই কারণ হয়, তবে স্ট্যাক ট্রেসটি প্রতিফলন পদ্ধতিটি চাওয়া হয়েছে এমন বিন্দুটি দেখানো উচিত এবং আপনাকে আসল পদ্ধতির স্বাক্ষরের সাথে মিলিয়ে যাওয়ার জন্য প্যারামিটারগুলি আপডেট করতে হবে।
আমার অভিজ্ঞতায়, ইউনিট যখন ব্যক্তিগত পদ্ধতি / ক্ষেত্রগুলি TestUtilities
পরীক্ষা করে এবং পরীক্ষার যাচাইয়ের জন্য ক্ষেত্রগুলি বের করতে একটি ক্লাস ব্যবহার করে তখন মাঝে মাঝে এটি উপস্থিত হয় । (সাধারণত উত্তরাধিকারের কোডটি যা ইউনিট পরীক্ষার বিষয়টি মাথায় রেখে তৈরি করা হয়নি))
আপনি যদি কোনও ওয়েব অ্যাপ লিখছেন তবে নিশ্চিত হয়ে নিন যে আপনার ধারকের গ্লোবাল লাইব্রেরি ডিরেক্টরিতে এবং আপনার অ্যাপ্লিকেশনটিতে কোনও জারের বিবাদী সংস্করণ নেই। ক্লাস লোডার কোন জারটি ব্যবহার করছে তা আপনি অগত্যা জানেন না।
যেমন
একই সমস্যা একই দুটি ক্লাসে একই জিনিস ব্যবহারের কারণে এই সমস্যাগুলি দেখা দেয়। ব্যবহৃত অবজেক্টগুলিতে নতুন পদ্ধতি থাকে না তা যুক্ত করা হয়েছে যে নতুন অবজেক্ট শ্রেণিতে রয়েছে।
উদা:
filenotnull=/DayMoreConfig.conf
16-07-2015 05:02:10:ussdgw-1: Open TCP/IP connection to SMSC: 10.149.96.66 at 2775
16-07-2015 05:02:10:ussdgw-1: Bind request: (bindreq: (pdu: 0 9 0 [1]) 900 900 GEN 52 (addrrang: 0 0 2000) )
Exception in thread "main" java.lang.NoSuchMethodError: gateway.smpp.PDUEventListener.<init>(Lgateway/smpp/USSDClient;)V
at gateway.smpp.USSDClient.bind(USSDClient.java:139)
at gateway.USSDGW.initSmppConnection(USSDGW.java:274)
at gateway.USSDGW.<init>(USSDGW.java:184)
at com.vinaphone.app.ttn.USSDDayMore.main(USSDDayMore.java:40)
-bash-3.00$
এই সমস্যাগুলি সমগতি সম্পন্ন 02 টি একই বর্গ দ্বারা সৃষ্ট হয় (এসআরসি-তে 1, জার ফাইলে 1 এখানে গেটওয়ে.জার রয়েছে)
আমি আমার Eclipse পুনরায় চালু করে অ্যাপ্লিকেশনটি চালিয়ে এই ত্রুটিটি সমাধান করেছি। আমার মামলার কারণ হতে পারে কারণ আমি আমার প্রকল্প বা গ্রহনটি বন্ধ না করে আমার উত্স ফাইলগুলি প্রতিস্থাপন করব। যার ফলে আমি ক্লাসের বিভিন্ন সংস্করণ ব্যবহার করছিলাম।
এই উপায়টি ব্যবহার করে দেখুন: আপনার প্রকল্প ডিরেক্টরিগুলির অধীনে সমস্ত .class ফাইলগুলি সরিয়ে দিন (এবং অবশ্যই, সমস্ত উপ ডিরেক্টরি)। পুনর্নির্মাণ।
কখনও কখনও mvn clean
(যদি আপনি maven ব্যবহার করছেন) ম্যানুয়ালি তৈরি ক্লাস ফাইলগুলি পরিষ্কার করে না javac
। এবং সেই পুরানো ফাইলগুলিতে পুরানো স্বাক্ষর রয়েছে, যা বাড়ে NoSuchMethodError
।
কেবলমাত্র বিদ্যমান উত্তরের সাথে যুক্ত করা হচ্ছে। আমি গ্রহনে টমক্যাট নিয়ে এই সমস্যার মুখোমুখি ছিলাম। আমি একটি ক্লাস পরিবর্তন করেছি এবং নিম্নলিখিত পদক্ষেপগুলি করেছি,
ক্লিপ প্রকল্পটি ক্লিপ করে নির্মাণ করেছেন
এমভিএন ক্লিন ইনস্টল
তবুও আমি একই ত্রুটির মুখোমুখি হয়েছি। তারপরে আমি টমকাট পরিষ্কার করেছি, টমক্যাট ওয়ার্কিং ডিরেক্টরি পরিষ্কার করেছি এবং সার্ভার পুনরায় চালু করেছি এবং আমার সমস্যাটি শেষ হয়ে গেছে। আশা করি এটি কাউকে সাহায্য করবে
মূল প্রশ্নের উত্তর দিতে। জাভা ডক্স অনুসারে এখানে :
"NoSuchMethodError" যদি কোনও অ্যাপ্লিকেশন কোনও শ্রেণীর নির্দিষ্ট পদ্ধতি (স্থির বা উদাহরণস্বরূপ) কল করার চেষ্টা করে, এবং সেই শ্রেণীর আর সেই পদ্ধতির কোনও সংজ্ঞা না থাকে তবে ছুঁড়ে দেওয়া হয়।
সাধারণত, এই ত্রুটিটি সংকলক দ্বারা ধরা পড়ে; এই ত্রুটিটি কেবল রান সময়ে ঘটতে পারে যদি কোনও শ্রেণির সংজ্ঞা অসম্পূর্ণভাবে পরিবর্তিত হয়।
আমি জুনিট টেস্ট ফাইলটির নাম পরিবর্তন করে এই সমস্যাটি Eclipse এ ঠিক করেছি।
আমার Eclipse কাজের জায়গাতে আমার কাছে একটি অ্যাপ প্রকল্প এবং একটি পরীক্ষার প্রকল্প রয়েছে।
নির্মাণ প্রকল্পে প্রয়োজনীয় প্রকল্প হিসাবে টেস্ট প্রকল্পটিতে অ্যাপ প্রকল্প রয়েছে has
NoSuchMethodError পেতে শুরু করেছেন।
তখন আমি বুঝতে পারলাম টেস্ট প্রকল্পের ক্লাসটির অ্যাপ্লিকেশন প্রকল্পের ক্লাসটির একই নাম ছিল।
App/
src/
com.example/
Projection.java
Test/
src/
com.example/
Projection.java
পরীক্ষার নামটির পরে সঠিক নাম "প্রজেকশন টেস্ট.জভা" রেখে ব্যতিক্রমটি চলে যায়।
আমার একই ত্রুটি ছিল:
Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonGenerator.writeStartObject(Ljava/lang/Object;)V
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:151)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3681)
at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3057)
এটি সমাধান করার জন্য আমি প্রথমে যাচাই করেছিলাম, গ্রন্থাগারের (ইন্টেলিজ আইডিইএ) মধ্যে দ্বন্দ্বটি ঠিক কোথায় ছিল তা বুঝতে মডিউল নির্ভরতা ডায়াগ্রাম ( click in your POM the combination -> Ctrl+Alt+Shift+U
বা right click in your POM -> Maven -> Show dependencies
)। আমার বিশেষ ক্ষেত্রে আমার জ্যাকসন নির্ভরতার বিভিন্ন সংস্করণ ছিল।
1) সুতরাং, আমি প্রকল্পের আমার POM এ সরাসরি যুক্ত করেছিলাম সর্বোচ্চ সংস্করণ - এই দুটির মধ্যে 2.8.7।
বৈশিষ্ট্যে:
<jackson.version>2.8.7</jackson.version>
এবং নির্ভরতা হিসাবে:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
2) তবে এটি নির্ভরতা বহির্ভূততা ব্যবহার করেও সমাধান করা যেতে পারে ।
উদাহরণ হিসাবে নীচের মত একই নীতি দ্বারা:
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
অযাচিত সংস্করণ সহ নির্ভরতা আপনার প্রকল্প থেকে বাদ দেওয়া হবে।
আমার ক্ষেত্রে আমার একাধিক মডিউল প্রকল্প com.xyz.TestClass
ছিল এবং দৃশ্যটি মডিউলে A
যেমন ছিল তেমনই মডিউল B
এবং মডিউলটিতে মডিউল A
নির্ভর ছিল B
। সুতরাং অ্যাসেম্বলি জারটি তৈরি করার সময় আমি মনে করি ক্লাসের কেবল একটি সংস্করণ বজায় রাখা হয়েছিল যদি সেই অনুরোধ পদ্ধতিটি না থাকে তবে আমি NoSuchMethodError
রানটাইম ব্যতিক্রম পাচ্ছিলাম , তবে সংকলনটি ছিল ঠিক fine
সম্পর্কিত: https://reflectoring.io/nosuchmethod/
উপরের উত্তরটি খুব ভালভাবে ব্যাখ্যা করেছে .. একটি জিনিস যুক্ত করতে সামঞ্জস্য করুন যদি আপনি গ্রিপস ব্যবহার করে সিটিআরএল + শিফট + টি ব্যবহার করেন এবং ক্লাসের প্যাকেজ কাঠামো প্রবেশ করেন (যেমন: গেটওয়ে.এসএমপিপিপিডিইউইভেন্টলিস্টনার), আপনি সেখানে উপস্থিত সমস্ত জার / প্রকল্পগুলি দেখতে পাবেন । ক্লাসপথ থেকে অপ্রয়োজনীয় জারগুলি সরিয়ে ফেলুন বা উপরে শ্রেণীর পথে যুক্ত করুন। এখন এটি সঠিকটি বাছাই করবে।
আমি একই ইস্যু মধ্যে দৌড়ে।
Caused by: java.lang.NoSuchMethodError: com.abc.Employee.getEmpId()I
অবশেষে আমি সনাক্ত করলাম মূল কারণটি ভেরিয়েবলের ডেটা ধরণের পরিবর্তন করছিল।
Employee.java
-> ভেরিয়েবল ( EmpId
) থাকে যার ডেটা টাইপ থেকে পরিবর্তিত int
হয়েছে String
।ReportGeneration.java
-> গেটর ব্যবহার করে মানটি পুনরুদ্ধার করে getEmpId()
।আমাদের কেবলমাত্র পরিবর্তিত ক্লাসগুলি অন্তর্ভুক্ত করে জারটিকে পুনরায় ফিরিয়ে আনার কথা রয়েছে। আমার কোনও পরিবর্তন হয়নি ReportGeneration.java
বলে কেবল Employee.class
জার ফাইলটিতে অন্তর্ভুক্ত ছিল। ReportGeneration.class
সমস্যাটি সমাধান করার জন্য আমাকে ফাইলটি জারে অন্তর্ভুক্ত করতে হয়েছিল।
আমারও একই সমস্যা ছিল ক্লাসে অস্পষ্টতা দেখা দিলে এটিও ঘটে। আমার প্রোগ্রামটি এমন একটি পদ্ধতিতে চেষ্টা করার চেষ্টা করছিল যা একই অবস্থান / শ্রেণির পথে উপস্থিত দুটি জেআর ফাইলগুলিতে উপস্থিত ছিল। একটি জেআর ফাইল মুছুন বা আপনার কোডটি কার্যকর করুন যাতে কেবলমাত্র একটি জেআর ফাইল ব্যবহৃত হয়। আপনি একই জেআর বা একই জেআর একই সংস্করণের বিভিন্ন সংস্করণ ব্যবহার করছেন না তা পরীক্ষা করুন Check
ডিআইএসপি_সেক্সেসিপশন [পদক্ষেপ] [] [জেড-জাভা -১৫৫ জাভা ব্যতিক্রম জাভা.এলং.নোসুচমথোডেরর (com.example.yourmethod)]
বেশিরভাগ সময় java.lang.NoSuchMethodError ধরা পড়ে সংকলক হতে পারে তবে কখনও কখনও রানটাইম হতে পারে। যদি এই ত্রুটিটি রানটাইমের সময়ে ঘটে থাকে তবে একমাত্র কারণ ক্লাস কাঠামোর পরিবর্তনের কারণেই এটি বেমানান।
সেরা ব্যাখ্যা: https://www.jorterdev.com/14538/java-lang-nosuchmethoderror
আমিও এই ত্রুটির মুখোমুখি হয়েছি।
আমার সমস্যাটি হ'ল আমি কোনও পদ্ধতির স্বাক্ষর পরিবর্তন করেছি, এরকম কিছু
void invest(Currency money){...}
মধ্যে
void invest(Euro money){...}
এই পদ্ধতিটির অনুরূপ প্রসঙ্গ থেকে আহ্বান করা হয়েছিল
public static void main(String args[]) {
Bank myBank = new Bank();
Euro capital = new Euro();
myBank.invest(capital);
}
সংকলক সতর্কবাণী / ত্রুটির বিষয়ে নীরব ছিল, কারণ মূলধন উভয়ই মুদ্রার পাশাপাশি ইউরোও।
সমস্যাটি এই কারণে এসেছিল যে আমি কেবল ক্লাসটিই সংকলন করেছি যেখানে পদ্ধতিটি সংজ্ঞায়িত হয়েছিল - ব্যাংক, তবে যে শ্রেণি থেকে পদ্ধতিটি আহ্বান করা হচ্ছে তা নয়, যার মূল () পদ্ধতি রয়েছে।
এই সমস্যাটি এমন কোনও বিষয় নয় যা আপনি প্রায়শই মুখোমুখি হতে পারেন, কারণ প্রায়শই প্রকল্পটি ম্যানুয়ালি পুনর্নির্মাণ করা হয় বা একটি পরিবর্তিত শ্রেণীর সংকলন না করে একটি বিল্ড অ্যাকশন স্বয়ংক্রিয়ভাবে ট্রিগার হয়।
আমার ইউজকেসটি হ'ল আমি একটি জাজার ফাইল তৈরি করেছি যা হটফিক্স হিসাবে ব্যবহার করা উচিত, এতে অ্যাপক্লাস থাকে না কারণ এটি সংশোধিত হয়নি। এটি প্রাথমিকভাবে যুক্তির বেস শ্রেণীর গর্তের উত্তরাধিকার রেখেছি বলে এটিকে অন্তর্ভুক্ত না করার বিষয়টি আমার কাছে বোধগম্য হয়েছিল।
কথাটি হ'ল, আপনি যখন একটি ক্লাস সংকলন করেন, ফলস্বরূপ বাইটকোড এক ধরণের স্থির , অন্য কথায়, এটি একটি হার্ড-রেফারেন্স ।
মূল বিচ্ছিন্ন করা বাইটকোড (জাভাপ সরঞ্জাম দিয়ে উত্পন্ন) এর মতো দেখাচ্ছে:
#7 = Methodref #2.#22 // Bank.invest:(LCurrency;)V
ClassLoader নতুন সংকলিত Bank.class লোড করার পরে, এটি এমন কোনও পদ্ধতি খুঁজে পাবে না, এটি প্রদর্শিত হয় যেন এটি সরিয়ে নেওয়া হয়েছে এবং পরিবর্তিত হয়নি, এইভাবে নামযুক্ত ত্রুটি।
আশাকরি এটা সাহায্য করবে.
আমার গ্রেডেল প্রকল্পটি ইন্টেলিজ ব্যবহার করে একই ধরণের সমস্যা হয়েছিল had .Gradle (নীচের স্ক্রিনশট দেখুন) প্যাকেজটি মুছে ফেলে এবং প্রকল্পটি পুনর্নির্মাণ করে আমি এটি সমাধান করেছি। .গ্রাডেল প্যাকেজ
NoSuchMethodError: আমি এই সমস্যাটি সমাধান করতে কয়েক ঘন্টা ব্যয় করেছি, অবশেষে কেবলমাত্র প্যাকেজের নাম পরিবর্তন করে পরিষ্কার এবং বিল্ড করে এটি ঠিক করেছি ... ক্লাসের নাম বা প্যাকেজের নাম এবং ক্লিন বিল্ডের নামকরণের চেষ্টা না করলে প্রথমে ক্লিন বিল্ড চেষ্টা করুন .. .এটি ঠিক করা উচিত। শুভকামনা।
আপনার ফাইলের নামটি যদি মেথ মেথডযুক্ত শ্রেণীর নামের চেয়ে আলাদা হয় তবে এই ত্রুটি হওয়ার কারণ হতে পারে।