একটি "প্রতীক খুঁজে পাওয়া যায় না" বা "প্রতীক সমাধান করতে পারে না" ত্রুটিটির অর্থ কী?


396

"প্রতীকটি খুঁজে পাওয়া যায় না" এবং "প্রতীক সমাধান করতে পারে না" ত্রুটিগুলি সম্পর্কে দয়া করে নিম্নলিখিতটি ব্যাখ্যা করুন:

  • তাঁরা কি বোঝাতে চাইছেন?
  • কি জিনিস তাদের কারণ হতে পারে?
  • প্রোগ্রামার তাদের ফিক্সিং সম্পর্কে কীভাবে যায়?

এই প্রশ্নটি জাভাতে এই সাধারণ সংকলন ত্রুটিগুলি সম্পর্কে একটি বিস্তৃত প্রশ্নোত্তর তৈরির জন্য ডিজাইন করা হয়েছে।

উত্তর:


417

০. দুটি ত্রুটির মধ্যে কি কোনও পার্থক্য রয়েছে?

আসলে তা না. "প্রতীকটি খুঁজে পাওয়া যায় না" এবং "প্রতীক সমাধান করতে পারে না" অর্থ একই জিনিস। কিছু জাভা সংকলক একটি বাক্যাংশ ব্যবহার করেন এবং কিছু অন্যটি ব্যবহার করেন।

1. "প্রতীকটি খুঁজে পাওয়া যায় না" ত্রুটির অর্থ কী?

প্রথমত, এটি একটি সংকলন ত্রুটি 1 । এর অর্থ হ'ল হয় আপনার জাভা উত্স কোডে কোনও সমস্যা আছে বা আপনি যেভাবে এটি সংকলন করছেন তাতে কোনও সমস্যা আছে।

