2015-05-01 22 views
-1

我的代碼運行但當用戶在文本字段中輸入文本時,我得到一個Out Of Bounds Exception。我認爲這與這行代碼有關,我給了空框的值:int express = (str != null && !"".equals(str)) ? Integer.parseInt(str) : -1;,但我不確定。有沒有不同的方式來做到這一點?下面是代碼:用戶不能輸入文本,索引超出範圍

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.scene.image.Image; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 
import javafx.scene.image.ImageView; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.LinkedList; 
import java.util.concurrent.atomic.AtomicReference; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) { 


     ArrayList<Integer> deck; 
     deck = new ArrayList<>(); 
     int i = 1; 
     while(i < 52){ 
     deck.add(i); 
     i++; 
     } 
     final AtomicReference<String> result = new AtomicReference<>("go."); 

     Collections.shuffle(deck); 

     BorderPane pane = new BorderPane(); 

     HBox top = new HBox(10); 
     Label display = new Label(result.toString()); 
     Button btShuffle = new Button("Shuffle"); 

     top.getChildren().add(display); 
     top.getChildren().add(btShuffle); 


     HBox center = new HBox(10); 
     Card card1 = new Card(deck.get(0)); 
     center.getChildren().add(card1); 

     Card card2 = new Card(deck.get(1)); 
     center.getChildren().add(card2); 

     Card card3 = new Card(deck.get(12)); 
     center.getChildren().add(card3); 

     Card card4 = new Card(deck.get(14)); 
     center.getChildren().add(card4); 



     btShuffle.setOnAction(
      e -> { 
       Collections.shuffle(deck); 
       center.getChildren().clear();  
       center.getChildren().add(new Card(deck.get(0))); 
       center.getChildren().add(new Card(deck.get(1))); 
       center.getChildren().add(new Card(deck.get(2))); 
       center.getChildren().add(new Card(deck.get(3))); 

      }); 





     HBox bottom = new HBox(10); 
     Label expression = new Label("Please Enter the expression: "); 

     TextField tfExpress = new TextField(); 
     LinkedList<Object> expInput = new LinkedList<>(); 
     ArrayList<Character> signs = new ArrayList<>(); 
     signs.add('/'); 
     signs.add('+'); 
     signs.add('('); 
     signs.add(')'); 
     signs.add('-'); 
     signs.add('^'); 
     signs.add('*'); 
     signs.add('%'); 
     String str = tfExpress.getText(); 
     char tempStor[] = str.toCharArray(); 
     for(char c: tempStor){ 
     expInput.add(c); 
     } 

     int express = (str != null && !"".equals(str)) ? Integer.parseInt(str) : -1;  



     expInput.removeIf(p-> p.equals(signs)); 

     Button btVerify = new Button("Verify"); 
     bottom.getChildren().add(expression); 
     bottom.getChildren().add(tfExpress); 
     bottom.getChildren().add(btVerify); 

     btVerify.setOnAction(
      (ActionEvent e) -> { 
       if(card1.CardValue() == (int)expInput.get(0) 
       && card2.CardValue() == (int)expInput.get(1) 
       && card3.CardValue() == (int)expInput.get(2) 
       && card4.CardValue() == (int)expInput.get(3)){ 
        if(express == 24){ 
        result.set("Correct"); 
        } 
        else 
        result.set("Incorrect"); 

       } 
       else 
        result.set("The numbers in the expression don't " 
        + "match the numbers in the set."); 
      }); 

     pane.setTop(top); 
     pane.setCenter(center); 
     pane.setBottom(bottom); 

     Scene scene = new Scene(pane); 
     primaryStage.setTitle("24 card game"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public class Card extends Pane { 
     public int cardVal; 
     Card(int card){ 
     Image cardImage; 
     cardImage = new Image("card/"+ card +".png"); 
     getChildren().add(new ImageView(cardImage)); 
     cardVal = card; 

     } 

     public int CardValue(){ 
     int card = 0; 

     if(cardVal <= 13){ 
      card = cardVal; 
     } 
     else if(cardVal > 13 && cardVal <= 26){ 
      card = cardVal - 13; 
     } 
     else if(cardVal > 26 && cardVal <= 39){ 
      card = cardVal - 26; 
     } 
     else if(cardVal > 39 && cardVal <= 52){ 
      card = cardVal - 39; 
     } 


     return card; 
     } 




    } 



    public static void main(String[] args) { 
     launch(args); 
    } 

} 

這裏是個例外:

Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
    at java.util.LinkedList.checkElementIndex(LinkedList.java:555) 
    at java.util.LinkedList.get(LinkedList.java:476) 
    at Main.lambda$start$2(Main.java:109) 
    at Main$$Lambda$74/1787879.handle(Unknown Source) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
    at javafx.event.Event.fireEvent(Event.java:198) 
    at javafx.scene.Node.fireEvent(Node.java:8216) 
    at javafx.scene.control.Button.fire(Button.java:185) 
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
    at javafx.event.Event.fireEvent(Event.java:198) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3724) 
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3452) 
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1728) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2461) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:348) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:273) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:382) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:553) 
    at com.sun.glass.ui.View.notifyMouse(View.java:925) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102) 
    at com.sun.glass.ui.win.WinApplication$$Lambda$38/2075313.run(Unknown Source) 
    at java.lang.Thread.run(Thread.java:745) 
+0

難道這些錯別字:'卡card3 =新卡(deck.get(12));'和'卡card4 =新卡( deck.get(14));'(我的意思是使用索引'12'和'14')? –

+0

不完全。我只是搞亂了不同的索引。這與我使用的是否有關係?我的洗牌按鈕工作正常。 –

+0

好吧,那並不會造成問題,因爲甲板上有52個物品。所有的神奇數字使代碼有點難以遵循。 –

回答

0

失敗是

btVerify.setOnAction(
     (ActionEvent e) -> { 
      if(card1.CardValue() == (int)expInput.get(0) 

有些線路上面創建一個新的LinkedList所以目前還沒有任何值。這導致了例外。

編輯:作爲對一些評論的回覆。一個可能的解決辦法是這樣的: (沒有進一步的必要重構;))

final 
btVerify.setOnAction(
    (ActionEvent e) -> { 
      LinkedList<Character> expInput = new LinkedList<Character>(); 
      for(char c: tfExpress.getText().toCharArray()){ 
       expInput.add(c); 
      } 

      if(card1.CardValue() == Integer.valueOf(expInput.get(0)) 
       && card2.CardValue() == Integer.valueOf(expInput.get(1)) 
       && card3.CardValue() == Integer.valueOf(expInput.get(2)) 
       && card4.CardValue() == Integer.valueOf(expInput.get(3))){ 
       if(express == 24){ 
        result.set("Correct"); 
       } 
       else 
        result.set("Incorrect"); 

      } 
      else 
       result.set("The numbers in the expression don't " 
          + "match the numbers in the set."); 
     }); 
+0

你提到的那一行的下面幾行是(char c:tempStor){ expInput.add(c); }所以確實鏈表不是空的,除非tempStor []是空的 –

+0

這只是部分正確的,因爲循環永遠不會被執行。 tempStore中的字符是新創建的TextField中的字符,它可能包含零個字符。 –

+0

我的例外情況是說我的清單大小爲0?那麼我可以怎樣擴展這個? @LalitRao –