eclipse IDE তে java.io.Console সমর্থন


103

আমি আমার জাভা প্রকল্পগুলি বিকাশ, সংকলন এবং চালনার জন্য Eclipse IDE ব্যবহার করি। আজ, আমি java.io.Consoleআউটপুট এবং আরও গুরুত্বপূর্ণভাবে ব্যবহারকারীর ইনপুট পরিচালনা করতে ক্লাসটি ব্যবহার করার চেষ্টা করছি ।

সমস্যাটি হ'ল যখন কোনও অ্যাপ্লিকেশন "মাধ্যমে" গ্রহন করা হবে তখন System.console()ফিরে আসে null। আমাদের সাথে পরিচিত কনসোল উইন্ডোটির সাথে একটি শীর্ষ-স্তর প্রক্রিয়া না করেই গ্রহগ্রুপটি একটি পটভূমি প্রক্রিয়াতে প্রোগ্রামটি চালায়।

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


আরো দেখুন stackoverflow.com/questions/26470972/... আমি চিহ্নিত System.outএবং System.inআমার ব্যবহার ক্ষেত্রে জন্য যথেষ্ট হতে হবে এবং ব্যবহার abondaned করতে System.console()
ওয়ানওয়ার্ল্ড

আমি প্রকল্পটি চলমান জার হিসাবে রফতানি করেছিলাম, তবে আমি এখনও কনসোল নাল ত্রুটি
পেয়েছি

উত্তর:


50

আমি ধরে নিয়েছি আপনি Eclipse থেকে স্টেপ-থ্রু ডিবাগিংটি ব্যবহার করতে সক্ষম হতে চান। আপনি কেবল জেআরই ক্লাসপথে বিন ডিরেক্টরিতে নির্মিত ক্লাসগুলি স্থাপন করে বাহ্যিকভাবে ক্লাস পরিচালনা করতে পারেন।

java -cp workspace\p1\bin;workspace\p2\bin foo.Main

আপনি রিমোট ডিবাগার ব্যবহার করে এবং আপনার প্রকল্পে নির্মিত ক্লাস ফাইলগুলির সুবিধা গ্রহণ করে ডিবাগ করতে পারেন।

এই উদাহরণে, গ্রহগ্রহের প্রকল্প কাঠামোটি এরকম দেখাচ্ছে:

workspace\project\
                 \.classpath
                 \.project
                 \debug.bat
                 \bin\Main.class
                 \src\Main.java

1. ডিবিগ মোডে জেভিএম কনসোল শুরু করুন

debug.bat একটি উইন্ডোজ ব্যাচ ফাইল যা একটি cmd.exe কনসোল থেকে বাহ্যিকভাবে চালানো উচিত ।

@ECHO OFF
SET A_PORT=8787
SET A_DBG=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=%A_PORT%,server=y,suspend=y
java.exe %A_DBG% -cp .\bin Main

যুক্তিগুলিতে ডিবাগ বন্দরটি 8787 সেট করা হয়েছে । স্থগিত = Y যুক্তি ডিবাগার সংযুক্ত না হওয়া পর্যন্ত অপেক্ষা করতে জেভিএম বলে।

2. একটি ডিবাগ লঞ্চ কনফিগারেশন তৈরি করুন

Eclipse এ, ডিবাগ ডায়ালগটি খুলুন (চালান> ডিবাগ ডায়ালগ খুলুন ...) এবং নিম্নলিখিত সেটিংস সহ একটি নতুন রিমোট জাভা অ্যাপ্লিকেশন কনফিগারেশন তৈরি করুন :

  • প্রকল্প: আপনার প্রকল্পের নাম
  • সংযোগের ধরণ: স্ট্যান্ডার্ড (সকেট সংযুক্তি)
  • হোস্ট: লোকালহোস্ট
  • বন্দর: 8787

3. ডিবাগিং

সুতরাং, অ্যাপটি ডিবাগ করতে যে কোনও সময় আপনাকে যা করতে হবে তা হ'ল:

  • একটি বিরতি পয়েন্ট সেট করুন
  • কনসোলে ব্যাচ ফাইলটি চালু করুন
  • ডিবাগ কনফিগারেশন আরম্ভ করুন

আপনি 122429 বাগে এই সমস্যাটি ট্র্যাক করতে পারেন । আপনি এখানে বর্ণিত বিমূর্ত স্তর ব্যবহার করে আপনার অ্যাপ্লিকেশনটিতে এই সমস্যাটি নিয়ে কাজ করতে পারেন ।


1
আমি b pauseব্যাচের ফাইলটির শেষেও একটি রেখেছিলাম যাতে আপনি কোনও ত্রুটি বার্তা দেখতে পেল যা এটি বন্ধ হওয়ার আগে ফ্ল্যাশ হয়ে যায়।
ম্যাট লায়ন্স

10
এটি আমার জন্য শেষ খড়। আমাকে কেবল ডিবাগ করার জন্য যদি এই সমস্ত কিছু করতে হয় তবে আমি নেটবিনে ফিরে যাচ্ছি। Eclipse এ এতগুলি অবিকৃত বাগ এবং ইউআই বিরক্তি এটি মজারও নয়।
নুজোলিলো

@ নুজোলিলো, এটি কেবল দূরবর্তী ডিবাগিংয়ের জন্য। আপনি এগুলি ব্যতীত স্থানীয়ভাবে ডিবেগ করতে পারেন।
ল্যাপলি অ্যান্ডারসন

35

আমি যে কাজটি ব্যবহার করি তা হ'ল Eclipse ব্যবহার করার সময় কনসোলের পরিবর্তে কেবল System.in/System.out ব্যবহার করা। উদাহরণস্বরূপ, পরিবর্তে:

String line = System.console().readLine();

তুমি ব্যবহার করতে পার:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = bufferedReader.readLine();

20
আমি মনে করি না যে আপনি পাসওয়ার্ডটি মাস্কিংয়ের মাধ্যমে পাসওয়ার্ডগুলি পড়তে সক্ষম হবেন।
সুলেহ ফাতেহি

3
... এবং একটি হ্যান্ডেল করা প্রয়োজন IOException, যা ক্ষেত্রে নিক্ষেপ করা হয় না Console.readLine()
dma_k

5

এটি হওয়ার কারণ হ'ল গ্রহন আপনার অ্যাপ্লিকেশনটিকে ব্যাকগ্রাউন্ড প্রক্রিয়া হিসাবে চালায় এবং সিস্টেম কনসোল দিয়ে শীর্ষ স্তরের প্রক্রিয়া হিসাবে নয়।


5

আপনি নিজেই একটি ক্লাস প্রয়োগ করতে পারেন। নিম্নলিখিত একটি উদাহরণ:

public class Console {
    BufferedReader br;
    PrintStream ps;

    public Console(){
        br = new BufferedReader(new InputStreamReader(System.in));
        ps = System.out;
    }

    public String readLine(String out){
        ps.format(out);
        try{
            return br.readLine();
        }catch(IOException e)
        {
            return null;
        }
    }
    public PrintStream format(String format, Object...objects){
        return ps.format(format, objects);
    }
}

4

Http://www.stupidjavatricks.com/?p=43 এ সম্পর্কে কিছু পাওয়া গেছে ।

এবং দুঃখের বিষয়, যেহেতু কনসোলটি চূড়ান্ত, আপনি system.in এবং system.out এর আশেপাশে এ্যা র্যাপার তৈরি করতে এটি প্রসারিত করতে পারবেন না either এমনকি গ্রহগ্রহের কনসোলের অভ্যন্তরে আপনার এখনও সেইগুলিতে অ্যাক্সেস রয়েছে। সম্ভবতঃ কেন গ্রহনটি এটিকে এখনও তাদের কনসোলটিতে লাগেনি ...

আমি বুঝতে পারি যে কেন কোনও সিস্টেমার ছাড়াই আপনি সিস্টেম কন্টোল ছাড়া অন্য কোনও কনসোল পেতে চান না, তবে কেন আপনি চাইছেন না যে কেউ কেন ক্লাসটিকে ওভাররাইড করতে সক্ষম হবেন না কেন? উপহাস / পরীক্ষার কনসোল ...


4

