2014-02-12 2 views
0

Issue теперь я получаю java.lang.ArrayIndexOutOfBoundsException:«java.lang.ArrayIndexOutOfBoundsException» Проблема с логикой массива

Я возился вокруг в течение нескольких часов и не знаю, если проблема в SalesManager или SalesAnaylzer.

То, что я пытаюсь сделать, это форматировать массив значений денег и добавить Lables магазин 1 .. и четв 1 ... Im уверен, что я получил totalSales, highestStoreSales и averageStoreSales правильно Вот мой код:

import java.io.File; 
import java.text.DecimalFormat; 
import java.util.Scanner; 
import java.io.IOException;; 

public class SalesManager 
    { 
    public static void main(String []args) throws IOException 
    { 
    System.out.println(" What is the name of the file"); 
    Scanner scan= new Scanner(System.in); 
    String fileName= scan.next(); 
    SalesAnaylzer sA = new SalesAnaylzer(fileName); 
    /*System.out.println(data); 
    System.out.println("Here are the stores' sales for the past four quarters:" + 
       "/n" + data); 
    System.out.println("The total sales were:" + total); 
    System.out.println("The highest quarterly sales were:" + highest); 
    System.out.println("The average quarterly sales were:" + avg);*/ 
    } 
} 

и вот этот класс файл:

import java.io.File; 
import java.text.DecimalFormat; 
import java.util.Scanner; 
import java.io.IOException; 
import java.util.*; 
import javax.swing.*; 
import java.awt.*; 

public class SalesAnaylzer 
{ 

    DecimalFormat pricePattern= new DecimalFormat("$#0.00"); 
    int [][]sales= new int [3][4]; 

public SalesAnaylzer(String fileName)throws IOException 
    { 

    File inputFile= new File(fileName); 
    Scanner scan= new Scanner(inputFile); 
    for (int row=0; row<4; row++){ 
     for (int col=0; col<6; col++){ 
     sales [row][col]= scan.nextInt(); 
     } 
     } 
} 
public String toString() 
{ 
    String data = ""; 
    for (int row=0; row<4; row++){ 
    data =data +"\nStore "+(row+1)+": "; 
    for (int col=0; col<6; col++){ 
    data =data + "QTR "+(col+1)+": "+pricePattern.format(sales[row][col])+" "; 
     } 
    } 
return data; 
} 
public double totalSales() 
{ 
    double total=0.0; 
    for (int row=0; row<4; row++){ 
    for (int col=0; col<6; col++){ 
     total= total + sales[row][col]; 
     } 
    } 
    return total; 
} 
public double highStoreSales(int store) 
{ 
    double highest=0.0; 
    for (int row=0; row<4; row++){ 
    if(sales[row][store]> highest) 
     highest =sales[row][store]; 
    } 
    return highest; 
} 
public double averageStoreSales(int quarter) 
{ 
    double total=0.0; 
    double avg=0.0; 
    for (int col=0; col<6; col++){ 
    total=total+sales[quarter][col]; 
    } 
    avg=(total/4); 
    return avg; 
} 
} 


java.io.FileNotFoundException: CompuDataSales (The system cannot find the file specified) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at java.util.Scanner.<init>(Unknown Source) 
    at SalesManager.main(SalesManager.java:16) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272) 
+1

Попробуйте заменить переменную 'fileName' на фактический путь к файлу и посмотреть, работает ли это. – helderdarocha

+0

Ну, мне нужно, чтобы пользователь вводил имя файла, так что fileName никогда не будет таким же. – user2985542

+0

Имеет ли файлName пробелы случайно? – BroSlow

ответ

1

Я предполагаю, что вы используете имя файла с пробелами внутри него. scan.next() берет следующий «токен», который ограничен пробелами. Если ваше имя файла, например: C:\User\John Smith\Documents\file.ext, то переменная fileName будет содержать только C:\User\John. Вместо этого используйте scan.nextLine(), чтобы захватить все до ключа Enter.

Если вы не разместите свой полный стек с ним (каждая строка ошибки выводится из исключения), мы не можем точно понять, в чем проблема, поэтому я собираюсь сделать еще одно предположение о том, ,

Возможно, вы используете имя файла без полного пути, и программа не знает, где его найти.

  • Если вы используете IDE, файл должен находиться в том же каталоге, что и ваши папки «src» и «classes».
  • Если вы используете командную строку, убедитесь, что файл находится в вашем «classpath». Здесь JVM ищет имена файлов, которые не имеют полных путей. Это часто совпадает с файлом .class или .jar, который вы выполняете.

Я не могу придумать ничего другого, что могло бы быть неправильным с вашим кодом, если ничто из того, что я упоминал, не исправляет вашу проблему, отредактируйте свой основной пост, чтобы включить полную стек.

Редактировать: Из комментариев к этому ответу мы пришли к выводу, что проблема, с которой был пользователь, заключалась в том, что они исключали расширение файла из имени файла. CompuDataSales должно было быть CompuDataSales.txt. Другие пользователи, имеющие аналогичную проблему, должны проверить, чтобы расширения присутствовали в именах файлов.

+0

имя файла: CompuDataSales, так что в нем нет пробелов – user2985542

+0

Имеет ли файл расширение, например '.txt' или' .doc'? Вы находитесь в окнах, вы должны изменять параметры своей папки, чтобы постоянно показывать расширения файлов. – Axoren

+0

Да, это файл .txt, я даже запустил пользовательский ввод и просто вызвал файл сам по себе и получил тот же результат. – user2985542

Смежные вопросы