This calculates the number of occurrences of each symbol in a string array.

I want to find some places in this multithreading code which could lead to a NullPointerException or other exceptions or vulnerabilities.

public class StringCount extends RecursiveTask<Map<Character, Integer>> {
    private int UNIT_SIZE = 1;
    private String[] values;
    private int startPos, endPos;

    public StringCount(String[] values) {
        this(values, 0, values.length);
    }

    public StringCount(String[] values, int startPos, int endPos) {
        this.values = values;
        this.startPos = startPos;
        this.endPos = endPos;
    }

    protected Map<Character, Integer> compute() {
        final int currentSize = endPos - startPos;
        if (currentSize <= UNIT_SIZE) {
            return computeSum();
        }
        else {
            int center = currentSize / 2;
            int leftEnd = startPos + center;
            StringCount leftSum = new StringCount(values, startPos, leftEnd);
            leftSum.fork();
            int rightStart = startPos + center;
            StringCount rightSum = new StringCount(values, rightStart, endPos);
            Map<Character, Integer> map = rightSum.compute();
            Map<Character, Integer> map1 = leftSum.join();
            for (Character character : map1.keySet()) {
                if (!map.containsKey(character))
                    map.put(character, 0);
                map.put(character, map1.get(character) + map.get(character));
            }
            return map;
        }
    }

    private Map<Character, Integer> computeSum() {
        Map<Character, Integer> map = new HashMap<>();
        for (int i = startPos; i < endPos; i++) {
            if (values[i] == null) break;
            for (int j = 0; j < values[i].length(); j++) {
                Character c = values[i].toLowerCase().charAt(j);
                if (!map.containsKey(c)) map.put(c, 0);
                map.put(c, map.get(c) + 1);
            }
        }
        if (map.size() == 0)map.put(' ', 0);
        return map;
    }

    public static void main(String[] args) {
        String[] stringArray = new String[100];
        for (int i = 0; i < stringArray.length; i++) {
            stringArray[i] = "ldlihnvlCdnfcs;dgnhreieue tr;srdrgy    rfguhy.";
        }
        ForkJoinPool pool = new ForkJoinPool();
        StringCount calculator = new StringCount(stringArray);
        System.out.println(pool.invoke(calculator));
    }
}
New contributor
Vadim is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.

Your Answer

Vadim is a new contributor. Be nice, and check out our Code of Conduct.

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Browse other questions tagged or ask your own question.