मैं इसके साथ फंस गया हूं और समाधान नहीं ढूंढ पा रहा हूं। थ्रेड "मुख्य" java.lang.StringIndexOutOfBoundsException में अपवाद की त्रुटि प्राप्त करें: सीमा से बाहर स्ट्रिंग अनुक्रमणिका: 11.

क्या कोई इसे हल करने में मदद कर सकता है? मेरा कोड:

public static void main(String[] args) {
    try {
        Scanner sc = new Scanner(new File("Testing.txt"));
        int i = 0;

        while(sc.hasNext()){
            String line = sc.nextLine();
            char needle = line.charAt(i);

            while(i < line.length()){
                if(Character.isUpperCase(needle)) {
                    while(needle != ' '){
                        System.out.print(needle);
                        i++;
                        needle = line.charAt(i);
                    }
                    System.out.println(needle);
                }
                else{
                    i++;
                    needle = line.charAt(i);
               }
            }
        }
    } 
    catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
    }
}
1
K.W 13 मार्च 2017, 10:58
1
आप वास्तव में क्या करने की कोशिश कर रहे हैं?
 – 
Scary Wombat
13 मार्च 2017, 11:09
मैं उन सभी स्ट्रिंग्स को प्राप्त करने का प्रयास कर रहा हूं जिनमें इनपुट टेक्स्ट फ़ाइल से कैपिटल लेटर है। उदा. इनपुट टेक्स्ट फ़ाइल में "केनी और मैं रेस्तरां स्वादिष्ट में खा रहे हैं" है। आउटपुट "केनी, आई, रेस्टोरेंट, यम्मी" होगा।
 – 
K.W
13 मार्च 2017, 11:40
अपनी लाइन को शब्द में विभाजित करने के लिए स्प्लिट का उपयोग करें और यह देखने के लिए पहले चार का परीक्षण करें कि क्या अपरकेस से शुरू होता है
 – 
Scary Wombat
13 मार्च 2017, 11:42
कोई उदाहरण जिसका मैं उल्लेख कर सकता हूं? धन्यवाद।
 – 
K.W
13 मार्च 2017, 11:46
K.W मैंने आपको दिखाते हुए एक उत्तर जोड़ा है कि कैसे। बहुत साफ और समझने में आसान मुझे लगता है
 – 
Scary Wombat
14 मार्च 2017, 03:50

3 जवाब

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

मेरी उपरोक्त टिप्पणी के अनुसार, स्ट्रिंग split विधि का उपयोग करना आसान होगा। बेशक input को फ़ाइल के टेक्स्ट से बदला जा सकता है, और expectedResult का उपयोग करके और यह परीक्षण करना कि आउटपुट बराबर है जो पूरी तरह से वैकल्पिक है

  public static void main(String[] args)
  {

      String input = "Kenny and I are eating in the Restaurant Yummy";
      String expectedResult = "Kenny, I, Restaurant, Yummy";
      String arr [] = input.split (" ");

      StringBuilder out = new StringBuilder();
      for (int i = 0; i < arr.length; i++) {
          if (Character.isUpperCase(arr[i].charAt(0))) {
              out.append(arr[i]).append(", ");
          }
      }

      if (out.length() > 1) {
          out.setLength(out.length() -2);
      }

      System.out.println (out);
      assert (expectedResult.equals(out.toString()));

  }  

आउटपुट

केनी, मैं, रेस्टोरेंट, स्वादिष्ट

0
Scary Wombat 14 मार्च 2017, 03:49
क्या मैं जान सकता हूँ कि यह लाइन क्या करती है? अगर (बाहर। लंबाई ()> 1) { out.setLength (बाहर। लंबाई () -2); }
 – 
K.W
14 मार्च 2017, 15:33
क्योंकि हम प्रत्येक घटना में ", " जोड़ रहे हैं, हम अंतिम को हटाना चाहते हैं।
 – 
Scary Wombat
15 मार्च 2017, 02:42

मेरी धारणा यह है कि आपकी त्रुटि यहाँ होगी;

                i++;
                needle = line.charAt(i);

तथा

                while(needle != ' '){
                    System.out.print(needle);
                    i++;
                    needle = line.charAt(i);
                }

जैसा कि आप सूचकांक को बिना जाँचे बढ़ा रहे हैं कि सूचकांक मौजूद है या नहीं।

1
Steve101 13 मार्च 2017, 11:24
इसे कैसे ठीक करें इसका कोई विचार? यह कैसे जांचें कि उपरोक्त कोड से सूचकांक मौजूद है या नहीं?
 – 
K.W
13 मार्च 2017, 11:39
कुछ ऐसा if(i <line.length()), जैसा कि आपके पास कहीं और है।
 – 
Steve101
13 मार्च 2017, 11:40

मुझे यकीन नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं। लेकिन आपकी त्रुटि से, मैं कह सकता हूं कि आप इंडेक्स काउंटर को बढ़ाने की कोशिश कर रहे हैं और फिर अपने स्ट्रिंग में तत्व तक पहुंचने का प्रयास कर रहे हैं।

आपके while लूप और else ब्लॉक के अंदर, आपके पास ये कथन हैं:

i++;
needle = line.charAt(i);

उन दोनों को इसमें बदलें:

needle = line.charAt(i);
i++;

और आपका कोड उक्त अपवाद के बिना चलेगा।

अपडेट करें

मैंने ऊपर बताए गए बदलाव किए, और कुछ बदलाव किए।

  1. पहले लूप के अंदर int i=0; के लिए डिक्लेरेशन शामिल करें। टेक्स्ट फ़ाइल में एक से अधिक पंक्तियों के लिए इसकी आवश्यकता होती है।
  2. घोषणा char needle = line.charAt(i); दूसरे लूप के अंदर स्टेटमेंट शामिल करें क्योंकि आपको प्रत्येक लाइन के लिए सुई को इनिशियलाइज़ करने की आवश्यकता है।

try (Scanner sc = new Scanner(new File("Testing.txt"))) {

    while (sc.hasNext()) {
        String line = sc.nextLine();
        int i = 0;

        while (i < line.length()) {
            char needle = line.charAt(i);
            if (Character.isUpperCase(needle)) {
                while (needle != ' ' && i < line.length()) {
                    needle = line.charAt(i);
                    if(needle != ' '){
                        System.out.print(needle);
                    }
                    i++;
                }
                if(i < line.length()) {
                    System.out.print(", ");
                }
            } else {
                needle = line.charAt(i);
                i++;
            }
        }
        System.out.println();
    }
} catch (FileNotFoundException e) {
    System.out.println(e.getMessage());
}

यह निम्नलिखित आउटपुट प्रिंट करता है:

Kenny, I, Restaurant, Yummy

उम्मीद है ये मदद करेगा!

0
anacron 13 मार्च 2017, 12:39
मैं उन सभी स्ट्रिंग्स को प्राप्त करने का प्रयास कर रहा हूं जिनमें इनपुट टेक्स्ट फ़ाइल से कैपिटल लेटर है। उदा. इनपुट टेक्स्ट फ़ाइल में "केनी और मैं रेस्तरां स्वादिष्ट में खा रहे हैं" है। आउटपुट "केनी, आई, रेस्टोरेंट, यम्मी" होगा। मैंने आपके द्वारा सुझाए गए समाधान के अनुसार उन दोनों को बदलने की कोशिश की है, लेकिन फिर भी वही त्रुटि हो रही है।
 – 
K.W
13 मार्च 2017, 11:37