dalv_happy
@dalv_happy

Как устранить Ошибку Exception in thread «main»?

Текст ошибки:
Exception in thread "main" java.lang.NullPointerException
    at TakeTheToken.main(TakeTheToken.java:26)

Пишу парсер кода с++, который разбивает всё на лексемы, но чёрт, не могу записать информацию в объект, что делать?

26 строка:
System.out.print(elements[0].token_type);
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class TakeTheToken {
 
    public String token;
    public String token_type;
 
 
    public TakeTheToken(String token, String token_type) {
        this.token = token;
        this.token_type = token_type;       
    }
 
    public static TakeTheToken [] elements;
 
    public static void main(String[] args) throws IOException {
        String str = Open();
        System.out.println(str);
        addToken(str);  
        System.out.print(elements[0].token_type);
    }
 
    public static String Open() throws IOException {
        File f = new File("D:\\1.txt");
        FileReader fr = null;
        try {
            fr = new FileReader(f);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        @SuppressWarnings("resource")
        BufferedReader br = new BufferedReader(fr);
        StringBuffer sb = new StringBuffer();
        String eachLine = null;
        try {
            eachLine = br.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        while (eachLine != null) {
            sb.append(eachLine);
            sb.append("\n");
            try {
                eachLine = br.readLine();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
 
 
 
        return sb.toString().replaceAll("[\\n]", "");
 
    }
 
 
    public static void addToken(String str) { 
        char[] type = str.toCharArray();
        int i = 0;
        String word = "", number = "", charius = "";
        while (i < str.length()) {
            String typeChar = Character.toString(type[i]);
            if (RegExp(typeChar) == 1) {//Если буквы        
 
                while (RegExp(typeChar) == 1) {                 
                    word += typeChar;                   
                    i++;
                    if (i < str.length()) {
                        typeChar = String.valueOf(type[i]);
                    } else break;               
                }
                
                typeString(word, 1);
                System.out.print(word);
                word = "";
 
            } 
 
            if (RegExp(typeChar) == 2) {//Если цифры
                while (RegExp(typeChar) == 2) {                 
                    number += typeChar;                 
                    i++;
                    if (i < str.length()) {
                        typeChar = String.valueOf(type[i]);
                    } else break;
                }
 
 
                System.out.print(number);
                number = "";
 
            } 
 
            if (RegExp(typeChar) == 3) { 
                while (type[i] != ' ' && RegExp(typeChar) == 3) {                   
                    charius += typeChar;
                    if (i+1 < str.length()) {
                        typeChar = String.valueOf(type[i+1]);
                    } else break;
                    if (RegExp(typeChar) == 3) {
                        i++;
                        if (i < str.length()) {
                            typeChar = String.valueOf(type[i]);
                        }
                    }
                }
 
 
                System.out.print(charius);
                charius = "";
            }
 
            i++;
        }   
 
 
    }
 
    public int c = 0;
 
    public static void typeString(String str, int type) {       
        elements = new TakeTheToken[24];
        if (type == 1) {
            String[] s = {"int", "double", "float", "if", "else", "while", "for" };
            for (int i = 0; i < s.length; i++) {
                if (str.equals(s[i])) {                 
                    elements[i] = new TakeTheToken(str, "keywords");
                    i++;
                }
            }
        }
    }
 
 
    public static int RegExp(String str) {
        Pattern p = Pattern.compile("[a-zA-Z]");
        Matcher m = p.matcher(str);
 
        if (m.matches()) {
            return 1;
        }
 
 
        p = Pattern.compile("[0-9]");
        m = p.matcher(str);
 
        if (m.matches()) {
            return 2;
        } else return 3;
 
    }
 
}


Дебажил, элементы заносит верно, но когда доходит до 26 строки рушится и выдаёт ошибку.
Может объект криво создаю или заполняю?
  • Вопрос задан
  • 2351 просмотр
Решения вопроса 2
@j_wayne
У вас в elements[0], очевидно - null. Выведите System.out.println(Arrays.asList(elements)) да посмотрите, или дебаггером. Проблема очень специфическая и связана только с вашим кодом. Учитесь отлаживать.
Ответ написан
Комментировать
dalv_happy
@dalv_happy Автор вопроса
В общем в функции typeString я каждый раз пересоздаю объект, поэтому каждый раз он null
elements = new TakeTheToken[24];
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы