java.io.Console ग्रहण आईडीई में समर्थन करता है


103

मैं अपने जावा प्रोजेक्ट्स को विकसित करने, संकलित करने और चलाने के लिए ग्रहण आईडीई का उपयोग करता हूं। आज, मैं java.io.Consoleआउटपुट का प्रबंधन करने के लिए वर्ग का उपयोग करने की कोशिश कर रहा हूं और, इससे भी महत्वपूर्ण, उपयोगकर्ता इनपुट।

समस्या यह है कि है System.console()रिटर्न nullजब एक आवेदन ग्रहण "के माध्यम से" चलाया जाता है। ग्रहण एक पृष्ठभूमि प्रक्रिया पर कार्यक्रम चलाते हैं, हम सांत्वना खिड़की के साथ एक शीर्ष-स्तरीय प्रक्रिया के बजाय, जिससे हम परिचित हैं।

क्या एक्लिप्स को प्रोग्राम को शीर्ष स्तर की प्रक्रिया के रूप में चलाने के लिए मजबूर करने का एक तरीका है, या कम से कम एक कंसोल बनाएं जो जेवीएम को पहचान लेगा? अन्यथा, मैं इस परियोजना को समाप्त करने के लिए मजबूर हूं और एक कमांड-लाइन वातावरण पर बाहरी के लिए चलना चाहता हूं।


इसके अलावा stackoverflow.com/questions/26470972/… देखें। मैंने अपने उपयोग के मामले की पहचान की System.outऔर System.inउपयोग करने के लिए पर्याप्त था System.console()
वनवर्ल्ड

मैंने इस प्रोजेक्ट को रन करने योग्य जार के रूप में निर्यात किया, लेकिन मुझे अभी भी कंसोल अशक्त त्रुटि मिल रही है
अभिज्ञान

जवाबों:


50

मुझे लगता है कि आप ग्रहण से डीबगिंग का उपयोग करने में सक्षम होना चाहते हैं। आप सिर्फ JRE क्लासपाथ पर बिन निर्देशिकाओं में निर्मित कक्षाएं स्थापित करके बाहरी रूप से कक्षाएं चला सकते हैं।

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

आप दूरस्थ डीबगर का उपयोग करके डीबग कर सकते हैं और अपनी परियोजना में निर्मित वर्ग फ़ाइलों का लाभ उठा सकते हैं।

इस उदाहरण में, ग्रहण परियोजना संरचना इस तरह दिखती है:

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

1. डिबग मोड में JVM कंसोल शुरू करें

debug.bat एक Windows बैच फ़ाइल है जिसे 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 तर्क डिबगर देता तक इंतजार करना JVM बताता है।

2. एक डीबग लॉन्च कॉन्फ़िगरेशन बनाएँ

ग्रहण में, डीबग संवाद खोलें (रन> डीबग डायलॉग खोलें ...) और निम्न सेटिंग्स के साथ एक नया रिमोट जावा एप्लिकेशन कॉन्फ़िगरेशन बनाएं :

  • प्रोजेक्ट: आपका प्रोजेक्ट नाम
  • कनेक्शन प्रकार: मानक (सॉकेट अटैच)
  • होस्ट: लोकलहोस्ट
  • पोर्ट: 8787

3. डिबगिंग

इसलिए, आपको ऐप को डीबग करने के लिए किसी भी समय करना होगा:

  • एक ब्रेक प्वाइंट सेट करें
  • कंसोल में बैच फ़ाइल लॉन्च करें
  • डीबग कॉन्फ़िगरेशन लॉन्च करें

आप इस समस्या को बग 122429 में ट्रैक कर सकते हैं । आप यहाँ वर्णित के रूप में एक अमूर्त परत का उपयोग करके अपने आवेदन में इस मुद्दे को गोल कर सकते हैं


1
मैं pauseउस बैच फ़ाइल के अंत में भी रखूँगा ताकि आप किसी भी त्रुटि संदेश को देख सकें जो बंद होने से पहले फ्लैश हो।
मैट ल्योंस

10
यह मेरे लिए आखिरी तिनका है। अगर मुझे यह सब सिर्फ डिबग करना है, तो मैं नेटबीन्स पर वापस जा रहा हूं। एक्लिप्स में इतने सारे अनफिक्स किए गए बग्स और यूआई झुंझलाहट भी अजीब नहीं है।
nuzzolilo

@ न्यूज़ोलिलो, यह केवल दूरस्थ डिबगिंग के लिए है। आप उन सभी के बिना ग्रहण में स्थानीय रूप से डिबग कर सकते हैं।
लाप्ली एंडरसन

35

जो वर्कअराउंड मैं उपयोग कर रहा हूं वह सिर्फ ग्रहण के समय कंसोल के बजाय 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 के आसपास आ रैपर बनाने के लिए विस्तारित नहीं कर सकते हैं। ग्रहण कंसोल के अंदर भी आपके पास उन तक पहुंच है। शायद यही कारण है कि ग्रहण ने अपने कंसोल में इसे अभी तक प्लग नहीं किया है ...

मैं समझता हूं कि आप सिस्टम के अलावा किसी अन्य तरीके से सांत्वना पाने के लिए कोई अन्य तरीका क्यों नहीं चाहेंगे। बिना किसी सेटर के, लेकिन मुझे समझ में नहीं आता कि आप क्यों नहीं चाहेंगे कि कोई व्यक्ति वर्ग बनाने में सक्षम हो। मॉक / टेस्टिंग कंसोल ...


4

एक अन्य विकल्प दोनों विकल्पों को लपेटने के लिए एक विधि बनाने के लिए है, और कंसोल के उपलब्ध नहीं होने पर System.in विधि में "विफल रहें"। नीचे दिया गया उदाहरण काफी बुनियादी है - आप आवश्यकतानुसार अन्य विधियों को कंसोल (readPassword, format) में लपेटने के लिए उसी प्रक्रिया का पालन कर सकते हैं। इस तरह से आप इसे एक्लिप्स में खुशी से चला सकते हैं और जब इसकी तैनाती की जाती है तो आपको किकिंग में कंसोल सुविधाएँ (जैसे पासवर्ड छिपाना) मिलती हैं।

    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

जहां तक ​​मैं बता सकता हूं, ग्रहण से कंसोल ऑब्जेक्ट प्राप्त करने का कोई तरीका नहीं है। मैं बस यह सुनिश्चित करूँगा कि कंसोल! = अशक्त है, फिर इसे जार करें और इसे कमांड लाइन से चलाएं।


1

ग्रहण के माध्यम से एप्लिकेशन चलाते समय java.io.Console ऑब्जेक्ट प्राप्त करने का कोई तरीका प्रतीत नहीं होता है। एक कमांड-लाइन कंसोल विंडो को एप्लिकेशन के साथ नहीं खोला जाता है, क्योंकि यह एक पृष्ठभूमि प्रक्रिया (पृष्ठभूमि से ग्रहण) के रूप में चलाया जाता है। वर्तमान में, इस मुद्दे को संभालने के लिए कोई ग्रहण प्लगइन नहीं है, मुख्य रूप से इस तथ्य के कारण कि java.io.Console एक अंतिम वर्ग है।

आप वास्तव में कर सकते हैं अशक्त के लिए लौटे कंसोल ऑब्जेक्ट का परीक्षण करें और वहां से आगे बढ़ें।


1

यह लिंक System.console () का उपयोग करने के लिए विकल्प प्रदान करता है। एक को System.in के चारों ओर लिपटे बफ़रडर का उपयोग करना है, दूसरा System.in के चारों ओर लिपटा हुआ एक स्कैनर का उपयोग करना है।

न तो सांत्वना के रूप में संक्षिप्त हैं, लेकिन दोनों बिना किसी बहस के सहारा लेने के लिए ग्रहण में काम करते हैं!


0

मान लें कि आपका ग्रहण कार्यक्षेत्र C: \ MyWorkspace है, तो आपने एक जावा प्रोजेक्ट MyProject के अंदर अपना जावा एप्लिकेशन बनाया और आपका जावा मुख्य वर्ग com.mydomain.mypackage.MyClass है।

इस स्थिति में, आप अपने मुख्य वर्ग System.console()को कमांड लाइन पर उपयोग कर सकते हैं :

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

NB1: यदि यह एक मावेन परियोजना में नहीं है, तो परियोजना गुणों में आउटपुट फ़ोल्डर की जांच करें जावा बिल्ड पाथ | स्रोत। यह "लक्ष्य / वर्ग" नहीं हो सकता है

NB2: यदि यह एक मावेन परियोजना है, लेकिन आपकी कक्षा src / test / java में है, तो आपको "target \ classes" के बजाय "target \ test-classes" का उपयोग करना होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.