[英]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
語句是完全沒有必要的,因為您的if
有return
。 如果你的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.