অন্য বিকল্পটি হ'ল উভয় বিকল্পকে মোড়ানোর জন্য একটি পদ্ধতি তৈরি করা এবং যখন কনসোল উপলব্ধ না থাকে তখন System.in পদ্ধতিতে "ব্যর্থ হয়ে যান"। নীচের উদাহরণটি মোটামুটি প্রাথমিক একটি - আপনি প্রয়োজনীয় হিসাবে কনসোলের অন্যান্য পদ্ধতিগুলি (রিডপ্যাসওয়ার্ড, ফর্ম্যাট) গুটিয়ে রাখতে একই প্রক্রিয়াটি অনুসরণ করতে পারেন। এইভাবে আপনি এটিকে একটিলিপসে সুখীভাবে চালাতে পারবেন এবং এটি স্থাপনের পরে আপনি কনসোল বৈশিষ্ট্যগুলি (যেমন পাসওয়ার্ড হিডিং) লাথি মারবেন।

    private static String readLine(String prompt) {
        String line = null;
        Console c = System.console();
        if (c != null) {
             line = c.readLine(prompt);
        } else {
            System.out.print(prompt);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            try {
                 line = bufferedReader.readLine();
            } catch (IOException e) { 
                //Ignore    
            }
        }
        return line;
    }

2

আমি যতদূর বলতে পারি, Eclipse থেকে কনসোল অবজেক্ট পাওয়ার কোনও উপায় নেই। আমি ঠিক নিশ্চিত করেছি যে এটি কনসোল! = নাল, তারপরে এটি জার করে কমান্ড লাইন থেকে চালাও।


1

Eclipse এর মাধ্যমে অ্যাপ্লিকেশন চালানোর সময় java.io.Console অবজেক্ট পাওয়ার কোনও উপায় নেই বলে মনে হচ্ছে। অ্যাপ্লিকেশনটির সাথে একটি কমান্ড-লাইন কনসোল উইন্ডো খোলা হয়নি, কারণ এটি ব্যাকগ্রাউন্ড প্রক্রিয়া হিসাবে চালিত হয় (গ্রহের পটভূমিতে?)? মূলত java.io.Console একটি চূড়ান্ত শ্রেণি হওয়ায় এই সমস্যাটি হ্যান্ডেল করার জন্য বর্তমানে কোনও Eclipse প্লাগইন নেই।

আপনি যা করতে পারবেন তা হ'ল নালার জন্য ফিরে আসা কনসোল অবজেক্টটি পরীক্ষা করে সেখান থেকে এগিয়ে যাওয়া।


1

এই লিঙ্কটি সিস্টেম.কনসোল () ব্যবহারের বিকল্প সরবরাহ করে। একটি হ'ল System.in এর চারপাশে মোড়ানো একটি বাফার্ডারিডার ব্যবহার করা, দ্বিতীয়টি হ'ল System.in এর চারপাশে মোড়ানো স্ক্যানার ব্যবহার করা।

উভয়ই কনসোলের মতো সংক্ষিপ্ত নয়, তবে উভয়ই ডিগ্রি অবলম্বন না করেই গ্রহনে কাজ করে!


0

আসুন ধরা যাক আপনার অ্যাকলিপস ওয়ার্কস্পেসটি সি: \ মাই ওয়ার্কস্পেস, আপনি আপনার জাভা অ্যাপ্লিকেশনটি একটি ম্যাভেন প্রজেক্ট মাইপ্রজেক্টের মধ্যে তৈরি করেছেন এবং আপনার জাভা মূল শ্রেণিটি com.mydomain.mypackage.MyClass।

এই ক্ষেত্রে, আপনি System.console()কমান্ড লাইনে ব্যবহার করে এমন আপনার প্রধান ক্লাস চালাতে পারেন :

java -cp C:\MyWorkspace\MyProject\target\classes com.mydomain.mypackage.MyClass

এনবি 1: এটি কোনও মাভেন প্রকল্পে না থাকলে, প্রকল্পের বৈশিষ্ট্যগুলিতে আউটপুট ফোল্ডারটি পরীক্ষা করুন জাভা বিল্ড পাথ | উৎস. এটি "টার্গেট / ক্লাস" নাও হতে পারে

এনবি 2: যদি এটি কোনও মভেন প্রকল্প হয় তবে আপনার ক্লাসটি এসসিআর / পরীক্ষা / জাভাতে রয়েছে, আপনাকে সম্ভবত "টার্গেট \ ক্লাস" পরিবর্তে "টার্গেট \ টেস্ট-ক্লাস" ব্যবহার করতে হবে

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