2016-07-30 8 views
0

ich die folgende Stacktrace bekommen, wenn man den Befehl: lein run "this is the other different thing" "this,different,other"Wo ist mein Null-Zeiger-Ausnahme - Clojure Ausgabe

Stacktrace

Exception in thread "main" java.lang.NullPointerException, compiling:(/private/var/folders/y8/6lt_81xn47d4n2k641z52rg00000gn/T/form-init8328218573408236617.clj:1:125) 
    at clojure.lang.Compiler.load(Compiler.java:7391) 
    at clojure.lang.Compiler.loadFile(Compiler.java:7317) 
    at clojure.main$load_script.invokeStatic(main.clj:275) 
    at clojure.main$init_opt.invokeStatic(main.clj:277) 
    at clojure.main$init_opt.invoke(main.clj:277) 
    at clojure.main$initialize.invokeStatic(main.clj:308) 
    at clojure.main$null_opt.invokeStatic(main.clj:342) 
    at clojure.main$null_opt.invoke(main.clj:339) 
    at clojure.main$main.invokeStatic(main.clj:421) 
    at clojure.main$main.doInvoke(main.clj:384) 
    at clojure.lang.RestFn.invoke(RestFn.java:421) 
    at clojure.lang.Var.invoke(Var.java:383) 
    at clojure.lang.AFn.applyToHelper(AFn.java:156) 
    at clojure.lang.Var.applyTo(Var.java:700) 
    at clojure.main.main(main.java:37) 
Caused by: java.lang.NullPointerException 
    at clojure.string$replace.invokeStatic(string.clj:101) 
    at clojure.string$replace.invoke(string.clj:75) 
    at redact.core$redact_doc.invokeStatic(core.clj:12) 
    at redact.core$redact_doc.invoke(core.clj:7) 
    at redact.core$_main.invokeStatic(core.clj:54) 
    at redact.core$_main.doInvoke(core.clj:50) 
    at clojure.lang.RestFn.invoke(RestFn.java:421) 
    at clojure.lang.Var.invoke(Var.java:383) 
    at user$eval5.invokeStatic(form-init8328218573408236617.clj:1) 
    at user$eval5.invoke(form-init8328218573408236617.clj:1) 
    at clojure.lang.Compiler.eval(Compiler.java:6927) 
    at clojure.lang.Compiler.eval(Compiler.java:6917) 
    at clojure.lang.Compiler.load(Compiler.java:7379) 
    ... 14 more 

Und hier ist mein Code:

(ns redact.core 
    (:gen-class) 
    (:require [clojure.java.io :as io] 
      [clojure.string :as str] 
)) 

(defn redact-doc 
    ;; Reads the file line by line and redacts all the matched words 
    ([target stoplist] 
    (if (empty? stoplist) 
    (str/trim target) 
    (redact-doc (str/replace target (re-pattern (str "\\s(" (first stoplist) ")(\\s|$)")) " REDACTED ") (rest stoplist)))) 
) 

(defn get-target-text 
    ;; Takes a vector of args and returns a String of a text file or and sentances 
    ([args] (get-target-text args "")) 
    ([args result] 
    (if (empty? args) 
    result 
    (get-target-text (rest args) (if (boolean (re-find #"(.+\.[^csv\s])" (first args))) 
            (str result (slurp (first args))) 
            (if (not (boolean (re-find #"(.+\.csv|.+,.+)" (first args)))) 
             (if (boolean (re-find #"\s" (str/trim (first args)))) 
             (str result (first args) " "))))))) 
) 

(defn read-csv 
    ;; Takes in a filename and returns a vector of the csv values 
    [file-name] 
    (str/split (with-open [rdr (io/reader file-name)] 
    (doall (reduce str (line-seq rdr)))) #",")) 

(defn gen-stoplist 
    ;; Generates the stoplist for words to be redacted 
    ([args] (gen-stoplist args [])) 
    ([args stoplist] 
    (if (empty? args) 
    stoplist 
    (gen-stoplist (rest args) (if (boolean (re-find #"(.+\.csv)" (first args))) 
           (into [] (concat stoplist (read-csv (first args)))) 
           (if (boolean (re-find #"(.+\..[^csv\s])" (first args))) 
            stoplist 
            (if (boolean (re-find #"(.*,.*)" (first args))) 
            (into [] (concat stoplist (str/split (first args) #","))) 
            (if (boolean (re-find #"(\s)" (str/trim (first args)))) 
             stoplist 
             (into [] (concat stoplist [(first args)])))))))))) 

(defn -main 
    ([& args] 
    (def stoplist (gen-stoplist args)) 
    (def target-text (get-target-text args)) 
    (println (redact-doc target-text stoplist))) 
) 

I Ich habe dabei gestarrt, um herauszufinden, was das Problem verursacht. Ich habe alle Methoden unabhängig auf der REPL getestet und sie scheinen alle zu funktionieren, aber die (-main) -Methode wirft eine Nullzeigerausnahme auf den str/replace-Aufruf .... einfach nicht sicher warum. Jede Hilfe, die Sie geben können, wird sehr geschätzt. Vielen Dank!

+0

Ziel-Text in Ihrer Haupt-Methode null ist. '(get-target-text [" das ist die andere Sache "" diese, andere, andere "]) gibt nil zurück. –

Antwort

1

Es gibt ein bisschen über Ihren Code, der nicht wirklich korrekt ist. Meine Vermutung ist , dass unser Aufruf diesen Aufruf, weil Sie eine Funktion aufrufen, die einen Wert erwartet und ein Nil erhalten wird - meine Schätzung wäre eine der Zeichenfolge Funktionen.

Ihre Funktionsdefinitionen sind nicht ganz richtig. Wenn Ihre Funktion nur eine einzelne 'Signatur' hat, brauchen Sie die zusätzlichen Klammern nicht. Sie sollten auch verwenden lassen Bindings innen statt def. z.B.

(defn -main 
    [& args] 
    (let [stoplist (gen-stoplist args) 
      target-text (get-target-text args))] 
     (println (redact-doc target-text stoplist))) 

Ihr Code übergibt nicht, was Sie denken, um gen-stoplist oder get-target-text. I vermute der Nullzeiger ist wegen des Aufrufs an str/trim übergeben wird ein anstelle einer Zeichenfolge.

Mein Vorschlag wäre, eine repl zu öffnen und mit ihm interagieren einige println in Ihre Funktionen zu schauen, was in analysiert wird immer.