2013-08-06 16 views
7

मैं कक्षा के लिए असाइनमेंट पर प्रोग्रामिंग और काम करने के लिए काफी नया हूं। अब, मैं किसी के लिए अपना कोड लिखने के लिए नहीं कह रहा हूं लेकिन मैं रनटाइम त्रुटि से फंस गया हूं। असाइनमेंट में हमें एक फ़ाइल को पढ़ने की आवश्यकता है, पहली पंक्ति का उपयोग करें, "15", सरणी के आकार को आरंभ करने के लिए, और प्रत्येक पंक्ति से जानकारी के साथ सरणी भरने के लिए आगे बढ़ें।मुझे "ArrayIndexOutOfBoundsException" क्यों मिला?

संपादित करें: मैं सभी कोड पोस्ट नहीं करना चाहता था क्योंकि मैंने सोचा था कि यह बहुत लंबा लगेगा लेकिन अस्पष्ट होने के लिए डाउनवॉट्स के कारण, यह यहां जाता है।

फ़ाइल:

15 
produce,3554,broccoli,5.99,1 
produce,3554,broccoli,5.99,1 
produce,3555,carrots,2.23,0.25 
produce,3555,carrots,2.23,0.25 
produce,3555,carrots,2.23,0.25 
cleaning,2345,windex,5.99,1 unit 
cleaning,2345,windex,5.99,1 unit 
cleaning,2345,windex,5.99,1 unit 
cleaning,2345,windex,5.99,1 unit 
cleaning,2346,toilet paper,12.99,4 rolls 
cleaning,2346,toilet paper,12.99,4 rolls 
cleaning,2335,windex,2.25,1 mini sprayer 
cleaning,1342,wipes,3.99,10 units 
cleaning,1342,wipes,3.99,10 units 
produce,3546,lettuce,2.99,0.5 

मेरे त्रुटि:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 15 
    at Inventory.readFile(Inventory.java:45) 
    at Inventory.<init>(Inventory.java:12) 
    at Supermarket.main(Supermarket.java:3) 

प्रश्न में लाइन 45 के साथ कक्षा (लाइन 45 टिप्पणी की है, सही करने के लिए स्क्रॉल) "

import java.util.Scanner; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class Inventory{ 
    Product[] list; 
    String[] invData; 
    private int i = 0; 
    public int count; 

    public Inventory (String f){ 
     readFile(f); 
    } 

    public int indexOfProduct(int code){   
     for(i=0; i<list.length; i++){ 
      if (list[i] != null) 
       if (list[i].getCode() == code) 
        return i; 

     } 
     return -1; 
    } 


    public Product delete(int pos){ 
     Product temp = new Product(); 
     temp = list[pos]; 
     list[pos] = null; 
     return temp; 
    } 

    public void readFile(String fileName){ 
     try{ 
      File invList = new File (fileName); 
      Scanner s = new Scanner(invList); 
      int itemCount = s.nextInt(); 
      list = new Product[itemCount]; 
      count = itemCount; 
      while (s.hasNext()){ 
       String line = s.nextLine(); 
       invData = line.split(","); 
       if (invData[0].equals("produce")){ 
        list[i] = new Produce(invData[1], invData[2], invData[3], invData[4]); // This is Line 45, Where the error occurs 
       } else if(invData[0].equals("cleaning")){ 
        list[i] = new Cleaning(invData[1], invData[2], invData[3], invData[4]); 
       } 
       i++; 
      }//end of while loop 
     } catch (FileNotFoundException Abra) { 
      String error = Abra.getMessage(); 
      System.out.println(error); 
      } 
    } // end of method 

    public Product findCode(int c){ 
     for(int i=0; i<list.length;i++) 
      if(list[1].getCode() == c) 
       return list[i]; 
     return null; 
    }//end of method 
}//end of class 

क्यों क्या मुझे "ArrayIndexOutOfBoundsException" मिला है? मुझे उम्मीद है कि कोई मेरे तर्क में दोष को इंगित कर सकता है, इसलिए मैं इसे दोहराना नहीं चाहता।

+2

शायद आप से संकेत मिलता है जो रेखा है 45 परवाह चाहते हैं ?? हमारे Ouija बोर्ड इस शाम बहुत अच्छी तरह से काम नहीं कर रहे हैं। –

+1

आप कहां 'सूची' –

+2

परिभाषित करते हैं हां, आपके पास कई वैश्विक चर हैं जो वास्तव में विधि स्थानीय होना चाहिए। –

उत्तर

3

आप कितनी बार पढ़ते हैं फ़ाइल? फ़ंक्शन की शुरुआत में आपके पास i = 0; होना चाहिए।

3

"i" वैश्विक मूल्य नहीं होना चाहिए, लेकिन एक स्थानीय स्थानीय चर होना चाहिए, जो शून्य में प्रारंभ किया जाना चाहिए।

6

आपकी समस्या स्पष्ट रूप से i के उपयोग के साथ स्पष्ट है, क्योंकि यह उस रेखा पर एकमात्र चरणीय अनुक्रमणिका है, और रेंज इंडेक्स का बाहर "15" है, जो आपके 15-आइटम सरणी के अंत से ठीक है। तो, i के उपयोग के आस-पास के कुछ मुद्दे:

जैसा कि nhellwig का उल्लेख किया गया है, सुनिश्चित करें कि i वास्तव में इस फ़ंक्शन को कॉल करने से पहले 0 पर प्रारंभ किया गया है।

इसके अतिरिक्त, आप फ़ाइल में आइटम नंबर की स्थिरता और वस्तुओं की वास्तविक संख्या में बहुत अधिक विश्वास डाल रहे हैं। आपको या तो चेतावनी देना चाहिए और i >= itemCount पर सरणी में वस्तुओं को स्टोर करने का प्रयास करना बंद करना चाहिए, या एक निश्चित आकार सरणी के बजाय नए आइटम को समायोजित करने के लिए एक ऐरेलिस्ट जैसे कंटेनर का उपयोग करना चाहिए।

संपादित करें: इसके अलावा, मैं कहना चाहिए कि आप i को बढ़ा देते आप किसी आइटम या नहीं, यहां तक ​​कि रिक्त लाइनों i बढ़ेगी, जब, अपनी सूची या सरणी लगने में अंतराल पैदा कर रहा है जिसका अर्थ है पढ़ा है या नहीं। चूंकि itemCount आइटमों की संख्या है, तो आपको उस पर चिपकना चाहिए और यदि आप वास्तविक आइटम पढ़ते हैं तो केवल i बढ़ाना चाहिए।

उसी भावना में, आपको विभाजित() के बाद invData.length == 5 सत्यापित करना चाहिए, क्योंकि आपकी फ़ाइल में एक गलत स्थानांतरित कॉमा आदि भी ओओबी त्रुटि के साथ समाप्त हो सकता है। अनुमोदित, आपके प्रोजेक्ट के लिए, "उत्पादन" या "सफाई" से शुरू होने वाली रेखा में तत्वों की संख्या के बारे में अनुमान लगाने के लिए शायद ठीक है, लेकिन आम तौर पर उपयोगकर्ता द्वारा बनाई गई फ़ाइल से आने वाले डेटा के साथ सावधान रहना महत्वपूर्ण है।

5

मुझे यह जवाब मिला कि मुझे "s.nextLine();"

क्योंकि मैंने "s.nextInt();" सूचक मेरी फ़ाइल में "15" के अंत में बस लटक गया था। फिर, जब लूप लूप में पहली पंक्ति "स्ट्रिंग लाइन = s.nextLine();" सूची फ़ाइल की दूसरी पंक्ति में उत्पादन में पी से पहले 15 के अंत तक पॉइंटर को स्थानांतरित कर दिया गया।

काम कर विधि इस प्रकार है:

public void readFile(String fileName){ 
    try{ 
     File invList = new File (fileName); 
     Scanner s = new Scanner(invList); 
     int itemCount = s.nextInt(); 
     s.nextLine(); // This is the new line that made it work 
     list = new Product[itemCount]; 
     count = itemCount; 
     while (s.hasNext()){ 
      String line = s.nextLine(); //moves file pointer over one 
      invData = line.split(","); 
      if (invData[0].equals("produce")){ 
       list[i] = new Produce(invData[1], invData[2], invData[3], invData[4]); 
      } else if(invData[0].equals("cleaning")){ 
       list[i] = new Cleaning(invData[1], invData[2], invData[3], invData[4]); 
      } 
      i++; 
     }//end of while loop 
    } catch (FileNotFoundException Abra) { 
     String error = Abra.getMessage(); 
     System.out.println(error); 
     } 
} // end of method 
+0

जब कोई आइटम पढ़ा जाता है तो केवल 'i' बढ़ाना एक और मजबूत समाधान होगा। अच्छी पकड़, इसे ठीक करना, लेकिन आपको वास्तव में अन्य उत्तरों में दी गई सलाह को अनदेखा नहीं करना चाहिए। –

संबंधित मुद्दे