簡體   English   中英

掃描儀返回錯誤的 int 值

[英]Scanner returns wrong int value

Java新手在這里。

我做了一個函數來簡單地返回用戶通過掃描儀給出的整數。 目標是在用戶沒有輸入整數時避免錯誤,通知他們並讓他們重試。

如果第一次嘗試時該值是整數,它工作正常,但如果我輸入一個字符(得到一個錯誤,函數“重新啟動”),那么該函數將返回“默認”零。 嘗試了不同的東西,但我絕對不明白這里的邏輯。

這是代碼:

  //Initialize the Scanner earlier
  public static Scanner keyBoardRead = new Scanner(System.in);

  public static int intEntry()
  {
  int entry;
  keyBoardRead = new Scanner(System.in);
  if (keyBoardRead.hasNextInt() == true)
    {
    entry = keyBoardRead.nextInt();
    System.out.println("entry variable = "+entry);
    // Here the correct entry prints but doesn't seem to return
    return entry;
    }
  else
   {
    System.out.println("Invalid entry.\n");
    intEntry();
   }
  return 0;
  }

示例輸出:

z
Invalid entry.

2
entry variable = 2

// Function exits and output = 0 (?!)

感謝您的幫助,請批評我的代碼:)

我修改了你的代碼,因為它有一些缺陷:

public static Scanner keyBoardRead = new Scanner(System.in);

public static int intEntry()
{
    int entry;
    if (keyBoardRead.hasNextInt())
    {
        entry = keyBoardRead.nextInt();
        System.out.println("entry variable = "+entry);
        // Here the correct entry prints but doesn't seem to return
        return entry;
    }
    keyBoardRead.next();
    System.out.println("Invalid entry.\n");
    return intEntry();
}

以下是更改說明:

  • 您不需要在每次調用該方法時重新聲明new Scanner(System.in) ,您聲明您最初將其聲明為類字段,因此每次都應該可以從方法內部訪問它。
  • 一般來說,您的else語句是完全沒有必要的,因為您的ifreturn 如果你的if被執行,無論如何它都不會輸入代碼。
  • 您需要使用return intEntry()intEntry() return值,因為目前您只是丟棄return值,並且如果else執行一次,則無條件地返回0
  • 如果輸入了無效條目,您需要使用keyBoardRead.next()以移動到下一個值並丟棄先前輸入的結果。 如果您希望丟棄整行,您也可以使用keyBoardRead.nextLine()代替。
  • 在布爾值上使用== true是多余的,因為您可以直接檢查布爾值,因此if (keyBoardRead.hasNextInt())而不是if (keyBoardRead.hasNextInt() == true) 感謝@Joop Eggen 捕捉到它。

示例運行:

hi
Invalid entry.

wrong
Invalid entry.

entries
Invalid entry.

55
entry variable = 55

注意:輸出中有很多空格,因為您使用了println並且還在打印中使用了\\n所以它會移動到下一行兩次

此外,您可以輕松地為此解決方案創建一個變體,該變體使用while循環而不是遞歸,這可能是一種更好的方法,因此您不可能遇到堆棧溢出(並且通常更易於閱讀),但我保留了遞歸以使其與您的解決方案相似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM