০. দুটি ত্রুটির মধ্যে কি কোনও পার্থক্য রয়েছে?
আসলে তা না. "প্রতীকটি খুঁজে পাওয়া যায় না" এবং "প্রতীক সমাধান করতে পারে না" অর্থ একই জিনিস। কিছু জাভা সংকলক একটি বাক্যাংশ ব্যবহার করেন এবং কিছু অন্যটি ব্যবহার করেন।
1. "প্রতীকটি খুঁজে পাওয়া যায় না" ত্রুটির অর্থ কী?
প্রথমত, এটি একটি সংকলন ত্রুটি 1 । এর অর্থ হ'ল হয় আপনার জাভা উত্স কোডে কোনও সমস্যা আছে বা আপনি যেভাবে এটি সংকলন করছেন তাতে কোনও সমস্যা আছে।
আপনার জাভা উত্স কোডে নিম্নলিখিত বিষয়গুলি রয়েছে:
- মূলশব্দ: মত
true
, false
, class
, while
, ইত্যাদি।
- আক্ষরিক: যেমন
42
এবং 'X'
এবং "Hi mum!"
।
- অপারেটর এবং অন্যান্য অ আলফানিউমেরিক টোকেন: মত
+
, =
, {
, ইত্যাদি।
- শনাক্তকারী: মত
Reader
, i
, toString
, processEquibalancedElephants
, ইত্যাদি।
- মন্তব্য এবং সাদা স্থান।
একটি "প্রতীক খুঁজে পাওয়া যায় না" ত্রুটি শনাক্তকারীদের সম্পর্কে। যখন আপনার কোডটি সংকলিত হয়, তখন আপনার কোডের প্রতিটি সনাক্তকারী কী বোঝায় তা সংকলকটির কাজ করা উচিত work
একটি "প্রতীক খুঁজে পাচ্ছেন না" ত্রুটির অর্থ সংকলক এটি করতে পারে না। আপনার কোডটি এমন কোনও কিছুকে উল্লেখ করছে যা সংকলক বুঝতে পারে না।
২. "প্রতীক খুঁজে পাচ্ছেন না" ত্রুটির কারণ কী হতে পারে?
প্রথম আদেশ হিসাবে, কেবল একটি কারণ রয়েছে। সংকলকটি সেই জায়গাগুলির সমস্ত জায়গায় দেখেছিল যেখানে সনাক্তকারীকে সংজ্ঞায়িত করা উচিত এবং এটি সংজ্ঞাটি পেল না। এটি বেশ কয়েকটি জিনিসের কারণে হতে পারে। সাধারণগুলি নিম্নরূপ:
- সাধারণভাবে সনাক্তকারীদের জন্য:
- সম্ভবত আপনি নামটির বানান ভুল করেছেন; অর্থাত্
StringBiulder
পরিবর্তে StringBuilder
। জাভা খারাপ বানান বা টাইপিং ত্রুটির জন্য ক্ষতিপূরণ দেওয়ার চেষ্টা করতে পারে না এবং করবে না।
- সম্ভবত আপনি মামলাটি ভুল পেয়েছেন; অর্থাত্
stringBuilder
পরিবর্তে StringBuilder
। সমস্ত জাভা শনাক্তকারী কেস সংবেদনশীল।
- সম্ভবত আপনি আন্ডারস্কোরগুলি অনুপযুক্তভাবে ব্যবহার করেছেন; যেমন
mystring
এবং my_string
পৃথক। (আপনি যদি জাভা শৈলীর নিয়মগুলিতে লেগে থাকেন তবে আপনি এই ভুল থেকে মূলত রক্ষা পাবেন ...)
- সম্ভবত আপনি এমন কিছু ব্যবহার করার চেষ্টা করছেন যা "অন্য কোথাও" ঘোষিত হয়েছিল; অর্থাত্ কোনও আলাদা প্রসঙ্গে যেখানে আপনি স্পষ্টভাবে সংকলকটি দেখার জন্য বলেছিলেন। (একটি ভিন্ন শ্রেণি? একটি আলাদা সুযোগ? একটি পৃথক প্যাকেজ? একটি ভিন্ন কোড-বেস?)
- ভেরিয়েবলগুলি উল্লেখ করা উচিত সনাক্তকারীদের জন্য:
- সম্ভবত আপনি ভেরিয়েবলটি ঘোষণা করতে ভুলে গেছেন।
- আপনি যে স্থানে এটি ব্যবহারের চেষ্টা করেছেন সেই সময়ে সম্ভবত পরিবর্তনশীল ঘোষণাটি সুযোগের বাইরে রয়েছে। (নীচে উদাহরণ দেখুন)
শনাক্তকারীদের জন্য যে পদ্ধতি বা ক্ষেত্রের নাম হওয়া উচিত:
শনাক্তকারীদের জন্য যা শ্রেণীর নাম হওয়া উচিত:
যে ক্ষেত্রে ক্ষেত্রে টাইপ বা উদাহরণটি সদস্য হিসাবে প্রত্যাশিত ছিল তা উপস্থিত নেই:
- সম্ভবত আপনি কোনও নেস্টেড ক্লাস বা জেনেরিক প্যারামিটার ঘোষণা করেছেন যা আপনি যে ধরণের ব্যবহার করতে চেয়েছিলেন তা ছায়া দেয়।
- সম্ভবত আপনি একটি স্থির বা উদাহরণ পরিবর্তনশীল ছায়া গো।
- সম্ভবত আপনি ভুল প্রকারটি আমদানি করেছেন; যেমন আইডিই সমাপ্তি বা স্বতঃ-সংশোধনের কারণে।
- সম্ভবত আপনি কোনও এপিআই-র ভুল সংস্করণ (বিরুদ্ধে সংকলন) ব্যবহার করছেন।
- সম্ভবত আপনি একটি উপযুক্ত সাবক্লাসে আপনার বস্তুটি কাস্ট করতে ভুলে গেছেন।
সমস্যাটি প্রায়শই উপরের সংমিশ্রণ হয়। উদাহরণস্বরূপ, সম্ভবত আপনি "তারকা" আমদানি করেছেন java.io.*
এবং Files
ক্লাসটি ব্যবহার করার চেষ্টা করেছিলেন ... যা java.nio
নেই java.io
। অথবা হয়ত আপনি লিখতে বোঝানো File
... যা হয় একটি বর্গ java.io
।
ভুল ভেরিয়েবল স্কোপিং কীভাবে "প্রতীক খুঁজে পাচ্ছে না" ত্রুটির দিকে পরিচালিত করতে পারে তার উদাহরণ এখানে রয়েছে:
List<String> strings = ...
for (int i = 0; i < strings.size(); i++) {
if (strings.get(i).equalsIgnoreCase("fnord")) {
break;
}
}
if (i < strings.size()) {
...
}
এই জন্য একটি "প্রতীক খুঁজে পাওয়া যাচ্ছে না" ত্রুটি দেব i
মধ্যে if
বিবৃতি। যদিও আমরা পূর্বে ঘোষণা করেছিলাম i
, সেই ঘোষণাটি কেবলমাত্র বিবৃতি এবং তার সংস্থার জন্য সুযোগ রয়েছেfor
। রেফারেন্স i
মধ্যে if
বিবৃতি দেখতে পারে না যে ঘোষণা i
। এটা সুযোগের বাইরে ।
(এখানে একটি উপযুক্ত সংশোধন হতে পারে if
বিবৃতিটি লুপের ভিতরে সরিয়ে নেওয়া , বা লুপটি i
শুরুর আগে ঘোষণা করা declare )
এখানে এমন একটি উদাহরণ যা বিশৃঙ্খলা সৃষ্টি করে যেখানে একটি টাইপো আপাতদৃষ্টিতে অবর্ণনীয় "প্রতীক খুঁজে পাচ্ছে না" ত্রুটির দিকে নিয়ে যায়:
for (int i = 0; i < 100; i++); {
System.out.println("i is " + i);
}
এটি আপনাকে println
কলটিতে একটি সংকলন ত্রুটি দেয় যা i
খুঁজে পাওয়া যায় না। তবে (আমি আপনাকে বলতে শুনেছি) আমি এটি ঘোষণা করেছিলাম!
সমস্যাটি হ'ল এর ;
আগে স্নিগ্ধ সেমিকোলন ( ) {
। জাভা ভাষার বাক্য গঠনটি সে ক্ষেত্রে একটি সেমিকোলনকে একটি খালি বিবৃতি হিসাবে সংজ্ঞায়িত করে । খালি বিবৃতিটি তখন for
লুপের দেহে পরিণত হয় । সুতরাং কোডটি আসলে এর অর্থ:
for (int i = 0; i < 100; i++);
// The previous and following are separate statements!!
{
System.out.println("i is " + i);
}
{ ... }
ব্লক দেহেন না for
লুপ, সেইজন্য এবং এর পূর্ববর্তী ঘোষণা i
মধ্যে for
বিবৃতি হল সাধ্যের বাইরে ব্লক হবে।
টাইপোর কারণে সৃষ্ট "প্রতীকটি খুঁজে পাওয়া যায় না" এর ত্রুটির আরও একটি উদাহরণ এখানে।
int tmp = ...
int res = tmp(a + b);
পূর্ববর্তী ঘোষণা সত্ত্বেও, প্রকাশের মধ্যে থাকা ভুল tmp
the tmp(...)
সংকলকটি বলা একটি পদ্ধতি tmp
অনুসন্ধান করবে এবং এটির কোনও সন্ধান করবে না। পূর্বে tmp
ঘোষিতটি ভেরিয়েবলের জন্য নেমস্পেসে রয়েছে, পদ্ধতিগুলির জন্য নেমস্পেস নয়।
উদাহরণস্বরূপ আমি পেরিয়ে এসেছি, প্রোগ্রামার আসলে একটি অপারেটর রেখেছিল। তিনি যা লিখতে চেয়েছিলেন তা হ'ল:
int res = tmp * (a + b);
আপনি যদি কমান্ড লাইন থেকে সংকলন করেন তবে সংকলকটি কোনও প্রতীক খুঁজে না পাওয়ার আরও একটি কারণ রয়েছে। আপনি অন্য কোনও ক্লাস সংকলন বা পুনরায় সংকলন করতে ভুলে যেতে পারেন। উদাহরণস্বরূপ, যদি আপনার ক্লাস থাকে Foo
এবং Bar
কোথায় Foo
ব্যবহার হয় Bar
। আপনি যদি কখনও সংকলিত না হয়ে থাকেন Bar
এবং আপনি চালনা করেন javac Foo.java
তবে সংকলকটি প্রতীকটি খুঁজে পাচ্ছেন না তা সন্ধান করতে আপনি দায়বদ্ধ Bar
। সহজ উত্তর হ'ল সংকলন Foo
এবং Bar
একসাথে; যেমন javac Foo.java Bar.java
বা javac *.java
। বা আরও ভাল এখনও একটি জাভা বিল্ড সরঞ্জাম ব্যবহার করুন; যেমন পিঁপড়া, মাভেন, গ্রেডল ইত্যাদি।
আরও কিছু অস্পষ্ট কারণ রয়েছে ... যা আমি নীচে মোকাবেলা করব।
৩. আমি কীভাবে এই ত্রুটিগুলি ঠিক করব?
সাধারণভাবে বলতে গেলে, সংকলনের ত্রুটিটি কী কারণে হয়েছিল তা ভেবেই আপনি শুরু করে ।
- সংকলন ত্রুটি বার্তা দ্বারা নির্দেশিত ফাইলে লাইনটি দেখুন।
- ত্রুটি বার্তাটি কোন চিহ্নের সাথে কথা বলছে তা সনাক্ত করুন।
- জিনিসটা কেন কম্পাইলার বলছে এটি প্রতীক খুঁজে পাচ্ছি না; উপরে দেখুন!
তারপরে আপনি কী ভাবেন আপনার কোডটি বলার কথা। তারপরে অবশেষে আপনি কী চান তা করতে আপনার উত্স কোডে আপনাকে কী সংশোধন করতে হবে তা নিয়ে কাজ করে।
মনে রাখবেন যে প্রতিটি "সংশোধন" সঠিক নয়। এই বিবেচনা:
for (int i = 1; i < 10; i++) {
for (j = 1; j < 10; j++) {
...
}
}
ধরুন কম্পাইলার বলছেন যে জন্য "প্রতীক খুঁজে পাওয়া যাচ্ছে না" j
। আমি "ফিক্স" করতে পারে এমন অনেকগুলি উপায় রয়েছে যা:
- আমি অভ্যন্তরীণ পরিবর্তন করতে
for
পারে for (int j = 1; j < 10; j++)
- সম্ভবত সঠিক।
- আমি অভ্যন্তরীণ লুপের
j
আগেfor
বা বাইরের লুপটির জন্য একটি ঘোষণা যোগ করতে পারি for
- সম্ভবত সঠিক।
- আমি পরিবর্তন হতে পারে
j
থেকে i
ভেতরের মধ্যে for
লুপ - সম্ভবত ভুল!
- ইত্যাদি।
পয়েন্ট যে তুমি প্রয়োজন বুঝতে কি আপনার কোড অর্ডার অধিকার ফিক্স এটি না করার চেষ্টা করছে।
4. অস্পষ্ট কারণ
এখানে এমন বেশ কয়েকটি কেস রয়েছে যেখানে "কাছাকাছি প্রতীক খুঁজে পাওয়া যায় না" আপাতদৃষ্টিতে অবর্ণনীয় ... যতক্ষণ না আপনি কাছাকাছি তাকান।
ভুল নির্ভরতা : আপনি যদি আইডিই বা বিল্ড টুল ব্যবহার করছেন যা বিল্ড পাথ এবং প্রকল্পের নির্ভরতা পরিচালনা করে, আপনি নির্ভরতাগুলির সাথে ভুল করতে পারেন; যেমন একটি নির্ভরতা রেখে গেছে, বা ভুল সংস্করণ নির্বাচন করেছে। যদি আপনি কোনও বিল্ড টুল ব্যবহার করেন (পিঁপড়া, মাভেন, গ্রেডেল ইত্যাদি), প্রকল্পের বিল্ড ফাইলটি পরীক্ষা করুন। আপনি যদি কোনও আইডিই ব্যবহার করে থাকেন তবে প্রকল্পের বিল্ড পাথ কনফিগারেশনটি পরীক্ষা করে দেখুন।
আপনি পুনরায় সংশোধন করছেন না : এটি কখনও কখনও ঘটে যায় যে নতুন জাভা প্রোগ্রামাররা জাভা সরঞ্জাম চেইন কীভাবে কাজ করে তা বুঝতে পারে না বা পুনরাবৃত্তযোগ্য "বিল্ড প্রক্রিয়া" প্রয়োগ করে না; যেমন একটি আইডিই, পিপীলিকা, মাভেন, গ্রেডেল এবং আরও কিছু ব্যবহার করে। এইরকম পরিস্থিতিতে, প্রোগ্রামারটি তার লেজটি তাড়াতাড়ি একটি বিভ্রান্তিকর ত্রুটির জন্য তাড়া করে শেষ করতে পারে যা আসলে কোডটি সঠিকভাবে সংশোধন না করার কারণে এবং এর মতো ...
পূর্বের বিল্ড সমস্যা : এটি সম্ভবত সম্ভব যে পূর্বের বিল্ডটি এমনভাবে ব্যর্থ হয়েছিল যে অনুপস্থিত ক্লাসগুলির সাথে একটি জেআর ফাইল দিয়েছে। আপনি যদি কোনও বিল্ড টুল ব্যবহার করে থাকেন তবে এই জাতীয় ব্যর্থতা সাধারণত লক্ষ্য করা যায়। তবে যদি আপনি অন্য কারো কাছ থেকে JAR- র ফাইল পাচ্ছেন, আপনি উপর নির্ভরশীল তাদের সঠিকভাবে গড়ে তোলার, এবং ত্রুটি ঠাহর। আপনি যদি সন্দেহ tar -tvf
করেন তবে সন্দেহভাজন জেআর ফাইলের বিষয়বস্তু তালিকাবদ্ধ করতে ব্যবহার করুন।
আইডিই সমস্যা : লোকেরা এমন কেস রিপোর্ট করেছে যেখানে তাদের আইডিই বিভ্রান্ত হয় এবং আইডিইতে সংকলক উপস্থিত কোন শ্রেণি খুঁজে পায় না ... বা বিপরীত পরিস্থিতি।
আইডিই যদি ভুল জেডিকে সংস্করণ দিয়ে কনফিগার করা থাকে তবে এটি ঘটতে পারে।
আইডিইর ক্যাশেগুলি ফাইল সিস্টেমের সাথে সিঙ্কের বাইরে চলে গেলে এটি ঘটতে পারে। এটি ঠিক করার জন্য আইডিই নির্দিষ্ট উপায় রয়েছে।
এটি কোনও আইডিই বাগ হতে পারে। উদাহরণস্বরূপ @ জোয়েল কস্টিগ্লিওলা এমন একটি দৃশ্যের বর্ণনা দিয়েছেন যেখানে Eclipse কোনও মাভেন "পরীক্ষা" গাছ সঠিকভাবে পরিচালনা করে না: এই উত্তরটি দেখুন ।
অ্যান্ড্রয়েড সমস্যা : আপনি যখন অ্যান্ড্রয়েডের জন্য প্রোগ্রামিং করছেন, এবং আপনার সাথে সম্পর্কিত "প্রতীকটি খুঁজে পাওয়া যায় না" ত্রুটি রয়েছে তখন R
সচেতন হন যে R
চিহ্নগুলি context.xml
ফাইল দ্বারা সংজ্ঞায়িত করা হয়েছে । আপনার context.xml
ফাইলটি সঠিক এবং সঠিক জায়গায় আছে এবং এটি সম্পর্কিত R
ক্লাস ফাইলটি উত্পন্ন / সংকলিত হয়েছে তা পরীক্ষা করে দেখুন। নোট করুন যে জাভা চিহ্নগুলি কেস সংবেদনশীল, সুতরাং সংশ্লিষ্ট এক্সএমএল আইডিগুলিও সংবেদনশীল।
পূর্ববর্তী কারণগুলির কারণে অ্যান্ড্রয়েডে অন্যান্য প্রতীক ত্রুটিগুলি হতে পারে; যেমন অনুপস্থিত বা ভুল নির্ভরতা, ভুল প্যাকেজ নাম, পদ্ধতি বা ক্ষেত্রগুলি যা কোনও নির্দিষ্ট এপিআই সংস্করণে বিদ্যমান নেই, বানান / টাইপিং ত্রুটি, এবং আরও অনেক কিছু।
সিস্টেমের ক্লাসগুলি পুনরায় সংজ্ঞায়িত করা : আমি এমন কেসগুলি দেখেছি যেখানে সংকলকটি অভিযোগ করে যে substring
নীচের মতো কিছুতে একটি অজানা প্রতীক
String s = ...
String s1 = s.substring(1);
দেখা গেল যে প্রোগ্রামার তাদের নিজস্ব সংস্করণ তৈরি করেছে String
এবং ক্লাসের তার সংস্করণটি কোনও substring
পদ্ধতি সংজ্ঞায়িত করে নি।
পাঠ: সাধারণ পাঠাগার ক্লাসের মতো একই নামের সাথে আপনার নিজের ক্লাসগুলি সংজ্ঞায়িত করবেন না!
হোমোগ্লিফস: আপনি যদি আপনার উত্স ফাইলগুলির জন্য ইউটিএফ -8 এনকোডিং ব্যবহার করেন তবে সনাক্তকারী একই রকম দেখতে পাওয়া যায় তবে বাস্তবে এটি আলাদা হয় কারণ সেগুলিতে হোমোগ্লিফ থাকে। আরও তথ্যের জন্য এই পৃষ্ঠাটি দেখুন ।
উত্স ফাইল এনকোডিং হিসাবে নিজেকে ASCII বা লাতিন -১ এ সীমাবদ্ধ করে এবং জাভা \uxxxx
অন্যান্য অক্ষরের জন্য পলায়ন ব্যবহার করে আপনি এড়াতে পারেন ।
1 - যদি, অনুগ্রহ করে, আপনি এটি রানটাইম ব্যতিক্রম বা ত্রুটি বার্তায় দেখতে পান, তবে হয় আপনি সংকলনের ত্রুটি সহ কোড চালানোর জন্য আপনার আইডিই কনফিগার করেছেন, অথবা আপনার অ্যাপ্লিকেশন কোডটি জেনারেট করে এবং সংকলন করছে .. রানটাইমে।
2 - সিভিল ইঞ্জিনিয়ারিংয়ের তিনটি মূলনীতি: জল চলাচল করে না, তার পাশ দিয়ে একটি তক্তা আরও শক্তিশালী এবং আপনি কোনও স্ট্রিংয়ের উপর চাপ দিতে পারবেন না ।