【问题标题】:Cannot Find Symbol Error with event handler使用事件处理程序找不到符号错误
【发布时间】:2015-07-10 16:32:30
【问题描述】:

我在尝试正确初始化变量时遇到问题。早些时候我得到了一个数字格式异常,因为我正在解析一个空文本字段内的整数。现在我创建了一个 if 语句,它首先检查该字段是否为空,然后解析其中的一个整数。我现在遇到的问题是我的事件处理程序无法识别该变量,因为它位于 if 语句中。我尝试在 if 语句之外声明它,但这也不起作用。有什么提示可以为我指明正确的方向吗?这是我的代码:

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 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");
      btShuffle.setOnAction(
            e -> {
               Collections.shuffle(deck);
            });
      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(2));
      center.getChildren().add(card3);

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

      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);
      }

      if(tfExpress.getText() != null && tfExpress.getText().equals(""))
      {
         int express = Integer.parseInt(str);
      }

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

      Button btVerify = new Button("Verify");
      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");
         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);
   }
}

【问题讨论】:

    标签: java if-statement scope initialization parseint


    【解决方案1】:

    如果str 为空是您的代码可接受的行为,您需要为express 定义一个默认值(如果是这种情况)。例如,如果默认值为-1,您会这样做:

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

    然后,您应该相应地处理-1 的情况。

    你需要像这样初始化express,所以它实际上是final的,可以在lambda表达式中使用。

    【讨论】:

    • 与我在下面发布的问题相同。 “错误:从 lambda 表达式引用的局部变量必须是最终的或有效的最终”。
    • 非常感谢!那么为什么认为这个符号在我的代码中更有效呢?我很感兴趣。
    • @JohnDoe 既然你已经做过String str = tfExpress.getText(),你可以直接测试str。我认为它看起来更干净,因为它更短。另外我认为当文本与"" 不同时,您的意思是if 条件为true,但您在逻辑中将其反转。
    • @JohnDoe 很高兴为您提供帮助。如果可行,请考虑将正确答案之一标记为accepted
    【解决方案2】:

    而不是

    if(tfExpress.getText() != null && tfExpress.getText().equals(""))
    {
         int express = Integer.parseInt(str);
    }
    

    试试

    final int express = (tfExpress.getText() != null && !tfExpress.getText().equals("")) : Integer.parseInt(str) : 0;
    

    【讨论】:

    • 嘿,这是我以前尝试过的。它告诉我“错误:从 lambda 表达式引用的局部变量必须是最终的或有效的最终”
    • 谢谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2014-08-19
    相关资源
    最近更新 更多