2014-10-07 1 views
2

안녕하세요,이 코드를 읽으면서 파일을 읽으려고합니다. 파일을 읽은 후 파일의 각 문자의 ASCII 값을 가져와 대문자, 소문자 및 숫자의 빈도 카운터를 만들려고합니다.파일을 읽은 다음 ascii로 문자열을 변환하여 주파수 카운터를 만듭니다.

내 코드를 사용하여 파일을 읽으려고합니다. 그에 따라 각 배열에 배치하십시오. 그런 다음 배열을 주파수 카운터로 사용하여 대문자, 소문자 및 숫자가 있는지 확인할 수 있습니다. Counting.AddToArrays (Counting.java:64) 카운트에서

에서 스레드 "주요"java.lang.NullPointerException이

에서

예외 :

import java.io.*; 

public class Counting 
{ 
    char[] upper; 
    char[] lower; 
    int[] num; 
    int u1 = 0; 
    int l1= 0; 
    int n1 = 0; 
    File inFile; 

public void ReadFile(String nfile) throws IOException 
{ 
    inFile = new File(nfile); 
    BufferedReader reader = new BufferedReader(new FileReader(inFile)); 
    //... Loop as long as there are input lines. 
    String speech = null; 
    //char[] charArray = null; 

    while ((speech = reader.readLine()) != null) 
    { 
     int slength = speech.length(); 

     //charArray = speech.toCharArray(); 



     AddToArrays(speech, slength); 

    } 

    //... Close reader and writer. 
    reader.close(); // Close to unlock. 
} 

public void AddToArrays(String c, int l) 
{ 
    /*for(int i = 0; i < l; i++) 
    { 
     if((int) c[u1] > 64 && (int) c[u1] < 91) 
     { 
      upper[u1] = c[i]; 
      u1++; 
     } 
     if((int) c[l1] > 96 && (int) c[l1] < 123) 
     { 
      lower[l1] = c[i]; 
      l1++; 
     } 
     if((int) c[n1] > 47 && (int) c[n1] < 58) 
     { 
      num[l1] = c[i]; 
      n1++; 
     } 
    }*/ 
    for(int i = 0; i < l ; i++) 
    { 
     char character = c.charAt(i); 
     int ascii = (int) character; 

     if(ascii > 64 && ascii < 91) 
     { 
      upper[u1] = character; 
      u1++; 
     } 
     if(ascii > 96 && ascii < 123) 
     { 
      lower[l1] = character; 
      l1++; 
     } 
     if(ascii > 47 && ascii < 58) 
     { 
      lower[n1] = character; 
      n1++; 
     } 
    } 

} 

public void DisplayResults(int u, int l, int n) 
{ 
    System.out.println("Upper characters: " + u); 
    System.out.println("lower characters: " + l); 
    System.out.println("Numbers:   " + n); 
} 

public static void main(String[] args) 
{ 
    try 
    { 
     Counting rFile = new Counting(); 
     rFile.ReadFile("Speech.txt"); 
     rFile.DisplayResults(rFile.u1, rFile.l1, rFile.n1); 

    } 
    catch (IOException e) 
    { 
     System.out.println(e.getMessage()); 
    } 

} 

} 

나는 다음과 같은 오류를 얻을. ReadFile (Counting.java:29)

에서 Counting.main (Counting.java:93)

나는 최근에 자바 프로그래밍을 시작했다.

누구든지 도움을 주실 수 있으면 고맙습니다. 당신이이 배열의 요소에 액세스하려고 할 때, 당신이 NullPointerException을 얻을 것이다

char[] upper; 
char[] lower; 

:

 upper[u1] = character; 

     lower[l1] = character; 

당신은 당신의 배열하고이를 초기화하는 코드에서 어떤 곳을 선언하는

답변

1

이러한 배열을 사용하기 전에 초기화해야합니다.

upper = new char[desiredLength]; 
lower = new char[desiredLength]; 
+0

안녕하세요, 빠른 답장을 보내 주셔서 감사합니다. 나는 그것을 시도했다. 정확히 어디에 넣어야할지 모르겠다. 나는 AddToArray 기능에 넣어했지만, 나는 오류 얻을 : 0 Counting.AddToArrays에서 \t (Counting.java:70) Counting.ReadFile에서 \t (계수 : 스레드 "주요"java.lang.ArrayIndexOutOfBoundsException에서 예외 .java : 30) \t at Counting.main (Counting.java:99) – loktd

+0

@loktd 선언을 사용하여 초기화 할 수 있습니다. char upper = new char [desiredLength]; 또한 IndexOutOfBoundException은 배열 크기가 액세스하려는 인덱스보다 작음을 나타냅니다. –

+0

오 감사합니다. 나는 연설의 정확한 문자를 몰랐기 때문에, 나는 desiredLength에 무엇을 사용해야할지 몰랐습니다. – loktd

0
public long ReadFile(String sfile) throws IOException 
    { 
     inFile = new File(sfile); 
     BufferedReader reader = new BufferedReader(new FileReader(inFile)); 
     //... Loop as long as there are input lines. 
     String speach = null; 
     while ((speach=reader.readLine()) != null) 
     { 

      System.out.println(speach); 

     } 

     while ((speach = reader.readLine()) != null) 
     { 
      int slength = speach.length(); 

      //charArray = speach.toCharArray(); 



      AddToArrays(speach, slength); 

     } 
     //... Close reader and writer. 
     reader.close(); // Close to unlock. 
     return inFile.length(); 

    } 
+0

조금 설명 할 수 있습니까? – Miki

관련 문제