আপনার জাভা উত্স কোডে নিম্নলিখিত বিষয়গুলি রয়েছে:

  • মূলশব্দ: মত true, false, class, while, ইত্যাদি।
  • আক্ষরিক: যেমন 42এবং 'X'এবং "Hi mum!"
  • অপারেটর এবং অন্যান্য অ আলফানিউমেরিক টোকেন: মত +, =, {, ইত্যাদি।
  • শনাক্তকারী: মত Reader, i, toString, processEquibalancedElephants, ইত্যাদি।
  • মন্তব্য এবং সাদা স্থান।

একটি "প্রতীক খুঁজে পাওয়া যায় না" ত্রুটি শনাক্তকারীদের সম্পর্কে। যখন আপনার কোডটি সংকলিত হয়, তখন আপনার কোডের প্রতিটি সনাক্তকারী কী বোঝায় তা সংকলকটির কাজ করা উচিত work

একটি "প্রতীক খুঁজে পাচ্ছেন না" ত্রুটির অর্থ সংকলক এটি করতে পারে না। আপনার কোডটি এমন কোনও কিছুকে উল্লেখ করছে যা সংকলক বুঝতে পারে না।

২. "প্রতীক খুঁজে পাচ্ছেন না" ত্রুটির কারণ কী হতে পারে?

প্রথম আদেশ হিসাবে, কেবল একটি কারণ রয়েছে। সংকলকটি সেই জায়গাগুলির সমস্ত জায়গায় দেখেছিল যেখানে সনাক্তকারীকে সংজ্ঞায়িত করা উচিত এবং এটি সংজ্ঞাটি পেল না। এটি বেশ কয়েকটি জিনিসের কারণে হতে পারে। সাধারণগুলি নিম্নরূপ:

  • সাধারণভাবে সনাক্তকারীদের জন্য:
    • সম্ভবত আপনি নামটির বানান ভুল করেছেন; অর্থাত্ StringBiulderপরিবর্তে StringBuilder। জাভা খারাপ বানান বা টাইপিং ত্রুটির জন্য ক্ষতিপূরণ দেওয়ার চেষ্টা করতে পারে না এবং করবে না।
    • সম্ভবত আপনি মামলাটি ভুল পেয়েছেন; অর্থাত্ stringBuilderপরিবর্তে StringBuilder। সমস্ত জাভা শনাক্তকারী কেস সংবেদনশীল।
    • সম্ভবত আপনি আন্ডারস্কোরগুলি অনুপযুক্তভাবে ব্যবহার করেছেন; যেমন mystringএবং my_stringপৃথক। (আপনি যদি জাভা শৈলীর নিয়মগুলিতে লেগে থাকেন তবে আপনি এই ভুল থেকে মূলত রক্ষা পাবেন ...)
    • সম্ভবত আপনি এমন কিছু ব্যবহার করার চেষ্টা করছেন যা "অন্য কোথাও" ঘোষিত হয়েছিল; অর্থাত্ কোনও আলাদা প্রসঙ্গে যেখানে আপনি স্পষ্টভাবে সংকলকটি দেখার জন্য বলেছিলেন। (একটি ভিন্ন শ্রেণি? একটি আলাদা সুযোগ? একটি পৃথক প্যাকেজ? একটি ভিন্ন কোড-বেস?)
  • ভেরিয়েবলগুলি উল্লেখ করা উচিত সনাক্তকারীদের জন্য:
    • সম্ভবত আপনি ভেরিয়েবলটি ঘোষণা করতে ভুলে গেছেন।
    • আপনি যে স্থানে এটি ব্যবহারের চেষ্টা করেছেন সেই সময়ে সম্ভবত পরিবর্তনশীল ঘোষণাটি সুযোগের বাইরে রয়েছে। (নীচে উদাহরণ দেখুন)
  • শনাক্তকারীদের জন্য যে পদ্ধতি বা ক্ষেত্রের নাম হওয়া উচিত:

    • সম্ভবত আপনি উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতি বা ক্ষেত্রটি উল্লেখ করার চেষ্টা করছেন যা পিতামাতাদের / পূর্বপুরুষের ক্লাসে বা ইন্টারফেসগুলিতে ঘোষিত হয়নি।
    • সম্ভবত আপনি এমন কোনও পদ্ধতি বা ক্ষেত্র উল্লেখ করার চেষ্টা করছেন যা আপনি ব্যবহার করছেন এমন ধরণের (যেমন ঘোষণা করা হয়নি); যেমন "someString".push()2
    • সম্ভবত আপনি একটি ক্ষেত্র হিসাবে একটি পদ্ধতি ব্যবহার করার চেষ্টা করছেন, বা বিপরীতে; যেমন "someString".lengthবা someArray.length()
    • সম্ভবত আপনি ভুলভাবে অ্যারের উপাদানটির পরিবর্তে অ্যারেতে পরিচালনা করছেন; যেমন

      String strings[] = ...
      if (strings.charAt(3)) { ... }
      // maybe that should be 'strings[0].charAt(3)'
      
  • শনাক্তকারীদের জন্য যা শ্রেণীর নাম হওয়া উচিত:

    • সম্ভবত আপনি ক্লাসটি আমদানি করতে ভুলে গেছেন।
    • সম্ভবত আপনি "তারকা" আমদানি ব্যবহার করেছেন তবে ক্লাসটি আপনি যে প্যাকেজগুলি আমদানি করেছেন তাতে কোনও সংজ্ঞায়িত হয়নি।
    • সম্ভবত আপনি একটি newহিসাবে ভুলে গেছেন :

      String s = String();  // should be 'new 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);

পূর্ববর্তী ঘোষণা সত্ত্বেও, প্রকাশের মধ্যে থাকা ভুল tmpthe 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. অস্পষ্ট কারণ

এখানে এমন বেশ কয়েকটি কেস রয়েছে যেখানে "কাছাকাছি প্রতীক খুঁজে পাওয়া যায় না" আপাতদৃষ্টিতে অবর্ণনীয় ... যতক্ষণ না আপনি কাছাকাছি তাকান।

  1. ভুল নির্ভরতা : আপনি যদি আইডিই বা বিল্ড টুল ব্যবহার করছেন যা বিল্ড পাথ এবং প্রকল্পের নির্ভরতা পরিচালনা করে, আপনি নির্ভরতাগুলির সাথে ভুল করতে পারেন; যেমন একটি নির্ভরতা রেখে গেছে, বা ভুল সংস্করণ নির্বাচন করেছে। যদি আপনি কোনও বিল্ড টুল ব্যবহার করেন (পিঁপড়া, মাভেন, গ্রেডেল ইত্যাদি), প্রকল্পের বিল্ড ফাইলটি পরীক্ষা করুন। আপনি যদি কোনও আইডিই ব্যবহার করে থাকেন তবে প্রকল্পের বিল্ড পাথ কনফিগারেশনটি পরীক্ষা করে দেখুন।

  2. আপনি পুনরায় সংশোধন করছেন না : এটি কখনও কখনও ঘটে যায় যে নতুন জাভা প্রোগ্রামাররা জাভা সরঞ্জাম চেইন কীভাবে কাজ করে তা বুঝতে পারে না বা পুনরাবৃত্তযোগ্য "বিল্ড প্রক্রিয়া" প্রয়োগ করে না; যেমন একটি আইডিই, পিপীলিকা, মাভেন, গ্রেডেল এবং আরও কিছু ব্যবহার করে। এইরকম পরিস্থিতিতে, প্রোগ্রামারটি তার লেজটি তাড়াতাড়ি একটি বিভ্রান্তিকর ত্রুটির জন্য তাড়া করে শেষ করতে পারে যা আসলে কোডটি সঠিকভাবে সংশোধন না করার কারণে এবং এর মতো ...

  3. পূর্বের বিল্ড সমস্যা : এটি সম্ভবত সম্ভব যে পূর্বের বিল্ডটি এমনভাবে ব্যর্থ হয়েছিল যে অনুপস্থিত ক্লাসগুলির সাথে একটি জেআর ফাইল দিয়েছে। আপনি যদি কোনও বিল্ড টুল ব্যবহার করে থাকেন তবে এই জাতীয় ব্যর্থতা সাধারণত লক্ষ্য করা যায়। তবে যদি আপনি অন্য কারো কাছ থেকে JAR- র ফাইল পাচ্ছেন, আপনি উপর নির্ভরশীল তাদের সঠিকভাবে গড়ে তোলার, এবং ত্রুটি ঠাহর। আপনি যদি সন্দেহ tar -tvfকরেন তবে সন্দেহভাজন জেআর ফাইলের বিষয়বস্তু তালিকাবদ্ধ করতে ব্যবহার করুন।

  4. আইডিই সমস্যা : লোকেরা এমন কেস রিপোর্ট করেছে যেখানে তাদের আইডিই বিভ্রান্ত হয় এবং আইডিইতে সংকলক উপস্থিত কোন শ্রেণি খুঁজে পায় না ... বা বিপরীত পরিস্থিতি।

    • আইডিই যদি ভুল জেডিকে সংস্করণ দিয়ে কনফিগার করা থাকে তবে এটি ঘটতে পারে।

    • আইডিইর ক্যাশেগুলি ফাইল সিস্টেমের সাথে সিঙ্কের বাইরে চলে গেলে এটি ঘটতে পারে। এটি ঠিক করার জন্য আইডিই নির্দিষ্ট উপায় রয়েছে।

    • এটি কোনও আইডিই বাগ হতে পারে। উদাহরণস্বরূপ @ জোয়েল কস্টিগ্লিওলা এমন একটি দৃশ্যের বর্ণনা দিয়েছেন যেখানে Eclipse কোনও মাভেন "পরীক্ষা" গাছ সঠিকভাবে পরিচালনা করে না: এই উত্তরটি দেখুন

  5. অ্যান্ড্রয়েড সমস্যা : আপনি যখন অ্যান্ড্রয়েডের জন্য প্রোগ্রামিং করছেন, এবং আপনার সাথে সম্পর্কিত "প্রতীকটি খুঁজে পাওয়া যায় না" ত্রুটি রয়েছে তখন Rসচেতন হন যে Rচিহ্নগুলি context.xmlফাইল দ্বারা সংজ্ঞায়িত করা হয়েছে । আপনার context.xmlফাইলটি সঠিক এবং সঠিক জায়গায় আছে এবং এটি সম্পর্কিত Rক্লাস ফাইলটি উত্পন্ন / সংকলিত হয়েছে তা পরীক্ষা করে দেখুন। নোট করুন যে জাভা চিহ্নগুলি কেস সংবেদনশীল, সুতরাং সংশ্লিষ্ট এক্সএমএল আইডিগুলিও সংবেদনশীল।

    পূর্ববর্তী কারণগুলির কারণে অ্যান্ড্রয়েডে অন্যান্য প্রতীক ত্রুটিগুলি হতে পারে; যেমন অনুপস্থিত বা ভুল নির্ভরতা, ভুল প্যাকেজ নাম, পদ্ধতি বা ক্ষেত্রগুলি যা কোনও নির্দিষ্ট এপিআই সংস্করণে বিদ্যমান নেই, বানান / টাইপিং ত্রুটি, এবং আরও অনেক কিছু।

  6. সিস্টেমের ক্লাসগুলি পুনরায় সংজ্ঞায়িত করা : আমি এমন কেসগুলি দেখেছি যেখানে সংকলকটি অভিযোগ করে যে substringনীচের মতো কিছুতে একটি অজানা প্রতীক

    String s = ...
    String s1 = s.substring(1);
    

    দেখা গেল যে প্রোগ্রামার তাদের নিজস্ব সংস্করণ তৈরি করেছে Stringএবং ক্লাসের তার সংস্করণটি কোনও substringপদ্ধতি সংজ্ঞায়িত করে নি।

    পাঠ: সাধারণ পাঠাগার ক্লাসের মতো একই নামের সাথে আপনার নিজের ক্লাসগুলি সংজ্ঞায়িত করবেন না!

  7. হোমোগ্লিফস: আপনি যদি আপনার উত্স ফাইলগুলির জন্য ইউটিএফ -8 এনকোডিং ব্যবহার করেন তবে সনাক্তকারী একই রকম দেখতে পাওয়া যায় তবে বাস্তবে এটি আলাদা হয় কারণ সেগুলিতে হোমোগ্লিফ থাকে। আরও তথ্যের জন্য এই পৃষ্ঠাটি দেখুন ।

    উত্স ফাইল এনকোডিং হিসাবে নিজেকে ASCII বা লাতিন -১ এ সীমাবদ্ধ করে এবং জাভা \uxxxxঅন্যান্য অক্ষরের জন্য পলায়ন ব্যবহার করে আপনি এড়াতে পারেন ।


1 - যদি, অনুগ্রহ করে, আপনি এটি রানটাইম ব্যতিক্রম বা ত্রুটি বার্তায় দেখতে পান, তবে হয় আপনি সংকলনের ত্রুটি সহ কোড চালানোর জন্য আপনার আইডিই কনফিগার করেছেন, অথবা আপনার অ্যাপ্লিকেশন কোডটি জেনারেট করে এবং সংকলন করছে .. রানটাইমে।

2 - সিভিল ইঞ্জিনিয়ারিংয়ের তিনটি মূলনীতি: জল চলাচল করে না, তার পাশ দিয়ে একটি তক্তা আরও শক্তিশালী এবং আপনি কোনও স্ট্রিংয়ের উপর চাপ দিতে পারবেন না


আমার আরও একটি পরিস্থিতি ছিল যেখানে গ্রহনের সমস্যাটি না দেখলে এই সংকলন ত্রুটি ঘটেছিল: নির্ভরতা সহ দুটি শ্রেণি যথাক্রমে অন্যান্য শ্রেণিতে সংজ্ঞায়িত হয়। আমার ক্ষেত্রে আমার একটি এনাম ছিল, একটি ইন্টারফেস প্রয়োগ করে, এমন একটি ক্লাসে সংজ্ঞায়িত হয়েছিল যেখানে আমি বোকামি আগে থেকেই এনাম ব্যবহার করেছি।
জোগি

কিছুটা অনুরূপভাবে উপরের মন্তব্যে, যখন আমি গ্রহনটি থেকে আমার প্রোগ্রামটি সংকলন ও চালনা করি তাতে কোনও সমস্যা হয় না। এটি কনসোল থেকে সংকলন করে এই "প্রতীকটি খুঁজে পাওয়া যায় না" ত্রুটিগুলির একটি গুচ্ছ উত্থাপন করে যা প্রায়শই আমদানির সর্বশেষ উপাদান সম্পর্কিত। কোডটিতে সত্যিকার অর্থে কোনও ভুল নেই বলে এটি কী ঘটছে তা আমার কোনও ধারণা নেই।
আন্দ্রেস স্ট্যাডেলম্যান

আর একটি সমস্যা হ'ল আইডিইরা এই বিভাগে অন্যান্য ত্রুটিগুলি "ব্যাখ্যা" করতে পারে। উদাহরণস্বরূপ println, System.out.printlnযদি স্ট্যান্ডার্ড সংকলকের অধীনে শ্রেণির স্তরে স্থাপন করা হয় তবে আমাদের <identifier> expected( ডেমো ) দেবে তবে ইন্টেলিজিতে আমরা Cannot resolve symbol 'println'( ডেমো ) দেখতে পাব ।
Pshemo

কি দারুন. আমি যে একটি সংকলক বাগ কল করব।
স্টিফেন সি

23

আপনি যদি ভুলে যান তবে আপনি এই ত্রুটিটিও পাবেন new:

String s = String();

বনাম

String s = new String();

কারণ newকীওয়ার্ড ব্যতীত কলটি চেষ্টা করবে এবং Stringতর্ক ছাড়াই ডাকা একটি (স্থানীয়) পদ্ধতির সন্ধান করবে - এবং সেই পদ্ধতির স্বাক্ষর সম্ভবত সংজ্ঞায়িত হয়নি।


14

'চলকটির আরও একটি উদাহরণ' সুযোগের বাইরে নয় '

আমি ইতিমধ্যে কয়েকবার এই ধরণের প্রশ্ন দেখেছি, এটি অবৈধ কী তা আরও একটি উদাহরণ হতে পারে এমনকি যদি তা ঠিক মনে হয়

এই কোডটি বিবেচনা করুন:

if(somethingIsTrue()) {
  String message = "Everything is fine";
} else {
  String message = "We have an error";
}
System.out.println(message);

এটি অবৈধ কোড। কারণ নামক ভেরিয়েবলগুলির মধ্যে উভয়ই messageতাদের নিজ নিজ ক্ষেত্রের বাইরে দৃশ্যমান নয় - যা {}এই ক্ষেত্রে পার্শ্ববর্তী বন্ধনী হবে ।

আপনি হয়তো বলতে পারেন: "কিন্তু বার্তা নামে একটি পরিবর্তনশীল উভয় ক্ষেত্রেই সংজ্ঞায়িত করা হয় - তাই বার্তা হয় পরে সংজ্ঞায়িত if"।

তবে আপনি ভুল হতে চাই।

জাভাতে কোনও free()বা deleteঅপারেটর নেই, সুতরাং ভেরিয়েবলগুলি আর কখন ব্যবহার করা হয় না তা খুঁজে পাওয়ার জন্য (কারণগুলির এই ভেরিয়েবলগুলির রেফারেন্স সহ) ট্র্যাকিং ভেরিয়েবল স্ক্যাপের উপর নির্ভর করতে হবে।

এটি বিশেষত খারাপ যদি আপনি ভাবেন যে আপনি ভাল কিছু করেছেন। এই জাতীয় কোডটি "অনুকূলকরণের" পরে আমি এই জাতীয় ত্রুটি দেখেছি:

if(somethingIsTrue()) {
  String message = "Everything is fine";
  System.out.println(message);
} else {
  String message = "We have an error";
  System.out.println(message);
}

"ওহ, এখানে সদৃশ কোড রয়েছে, আসুন সেই সাধারণ লাইনটি টানুন" -> এটি সেখানে রয়েছে।

এই জাতীয় সুযোগ-ঝামেলা মোকাবেলার সর্বাধিক সাধারণ উপায় হ'ল বাইরের স্কোপের পরিবর্তনশীল নামগুলিতে অন্য-মানগুলি পূর্বনির্ধারিত করা এবং তারপরে পুনরায় সাইন ইন করা যদি:

String message = "We have an error";
if(somethingIsTrue()) {
  message = "Everything is fine";
} 
System.out.println(message);

4
"জাভাতে কোনও ফ্রি () বা অপারেটর মুছতে পারে না, সুতরাং ভেরিয়েবলগুলি আর কখন ব্যবহার করা হয় না তা খুঁজে পাওয়ার জন্য (কারণগুলির এই ভেরিয়েবলগুলির রেফারেন্স সহ একসাথে) ট্র্যাকিং ভেরিয়েবলের উপর নির্ভর করতে হবে" " - সত্য হলেও এটি প্রাসঙ্গিক নয়। সি এবং সি ++ এর যথাক্রমে বিনামূল্যে / মুছুন অপারেটর রয়েছে এবং এখনও আপনার উদাহরণগুলির সমতুল্য সি / সি ++ কোডটি অবৈধ illegal সি এবং সি ++ ব্লকগুলি জাভাগুলির মতো ভেরিয়েবলের পরিধি সীমিত করে। আসলে, বেশিরভাগ "ব্লক কাঠামোগত" ভাষার ক্ষেত্রে এটি সত্য।
স্টিফেন সি

1
কোডের জন্য আরও ভাল সমাধান যা প্রতিটি শাখায় আলাদা মান নির্ধারণ করে তা হ'ল একটি ফাঁকাfinal পরিবর্তনশীল ঘোষণা decla
ড্যানিয়েল প্রাইডেন

10

গ্রহনটিতে এই ত্রুটিটি পাওয়ার একটি উপায়:

  1. একটি শ্রেণীর Aমধ্যে সংজ্ঞা দিন src/test/java
  2. অন্য বর্গ নির্ধারণ Bমধ্যে src/main/javaযে ব্যবহারসমূহ বর্গ A

ফলাফল: Eclipse কোডটি সংকলন করবে, তবে ম্যাভেন "প্রতীকটি খুঁজে পাবে না" দেবে।

অন্তর্নিহিত কারণ: গ্রহনটি মূল এবং পরীক্ষামূলক গাছগুলির জন্য সম্মিলিত বিল্ড পাথ ব্যবহার করছে। দুর্ভাগ্যক্রমে, এটি একটি গ্রহন প্রকল্পের বিভিন্ন অংশের জন্য বিভিন্ন বিল্ড পাথ ব্যবহার করে সমর্থন করে না, যা মাভেনের প্রয়োজন।

সমাধান:

  1. আপনার নির্ভরতা সেভাবে সংজ্ঞায়িত করবেন না; অর্থাৎ এই ভুল করবেন না।
  2. মাভেন ব্যবহার করে নিয়মিতভাবে আপনার কোডবেস তৈরি করুন যাতে আপনি এই ভুলটি তাড়াতাড়ি তুলে নেন। এটি করার একটি উপায় হ'ল সিআই সার্ভার ব্যবহার করা।

এর সমাধান কী?

2
আপনি src / main / java এ যা কিছু ব্যবহার করুন তা src / main / java বা যে কোনও সংকলন / রানটাইম নির্ভরতা (পরীক্ষার নির্ভরতা নয়) এ সংজ্ঞায়িত করা দরকার।
জোয়েল কস্টিগ্লিওলা

5

"খুঁজে পাচ্ছেন না" এর অর্থ হ'ল, সংকলক যিনি উপযুক্ত পরিবর্তনশীল, পদ্ধতি, শ্রেণি ইত্যাদির সন্ধান করতে পারেন না ... যদি আপনি ত্রুটি ম্যাসেজ পেয়ে থাকেন তবে প্রথমে কোড লাইন সন্ধান করতে চান যেখানে ত্রুটি ম্যাসেজ করুন ... এবং তারপরে আপনি পাবেন কোন ভেরিয়েবল, পদ্ধতি বা শ্রেণিটি এটি ব্যবহারের আগে সংজ্ঞায়িত করেনি তা খুঁজে পেতে সক্ষম confirএর পরে নিশ্চিতকরণটি আরম্ভ করুন যে পরিবর্তনশীল, পদ্ধতি বা শ্রেণীর জন্য পরবর্তী প্রয়োজন হতে পারে ... নিম্নলিখিত উদাহরণটি বিবেচনা করুন।

আমি একটি ডেমো ক্লাস তৈরি করব এবং একটি নাম মুদ্রণ করব ...

class demo{ 
      public static void main(String a[]){
             System.out.print(name);
      }
}

এখন ফলাফল দেখুন ..

এখানে চিত্র বর্ণনা লিখুন

সেই ত্রুটিটি বলে, "ভেরিয়েবল নামটি খুঁজে পাবে না" .. 'নাম' ভেরিয়েবলের জন্য সংজ্ঞা নির্ধারণ এবং আরম্ভ করার ফলে সেই ত্রুটিটি বিলুপ্ত করা যেতে পারে .. ঠিক এর মতো,

class demo{ 
      public static void main(String a[]){

             String name="smith";

             System.out.print(name);
      }
}

এখন নতুন আউটপুট দেখুন ...

এখানে চিত্র বর্ণনা লিখুন

ঠিক আছে, ত্রুটিটি সফলভাবে সমাধান হয়েছে .. একই সময়ে, আপনি যদি "পদ্ধতি আবিষ্কার করতে পারেন না" বা "শ্রেণিটি খুঁজে পাচ্ছেন না" কিছু পেতে পারি তবে প্রথমে কোনও শ্রেণি বা পদ্ধতি সংজ্ঞায়িত করুন এবং এটি ব্যবহারের পরে ..


3

যদি আপনি অন্য কোথাও বিল্ডটিতে এই ত্রুটিটি পেয়ে থাকেন, যখন আপনার আইডিই বলছে যে সবকিছু পুরোপুরি ঠিক আছে, তবে পরীক্ষা করুন যে আপনি উভয় জায়গায় একই জাভা সংস্করণ ব্যবহার করছেন।

উদাহরণস্বরূপ, জাভা 7 এবং জাভা 8 এর আলাদা আলাদা এপিআই রয়েছে, তাই পুরানো জাভা সংস্করণে অ-অস্তিত্বশীল এপিআই কল করা এই ত্রুটির কারণ হতে পারে।


2

আমিও এই ত্রুটি পেয়ে যাচ্ছিলাম। (যার জন্য আমি গুগল করেছিলাম এবং আমাকে এই পৃষ্ঠায় পরিচালিত হয়েছিল)

সমস্যা: আমি অন্য প্রকল্প বিতে সংজ্ঞায়িত ক্লাস থেকে প্রজেক্ট এ এর ​​ক্লাসে সংজ্ঞায়িত একটি স্ট্যাটিক পদ্ধতি বলছিলাম। আমি নিম্নলিখিত ত্রুটিটি পাচ্ছিলাম:

error: cannot find symbol

সমাধান: আমি প্রথমে প্রকল্পটি যেখানে পদ্ধতিটি সংজ্ঞায়িত করা হয় তার পরে প্রকল্পটি যেখানে পদ্ধতিটি কল করা হয়েছিল সেখানে তৈরি করে সমাধান করেছি।


হ্যাঁ, আপনি যদি আপনার বর্তমান প্যাকেজ থেকে কিছু সাধারণ পুনরায় ব্যবহারযোগ্য ফাংশন আপনার সাধারণ ব্যবহারের প্যাকেজে স্থানান্তরিত করার সিদ্ধান্ত নেন তবে এটি ঘটতে পারে তবে আপনি বর্তমান প্যাকেজ থেকে ফাংশনটি কল করার আগে আপনার সাধারণ প্যাকেজটি সংকলন করতে ভুলে গেছেন।
বিল্ডিংকফি

2

যদি ग्रहण জাভা বিল্ড পাথটি 7, 8 এ ম্যাপ করা হয় এবং প্রজেক্টে pom.xml মাভেন বৈশিষ্ট্যগুলিতে java.version উল্লেখ করা হয় 7,8 এর চেয়ে আপনাকে জাভ সংস্করণ (9,10,11, ইত্যাদি), পম আপডেট করতে হবে। এক্সএমএল ফাইল।

Eclipse এ জাভাটিকে জাভা সংস্করণ ১১-এ ম্যাপ করা হয়েছে এবং pom.xML এ এটি জাভা সংস্করণ ৮-এ ম্যাপ করা হয়েছে 8.. জাভা ১১-তে এক্সপ্লিপ সাপোর্ট আপডেট করুন গ্রহন আইডিই সহায়তা -> নতুন সফ্টওয়্যার ইনস্টল করুন -> এর নীচের পদক্ষেপগুলি অনুসরণ করে

নিম্নলিখিত লিঙ্কটি আটকে দিন http://download.eclipse.org/eclipse/updates/4.9-P- বিল্ডস সাথে কাজের

অথবা

যোগ করুন (পপআপ উইন্ডো খুলবে) ->

Name:জাভা 11 সমর্থন Location: http://download.eclipse.org/eclipse/updates/4.9-P- বিল্ডস

তারপরে নীচে হিসাবে pom.xML ফাইলের মাভেন বৈশিষ্ট্যে জাভা সংস্করণ আপডেট করুন

<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>

অবশেষে প্রকল্প ডিবেগ হিসাবে ডান ক্লিক করুন -> ম্যাভেন পরিষ্কার, মাভেন বিল্ড স্টেপগুলি



1

উপরে বর্ণিত হিসাবে বিভিন্ন পরিস্থিতিতে থাকতে পারে be কয়েকটি বিষয় যা আমাকে এটি সমাধান করতে সহায়তা করেছে।

  1. আপনি যদি ইন্টেলিজ ব্যবহার করেন

    File -> 'Invalidate Caches/Restart'

অথবা

  1. শ্রেণিটি উল্লেখ করা হচ্ছে অন্য একটি প্রকল্পে এবং সেই নির্ভরতাটি আমার প্রকল্পের গ্রেডল বিল্ড ফাইলে যুক্ত করা হয়নি। সুতরাং আমি নির্ভরতা ব্যবহার করে যুক্ত

    compile project(':anotherProject')

এবং এটা কাজ করে. আছে HTH!


1

আপনি ম্যাভেন কম্পাইল ব্যবহার করে আপনার কোডটি সংকলন করেছেন এবং এটি চালানোর জন্য ম্যাভেন টেস্ট ব্যবহার করেছেন worked এখন আপনি যদি নিজের কোডটিতে কিছু পরিবর্তন করেন এবং তারপরে সংকলন না করে আপনি এটি চালাচ্ছেন তবে আপনি এই ত্রুটিটি পেয়ে যাবেন।

সমাধান: আবার এটি সংকলন করুন এবং তারপরে পরীক্ষা চালান। আমার জন্য এটি এইভাবে কাজ করে।


1

আমার ক্ষেত্রে - আমাকে নীচে অপারেশন করতে হয়েছিল:

  1. সরান context.xmlথেকে ফাইল src/java/packageকরতে resourceডিরেক্টরি (IntelliJ আইডিই)
  2. পরিষ্কার targetডিরেক্টরি।

রেফারেন্সগুলির যত্ন না করেই ফাইল সরানো এই ত্রুটির কারণ হতে পারে। আমি ইতিমধ্যে এটি পূরণ। গিটকে পুনরায় সেট করুন এবং সাবধানে আবার সরান, ত্রুটিটি সমাধান হয়।
Huy Hỉm Hỉnh

0

ইঙ্গিতগুলির জন্য, শ্রেণীর নামের নামটি ঘনিষ্ঠভাবে দেখুন যা একটি ত্রুটি এবং রেখার সংখ্যাটি ফেলে দেয়, উদাহরণস্বরূপ: সংকলন ব্যর্থতা [ERROR] \ অ্যাপ্লিকেশনগুলি xx xxxxx.java: [44,30] ত্রুটি: প্রতীকটি খুঁজে পাচ্ছে না

আর একটি কারণ জাভা সংস্করণটির জন্য অসমর্থিত পদ্ধতিটি বলুন jdk7 বনাম 8 আপনার% JAVA_Home% পরীক্ষা করুন


এটি কেবল একই উত্তরটি বলে যা অন্য উত্তরগুলি বলে।
স্টিফেন সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.