2016-05-04 78 views
0

クラスプロジェクト用の正規表現パーサーを作成しようとしていますが、問題が発生しました。修正方法がわかりません。カッコで囲まれたグループが見つかるたびに、ArrayListにプレースホルダを追加して、Stringからグループを取得できるようにする予定です。問題は、このArrayListに追加しようとするたびにNullPointerExceptionをスローすることです。ArrayListに追加するときにNullPointerExceptionが発生する

public Segment(String value, boolean capture) throws ParseException { 
    values = new ArrayList<>(); 
    parse(value); 
    minimum = 1; 
    maximum = 1; 
    matchNot = false; 
    captureGroup = capture; 
    if (capture) { 
     RegexGUI.input.groups.add(""); //error occurs on this line 
    } 
} 

RegexGUI.inputがのコンストラクタはここにある、Regexの関連するインスタンスを指していること:

public Regex(String value) throws ParseException { 
    this.value = value; 
    segments = new ArrayList<>(); 
    groups = new ArrayList<>(); 
    anchorStart = false; 
    anchorEnd = false; 
    tokenize(value, true, false); 
} 

あなたが見ることができるように、groupsは明らかである。こここれが発生Segmentコンストラクタは、ありますコンストラクタで初期化されます。また、Segmentコンストラクタは、Regexクラスのtokenize()メソッドでのみ呼び出され、そのメソッドはRegexコンストラクタによってのみ呼び出されるため、問題が単にgroupsが初期化されていないことがわかります。

全体のスタックトレースはここにある:これは、スタックトレースで述べactionPerformed()のコードの行である

segments.add(new Segment(value.substring(0, value.indexOf(")")+1), true)); 

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at regexparser.Segment.<init>(Segment.java:39) 
    at regexparser.Regex.tokenize(Regex.java:57) 
    at regexparser.Regex.<init>(Regex.java:27) 
    at regexparser.RegexGUI.actionPerformed(RegexGUI.java:80) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6535) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
    at java.awt.Component.processEvent(Component.java:6300) 
    at java.awt.Container.processEvent(Container.java:2236) 
    at java.awt.Component.dispatchEventImpl(Component.java:4891) 
    at java.awt.Container.dispatchEventImpl(Container.java:2294) 
    at java.awt.Component.dispatchEvent(Component.java:4713) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
    at java.awt.Container.dispatchEventImpl(Container.java:2280) 
    at java.awt.Window.dispatchEventImpl(Window.java:2750) 
    at java.awt.Component.dispatchEvent(Component.java:4713) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 
    at java.awt.EventQueue$4.run(EventQueue.java:731) 
    at java.awt.EventQueue$4.run(EventQueue.java:729) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

これはスタックトレースで述べtokenize()のコードの行です。

input = new Regex(regexInput.getText()); 

これが必要かどうかわかりません

Regexクラス:

String value; 
ArrayList<Segment> segments; 
ArrayList<String> groups; 
boolean anchorStart; 
boolean anchorEnd; 

Segmentクラス:

ArrayList<String> values; 
int minimum; 
int maximum; 
boolean matchNot; 
boolean captureGroup; 

final static String UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
final static String LOWERCASE = "abcdefghijklmnopqrstuvwxyz"; 
final static String DIGITS = ""; 
final static String[] SETS = {UPPERCASE, LOWERCASE, DIGITS}; 
final static String WORD = UPPERCASE + LOWERCASE + DIGITS + "_"; 

final static String WHITESPACE = " \r\n\t\f"; 

RegexGUIクラス:

Container contentPane; 
JPanel panel; 
GridBagLayout gridbag; 
GridBagConstraints c; 
JLabel regexPrompt, stringPrompt, result; 
JTextField regexInput; 
JTextArea stringInput; 
JButton test; 
static Regex input; 
boolean match; 
投稿したりないが、ここでは、各クラスのための私のインスタンスとクラス変数ですために進

私はあなたに私が与えることができる助けに感謝します。私はこの例外を引き起こしているかもしれないものを調べようとしましたが、唯一の答えはgroupsが初期化されていないことです。 groupsが初期化される前にSegmentコンストラクタが呼び出される可能性がある方法を見つけようとしてコードを調べましたが、可能な方法はありません。

+0

@ 3kings私はすでにその投稿を読んでいます。私はまだ何がうまくいかないのか分からなかった。 –

+0

それからもう一度読む:)。あなたは何が 'ヌル'で、なぜデバッグするのかを知る必要があります。 – Tunaki

+0

"RegexGUI.input.groups.add(" ");" RegexGui.inputはどこでインスタンス化されていますか?そうであれば、そのグループフィールドはどこでインスタンス化されますか? – FredK

答えて

5

あなたのコードでは、この行のキャッチ22

です:

input = new Regex(regexInput.getText());

は、それを割り当て、その後、正規表現オブジェクトを作成します。

しかし、Regexインスタンスを作成している間は、Regex.inputインスタンスを実際に終了する前に参照しようとします。したがって、実際には割り当てられておらず、実際にはまだnullです。

オブジェクトを作成した後に、tokenizeメソッドを呼び出すことが合理的に迅速に行われます。したがって、コンストラクタからtokenizeコールを取り除いてから、次のように実行してください。

input = new Regex(regexInput.getText()); 
input.tokenize(...); 
+0

ありがとうございました!コンストラクタの外側で 'tokenize()'を呼び出すとうまくいきます。唯一の問題は、代わりにStackOverflowErrorを投げていることですが、それはコード内の別の場所から来ているので、自分で解決できるかどうか確認します。 –

+0

うれしいことに、次のエラーで喜んでデバッグ! – cowls

+0

トークン化が正規表現を構築するために不可欠な部分である場合、それをコンストラクタに残すことをお勧めします。代わりに、空の文字列をSegment ctor内のグループに追加しないでください。tokenize( 'if(...)this.groups.add(" ")')@cowls ... – Aconcagua

関連する問題