मैंने एक ऐसा एप्लिकेशन बनाया है जो दूसरे एप्लिकेशन टीसीपी के माध्यम से संचार करता है और मुझे एक त्रुटि मिलती है:

System.NullReferenceException: 'ऑब्जेक्ट रेफरेंस किसी ऑब्जेक्ट के इंस्टेंस पर सेट नहीं है।' --> s जबकि लूप में शून्य था।

यह त्रुटि केवल तब होती है जब मैं दूसरे एप्लिकेशन को जबरदस्ती बंद कर देता हूं (ऐप के शीर्ष पर एक्स दबाकर या टास्क मैनेजर के माध्यम से इसे मारकर) जो अभी भी पहले के साथ जुड़ा हुआ है।

मेरा पहला एप्लिकेशन जो कमांड प्राप्त करता है और उन्हें प्रिंट करता है:

try
{
    StreamReader reader = new StreamReader(client.GetStream());
    StreamWriter writer = new StreamWriter(client.GetStream());
    string s = String.Empty;
    while (!(s = reader.ReadLine()).Equals("PING"))
        Console.WriteLine(s);
    reader.Close();
    writer.Close();
    client.Close();
}
catch (IOException)
{
    Console.WriteLine("woops an error!");
}

मेरा दूसरा एप्लिकेशन जो कमांड भेजता है:

try
{
    TcpClient client = new TcpClient("192.168.0.107", 8080);
    StreamReader reader = new StreamReader(client.GetStream());
    StreamWriter writer = new StreamWriter(client.GetStream());
    writer.WriteLine("PING");
    writer.Flush();
    reader.Close();
    writer.Close();
    client.Close();
}catch(Exception ex)
    Console.WriteLine(ex.Message);

मैंने जाँचने की कोशिश की कि क्या s==null(नीचे की तरह) और यह अभी भी एक अपवाद फेंकता है।

while (!(s = reader.ReadLine()).Equals("PING") || (s==null))
0
William 27 जुलाई 2017, 21:59
1
का संभावित डुप्लिकेट इसे ठीक करें?
 – 
Filburt
27 जुलाई 2017, 22:00
आपका स्ट्रीमरीडर आपके क्लाइंट ऑब्जेक्ट पर निर्भर करता है, जो दूसरे ऐप के डिस्कनेक्ट होने पर डिस्पोज हो जाता है, बस इसके लिए कुछ एरर हैंडलिंग जोड़ें।
 – 
colsw
27 जुलाई 2017, 22:00
Equals विधि को कॉल करने के बाद आपका दूसरा चेक s==null निष्पादित किया गया
 – 
Aleks Andreev
27 जुलाई 2017, 22:06

1 उत्तर

सबसे बढ़िया उत्तर

यदि रीडर.रीडलाइन () शून्य लौटाता है, तो नल को एस को सौंपा जाएगा और फिर आप तुरंत कॉल करेंगे। शून्य पर बराबर (कोई भी असाइनमेंट स्वचालित रूप से वह मान लौटाता है जिसे असाइन किया गया था) s == नल इसे रोकने के लिए कुछ नहीं करता है और वास्तव में यह नहीं कर सकता; इसे बाईं ओर स्वैप करने से या तो मदद नहीं मिलेगी क्योंकि कोष्ठक पूर्वता लेते हैं - कॉल करने से पहले आपको इसे शून्य के लिए जांचना होगा। इस पर बराबर है

बेहतर होगा कि आप लूप के लिए उपयोग करें और एक कथन में इतना कुछ करने की कोशिश न करें

for(s = reader.ReadLine(); s!=null && s.Equals("PING"); s = reader.ReadLine())
3
Caius Jard 28 जुलाई 2017, 01:32
+1 एक बयान में इतना कुछ करने की कोशिश नहीं करने के लिए। मुझे लगता है कि ओपी ने अपने लिए भ्रम पैदा किया।
 – 
KSib
27 जुलाई 2017, 22:06
मैं एक ही लाइन में गजब चीजें करने का भी बड़ा प्रशंसक नहीं हूं। यह आपके लिए और दूसरों के लिए भ्रमित करने वाला है, जिन्हें आपके कोड को बनाए रखने की आवश्यकता हो सकती है।
 – 
JuanR
27 जुलाई 2017, 22:07